forked from github/server
test giving men to other faction.
refactor give_men to return a message. major milestone reached: 200 unit tests.
This commit is contained in:
parent
2a61dc4d11
commit
33a5e0aa9d
44
src/give.c
44
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue