From 33a5e0aa9d64e2dbd907932cce11c7406b286144 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 10 Dec 2014 21:17:00 +0100 Subject: [PATCH] test giving men to other faction. refactor give_men to return a message. major milestone reached: 200 unit tests. --- src/give.c | 44 ++++++++++++++++++++++-------------- src/give.h | 3 ++- src/give.test.c | 52 +++++++++++++++++++++++++++++++++++++++++-- src/kernel/messages.c | 24 +++++++++++--------- src/kernel/messages.h | 4 ++-- 5 files changed, 95 insertions(+), 32 deletions(-) diff --git a/src/give.c b/src/give.c index ac928ab9b..8de3d1376 100644 --- a/src/give.c +++ b/src/give.c @@ -210,16 +210,15 @@ struct order *ord) return 0; } -void give_men(int n, unit * u, unit * u2, struct order *ord) +message * give_men(int n, unit * u, unit * u2, struct order *ord) { ship *sh; int k = 0; int error = 0; if (u2 && u->faction != u2->faction && u->faction->age < GiveRestriction()) { - ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "giverestriction", - "turns", GiveRestriction())); - return; + return msg_feedback(u, ord, "giverestriction", + "turns", GiveRestriction()); } else if (u == u2) { error = 10; @@ -246,9 +245,8 @@ void give_men(int n, unit * u, unit * u2, struct order *ord) error = 75; } else if (u2 && !ucontact(u2, u)) { - ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_no_contact", - "target", u2)); - error = -1; + return msg_feedback(u, ord, "feedback_no_contact", + "target", u2); } else if (u2 && (has_skill(u, SK_MAGIC) || has_skill(u2, SK_MAGIC))) { /* cannot give units to and from magicians */ @@ -367,18 +365,17 @@ void give_men(int n, unit * u, unit * u2, struct order *ord) } } if (error > 0) { - cmistake(u, ord, error, MSG_COMMERCE); + return msg_error(u, ord, error); } else if (!u2) { - ADDMSG(&u->faction->msgs, - msg_message("give_person_peasants", "unit amount", u, n)); + return msg_message("give_person_peasants", "unit amount", u, n); } else if (u2->faction != u->faction) { message *msg = msg_message("give_person", "unit target amount", u, u2, n); - add_message(&u->faction->msgs, msg); add_message(&u2->faction->msgs, msg); - msg_release(msg); + return msg; } + return NULL; } void give_unit(unit * u, unit * u2, order * ord) @@ -411,6 +408,7 @@ void give_unit(unit * u, unit * u2, order * ord) } else if (getunitpeasants) { unit *u3; + message *msg; for (u3 = r->units; u3; u3 = u3->next) if (u3->faction == u->faction && u != u3) @@ -428,8 +426,13 @@ void give_unit(unit * u, unit * u2, order * ord) } } } - give_men(u->number, u, NULL, ord); - cmistake(u, ord, 153, MSG_COMMERCE); + msg = give_men(u->number, u, NULL, ord); + if (msg) { + ADDMSG(&u->faction->msgs, msg); + } + else { + cmistake(u, ord, 153, MSG_COMMERCE); + } } else { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_unit_not_found", @@ -669,8 +672,11 @@ void give_cmd(unit * u, order * ord) msg_feedback(u, ord, "race_noregroup", "race", u_race(u))); } else { - n = u->number; - give_men(n, u, u2, ord); + message * msg; + msg = give_men(u->number, u, u2, ord); + if (msg) { + ADDMSG(&u->faction->msgs, msg); + } } } else if (!(u_race(u)->ec_flags & GIVEITEM) && u2 != NULL) { @@ -717,12 +723,16 @@ void give_cmd(unit * u, order * ord) } if (isparam(s, u->faction->locale, P_PERSON)) { + message * msg; if (!(u_race(u)->ec_flags & GIVEPERSON)) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "race_noregroup", "race", u_race(u))); return; } - give_men(n, u, u2, ord); + msg = give_men(u->number, u, u2, ord); + if (msg) { + ADDMSG(&u->faction->msgs, msg); + } return; } diff --git a/src/give.h b/src/give.h index c392ecde8..90c0b2702 100644 --- a/src/give.h +++ b/src/give.h @@ -19,10 +19,11 @@ extern "C" { struct item_type; struct order; struct unit; + struct message; int give_item(int want, const struct item_type *itype, struct unit *src, struct unit *dest, struct order *ord); - void give_men(int n, struct unit *u, struct unit *u2, + struct message * give_men(int n, struct unit *u, struct unit *u2, struct order *ord); void give_unit(struct unit *u, struct unit *u2, struct order *ord); void give_cmd(struct unit * u, struct order * ord); diff --git a/src/give.test.c b/src/give.test.c index fa5918fb5..d76ab7e35 100644 --- a/src/give.test.c +++ b/src/give.test.c @@ -41,21 +41,66 @@ static void test_give_men(CuTest * tc) { test_cleanup(); env.f2 = env.f1 = test_create_faction(0); setup_give(&env); - give_men(1, env.src, env.dst, NULL); + CuAssertPtrEquals(tc, 0, give_men(1, env.src, env.dst, NULL)); CuAssertIntEquals(tc, 2, env.dst->number); CuAssertIntEquals(tc, 0, env.src->number); test_cleanup(); } +static void test_give_men_other_faction(CuTest * tc) { + struct give env; + message * msg; + + test_cleanup(); + env.f1 = test_create_faction(0); + env.f2 = test_create_faction(0); + setup_give(&env); + usetcontact(env.dst, env.src); + msg = give_men(1, env.src, env.dst, NULL); + CuAssertStrEquals(tc, "give_person", (const char *)msg->parameters[0].v); + CuAssertIntEquals(tc, 2, env.dst->number); + CuAssertIntEquals(tc, 0, env.src->number); + test_cleanup(); +} + +static void test_give_men_requires_contact(CuTest * tc) { + struct give env; + message * msg; + + test_cleanup(); + env.f1 = test_create_faction(0); + env.f2 = test_create_faction(0); + setup_give(&env); + msg = give_men(1, env.src, env.dst, NULL); + CuAssertStrEquals(tc, "feedback_no_contact", (const char *)msg->parameters[3].v); + CuAssertIntEquals(tc, 1, env.dst->number); + CuAssertIntEquals(tc, 1, env.src->number); + test_cleanup(); +} + +static void test_give_men_not_to_self(CuTest * tc) { + struct give env; + message * msg; + test_cleanup(); + env.f2 = env.f1 = test_create_faction(0); + setup_give(&env); + msg = give_men(1, env.src, NULL, NULL); + CuAssertStrEquals(tc, "error159", (const char *)msg->parameters[3].v); + CuAssertIntEquals(tc, 1, env.src->number); + test_cleanup(); +} + static void test_give_peasants(CuTest * tc) { struct give env; + message * msg; int peasants; test_cleanup(); env.f2 = env.f1 = test_create_faction(0); setup_give(&env); peasants = env.r->land->peasants; getunitpeasants = 1; - give_men(1, env.src, NULL, NULL); + msg = give_men(1, env.src, NULL, NULL); + CuAssertStrEquals(tc, "give_person_peasants", (const char*)msg->parameters[0].v); CuAssertIntEquals(tc, 0, env.src->number); CuAssertIntEquals(tc, peasants+1, env.r->land->peasants); test_cleanup(); @@ -137,6 +182,9 @@ CuSuite *get_give_suite(void) CuSuite *suite = CuSuiteNew(); SUITE_ADD_TEST(suite, test_give); SUITE_ADD_TEST(suite, test_give_men); + SUITE_ADD_TEST(suite, test_give_men_other_faction); + SUITE_ADD_TEST(suite, test_give_men_requires_contact); + SUITE_ADD_TEST(suite, test_give_men_not_to_self); SUITE_ADD_TEST(suite, test_give_peasants); SUITE_ADD_TEST(suite, test_give_herbs); SUITE_ADD_TEST(suite, test_give_okay); diff --git a/src/kernel/messages.c b/src/kernel/messages.c index d70423251..f7297f832 100644 --- a/src/kernel/messages.c +++ b/src/kernel/messages.c @@ -251,18 +251,22 @@ void addmessage(region * r, faction * f, const char *s, msg_t mtype, int level) caddmessage(r, f, s, mtype, level); } +message * msg_error(const unit * u, struct order *ord, int mno) { + static char msgname[20]; + + if (fval(u->faction, FFL_NPC)) + return 0; + sprintf(msgname, "error%d", mno); + return msg_feedback(u, ord, msgname, ""); +} + message * cmistake(const unit * u, struct order *ord, int mno, int mtype) { - message * result; - static char msgname[20]; - unused_arg(mtype); - - if (fval(u->faction, FFL_NPC)) - return 0; - sprintf(msgname, "error%d", mno); - result = msg_feedback(u, ord, msgname, ""); - ADDMSG(&u->faction->msgs, result); - return result; + message * result; + unused_arg(mtype); + result = msg_error(u, ord, mno); + ADDMSG(&u->faction->msgs, result); + return result; } extern unsigned int new_hashstring(const char *s); diff --git a/src/kernel/messages.h b/src/kernel/messages.h index 5be1a88fb..83c0f2613 100644 --- a/src/kernel/messages.h +++ b/src/kernel/messages.h @@ -55,8 +55,8 @@ extern "C" { #define ADDMSG(msgs, mcreate) { message * m = mcreate; if (m) { assert(m->refcount>=1); add_message(msgs, m); msg_release(m); } } - extern struct message * cmistake(const struct unit *u, struct order *ord, int mno, - int mtype); + struct message * cmistake(const struct unit *u, struct order *ord, int mno, int mtype); + struct message * msg_error(const struct unit * u, struct order *ord, int mno); #ifdef __cplusplus } #endif