Add a test for the happy case of the BUY command.

This commit is contained in:
Enno Rehling 2017-11-04 20:10:05 +01:00
parent 35742e8870
commit a17c8ada71
3 changed files with 56 additions and 3 deletions

View file

@ -170,6 +170,59 @@ static void test_normals_recruit(CuTest * tc) {
test_cleanup();
}
static void test_buy_cmd(CuTest *tc) {
region * r;
unit *u;
building *b;
const resource_type *rt_silver;
const resource_type *rt_luxury;
test_setup();
init_resources();
rt_luxury = get_resourcetype(R_HORSE);
CuAssertPtrNotNull(tc, rt_luxury);
CuAssertPtrNotNull(tc, rt_luxury->itype);
new_luxurytype(rt_luxury->itype, 5);
CuAssertPtrNotNull(tc, rt_luxury->ltype);
rt_silver = get_resourcetype(R_SILVER);
CuAssertPtrNotNull(tc, rt_silver);
CuAssertPtrNotNull(tc, rt_silver->itype);
r = test_create_region(0, 0, NULL);
fix_demand(r);
CuAssertPtrEquals(tc, rt_luxury->itype, (void *)r_luxury(r));
u = test_create_unit(test_create_faction(NULL), r);
unit_addorder(u, create_order(K_BUY, u->faction->locale, "1 %s", LOC(u->faction->locale, resourcename(rt_luxury, 0))));
set_item(u, rt_silver->itype, 1000);
produce(r);
CuAssertPtrNotNullMsg(tc, "trading requires a castle", test_find_messagetype(u->faction->msgs, "error119"));
test_clear_messages(u->faction);
freset(u, UFL_LONGACTION);
b = test_create_building(r, test_create_buildingtype("castle"));
produce(r);
CuAssertPtrNotNullMsg(tc, "castle must have size >=2", test_find_messagetype(u->faction->msgs, "error119"));
test_clear_messages(u->faction);
freset(u, UFL_LONGACTION);
b->size = 2;
produce(r);
CuAssertPtrEquals(tc, NULL, test_find_messagetype(u->faction->msgs, "error119"));
CuAssertPtrNotNullMsg(tc, "traders need SK_TRADE skill", test_find_messagetype(u->faction->msgs, "error102"));
test_clear_messages(u->faction);
freset(u, UFL_LONGACTION);
/* at last, the happy case: */
set_level(u, SK_TRADE, 1);
produce(r);
CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "buy"));
CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "buyamount"));
CuAssertIntEquals(tc, 1, get_item(u, rt_luxury->itype));
CuAssertIntEquals(tc, 995, get_item(u, rt_silver->itype));
test_cleanup();
}
typedef struct request {
struct request *next;
struct unit *unit;
@ -568,6 +621,7 @@ CuSuite *get_economy_suite(void)
SUITE_ADD_TEST(suite, test_normals_recruit);
SUITE_ADD_TEST(suite, test_heroes_dont_recruit);
SUITE_ADD_TEST(suite, test_tax_cmd);
SUITE_ADD_TEST(suite, test_buy_cmd);
SUITE_ADD_TEST(suite, test_maintain_buildings);
SUITE_ADD_TEST(suite, test_recruit);
return suite;

View file

@ -224,7 +224,7 @@ extern "C" {
/* convenience: */
item *i_change(item ** items, const item_type * it, int delta);
int i_get(const item * i, const item_type * it);
int i_get(const item * items, const item_type * it);
/* creation */
resource_type *rt_get_or_create(const char *name);
@ -300,7 +300,6 @@ extern "C" {
void register_resources(void);
void init_resources(void);
void init_itemtypes(void);
void register_item_give(int(*foo) (struct unit *, struct unit *,
const struct item_type *, int, struct order *), const char *name);

View file

@ -711,7 +711,7 @@ const item_type *r_luxury(const region * r)
{
struct demand *dmd;
if (r->land) {
assert(r->land->demands || !"need to call fix_demands on a region");
assert(r->land->demands || !"need to call fix_demand on a region");
for (dmd = r->land->demands; dmd; dmd = dmd->next) {
if (dmd->value == 0)
return dmd->type->itype;