Merge branch 'test-alliance' of https://github.com/ennorehling/eressea into ennorehling-test-alliance

Conflicts:
	src/util/CMakeLists.txt
This commit is contained in:
Enno Rehling 2016-08-08 08:46:09 +02:00
commit 238a0e22f2
34 changed files with 376 additions and 191 deletions

View File

@ -11,6 +11,7 @@
"settings": { "settings": {
"game.id": 2, "game.id": 2,
"game.name": "Eressea", "game.name": "Eressea",
"orders.default": "work",
"NewbieImmunity": 8, "NewbieImmunity": 8,
"modules.wormholes": true, "modules.wormholes": true,
"entertain.base": 0, "entertain.base": 0,

View File

@ -67,9 +67,5 @@
<text locale="de">ERESSEA 2 BEFEHLE</text> <text locale="de">ERESSEA 2 BEFEHLE</text>
<text locale="en">ERESSEA 2 ORDERS</text> <text locale="en">ERESSEA 2 ORDERS</text>
</string> </string>
<string name="defaultorder">
<text locale="de">ARBEITEN</text>
<text locale="en">WORK</text>
</string>
</strings> </strings>
</eressea> </eressea>

View File

@ -27,6 +27,7 @@
"settings": { "settings": {
"game.id": 3, "game.id": 3,
"game.name": "E3", "game.name": "E3",
"orders.default": "work",
"database.gameid": 7, "database.gameid": 7,
"NewbieImmunity": 4, "NewbieImmunity": 4,
"modules.astralspace": false, "modules.astralspace": false,

View File

@ -59,9 +59,5 @@
<text locale="de">ERESSEA 3 BEFEHLE</text> <text locale="de">ERESSEA 3 BEFEHLE</text>
<text locale="en">ERESSEA 3 ORDERS</text> <text locale="en">ERESSEA 3 ORDERS</text>
</string> </string>
<string name="defaultorder">
<text locale="de">ARBEITEN</text>
<text locale="en">WORK</text>
</string>
</strings> </strings>
</eressea> </eressea>

View File

@ -27,6 +27,7 @@
"settings": { "settings": {
"game.id": 4, "game.id": 4,
"game.name": "Deveron", "game.name": "Deveron",
"orders.default": "work",
"database.gameid": 7, "database.gameid": 7,
"NewbieImmunity": 4, "NewbieImmunity": 4,
"modules.astralspace": false, "modules.astralspace": false,

View File

@ -60,9 +60,5 @@
<text locale="de">ERESSEA 4 BEFEHLE</text> <text locale="de">ERESSEA 4 BEFEHLE</text>
<text locale="en">ERESSEA 4 ORDERS</text> <text locale="en">ERESSEA 4 ORDERS</text>
</string> </string>
<string name="defaultorder">
<text locale="de">ARBEITEN</text>
<text locale="en">WORK</text>
</string>
</strings> </strings>
</eressea> </eressea>

View File

@ -284,10 +284,6 @@
getting it after the second turn, please make one of your units give the getting it after the second turn, please make one of your units give the
order OPTION COMPUTER.</text> order OPTION COMPUTER.</text>
</string> </string>
<string name="defaultorder">
<text locale="de">ARBEITEN</text>
<text locale="en">WORK</text>
</string>
<string name="temple"> <string name="temple">
<text locale="de">Tempel</text> <text locale="de">Tempel</text>
<text locale="en">temple</text> <text locale="en">temple</text>

View File

@ -2318,7 +2318,7 @@ void do_attack(fighter * af)
if (apr > 0) { if (apr > 0) {
/* Wenn die Waffe nachladen muss, oder es sich nicht um einen /* Wenn die Waffe nachladen muss, oder es sich nicht um einen
* Waffen-Angriff handelt, dann gilt der Speed nicht. */ * Waffen-Angriff handelt, dann gilt der Speed nicht. */
/* FIXME allow multiple AT_NATURAL attacks? */ /* TODO: allow multiple AT_NATURAL attacks? */
if (u_race(au)->attack[a].type != AT_STANDARD) if (u_race(au)->attack[a].type != AT_STANDARD)
continue; continue;
else { else {

View File

@ -17,6 +17,7 @@ without prior permission by the authors of Eressea.
#include <kernel/save.h> #include <kernel/save.h>
#include <kernel/version.h> #include <kernel/version.h>
#include <util/gamedata.h>
#include <util/log.h> #include <util/log.h>
#include <storage.h> #include <storage.h>

View File

@ -2,26 +2,34 @@ project(kernel C)
SET(_TEST_FILES SET(_TEST_FILES
alliance.test.c alliance.test.c
build.test.c
config.test.c
group.test.c
faction.test.c
unit.test.c
save.test.c
ship.test.c
spell.test.c
ally.test.c ally.test.c
build.test.c
building.test.c building.test.c
equipment.test.c command.test.c
config.test.c
# connection.test.c
curse.test.c curse.test.c
equipment.test.c
faction.test.c
group.test.c
item.test.c item.test.c
messages.test.c
order.test.c order.test.c
# pathdinder.test.c
plane.test.c
pool.test.c pool.test.c
race.test.c race.test.c
# region.test.c
# resources.test.c
save.test.c
ship.test.c
# skills.test.c
spellbook.test.c spellbook.test.c
curse.test.c spell.test.c
# terrain.test.c
unit.test.c
jsonconf.test.c jsonconf.test.c
messages.test.c # xmlreader.test.c
) )
SET(_FILES SET(_FILES

View File

@ -277,9 +277,25 @@ static void perform_join(void)
} }
} }
static void execute(const struct syntaxtree *syntax, keyword_t kwd)
static syntaxtree * build_syntax(void) {
syntaxtree *slang, *stree = stree_create();
for (slang = stree; slang; slang = slang->next) {
void *leaf = 0;
add_command(&leaf, NULL, LOC(slang->lang, alliance_kwd[ALLIANCE_KICK]), &cmd_kick);
add_command(&leaf, NULL, LOC(slang->lang, alliance_kwd[ALLIANCE_LEAVE]), &cmd_leave);
add_command(&leaf, NULL, LOC(slang->lang, alliance_kwd[ALLIANCE_TRANSFER]), &cmd_transfer);
add_command(&leaf, NULL, LOC(slang->lang, alliance_kwd[ALLIANCE_NEW]), &cmd_new);
add_command(&leaf, NULL, LOC(slang->lang, alliance_kwd[ALLIANCE_INVITE]), &cmd_invite);
add_command(&leaf, NULL, LOC(slang->lang, alliance_kwd[ALLIANCE_JOIN]), &cmd_join);
slang->root = leaf;
}
return stree;
}
static void execute(keyword_t kwd)
{ {
int run = 0; struct syntaxtree *syntax = 0;
region **rp = &regions; region **rp = &regions;
while (*rp) { while (*rp) {
@ -289,12 +305,13 @@ static void execute(const struct syntaxtree *syntax, keyword_t kwd)
unit *u = *up; unit *u = *up;
if (u->number) { if (u->number) {
const struct locale *lang = u->faction->locale; const struct locale *lang = u->faction->locale;
void *root = stree_find(syntax, lang);
order *ord; order *ord;
for (ord = u->orders; ord; ord = ord->next) { for (ord = u->orders; ord; ord = ord->next) {
if (getkeyword(ord) == kwd) { if (getkeyword(ord) == kwd) {
void *root;
if (!syntax) syntax = build_syntax();
root = stree_find(syntax, lang);
do_command(root, u, ord); do_command(root, u, ord);
run = 1;
} }
} }
} }
@ -304,8 +321,8 @@ static void execute(const struct syntaxtree *syntax, keyword_t kwd)
if (*rp == r) if (*rp == r)
rp = &r->next; rp = &r->next;
} }
if (syntax) {
if (run) { stree_free(syntax);
perform_kick(); perform_kick();
perform_leave(); perform_leave();
perform_transfer(); perform_transfer();
@ -314,42 +331,21 @@ static void execute(const struct syntaxtree *syntax, keyword_t kwd)
} }
} }
const char* alliance_kwd[ALLIANCE_MAX] = {
"kick",
"leave",
"command",
"new",
"invite",
"join"
};
void alliance_cmd(void) void alliance_cmd(void)
{ {
static syntaxtree *stree = NULL; execute(K_ALLIANCE);
if (stree == NULL) {
syntaxtree *slang = stree = stree_create();
while (slang) {
void *leaf = 0;
add_command(&leaf, NULL, LOC(slang->lang, "new"), &cmd_new);
add_command(&leaf, NULL, LOC(slang->lang, "invite"), &cmd_invite);
add_command(&leaf, NULL, LOC(slang->lang, "join"), &cmd_join);
add_command(&leaf, NULL, LOC(slang->lang, "kick"), &cmd_kick);
add_command(&leaf, NULL, LOC(slang->lang, "leave"), &cmd_leave);
add_command(&leaf, NULL, LOC(slang->lang, "command"), &cmd_transfer);
slang->root = leaf;
slang = slang->next;
}
}
execute(stree, K_ALLIANCE);
/* some may have been kicked, must remove f->alliance==NULL */ /* some may have been kicked, must remove f->alliance==NULL */
} }
void alliancejoin(void)
{
static syntaxtree *stree = NULL;
if (stree == NULL) {
syntaxtree *slang = stree = stree_create();
while (slang) {
void *leaf = 0;
add_command(&leaf, NULL, LOC(slang->lang, "join"), &cmd_join);
add_command(&slang->root, leaf, LOC(slang->lang, "alliance"), NULL);
slang = slang->next;
}
}
execute(stree, K_ALLIANCE);
}
void setalliance(faction * f, alliance * al) void setalliance(faction * f, alliance * al)
{ {
if (f->alliance == al) if (f->alliance == al)
@ -442,82 +438,6 @@ void alliancevictory(void)
} }
} }
int victorycondition(const alliance * al, const char *name)
{
const char *gems[] =
{ "opal", "diamond", "zaphire", "topaz", "beryl", "agate", "garnet",
"emerald", NULL };
if (strcmp(name, "gems") == 0) {
const char **igem;
for (igem = gems; *igem; ++igem) {
const struct resource_type *rtype = rt_find(*igem);
quicklist *flist = al->members;
int qi;
bool found = false;
assert(rtype);
for (qi = 0; flist && !found; ql_advance(&flist, &qi, 1)) {
faction *f = (faction *)ql_get(flist, 0);
unit *u;
for (u = f->units; u; u = u->nextF) {
if (i_get(u->items, rtype->itype) > 0) {
found = true;
break;
}
}
}
if (!found)
return 0;
}
return 1;
}
else if (strcmp(name, "phoenix") == 0) {
quicklist *flist = al->members;
int qi;
for (qi = 0; flist; ql_advance(&flist, &qi, 1)) {
faction *f = (faction *)ql_get(flist, qi);
if (key_get(f->attribs, atoi36("phnx"))) {
return 1;
}
}
return 0;
}
else if (strcmp(name, "pyramid") == 0) {
/* Logik:
* - if (pyr > last_passed_size && pyr > all_others) {
* pyr->passed->counter++;
* for(all_other_pyrs) {
* pyr->passed->counter=0;
* }
*
* if(pyr->passed->counter >= 3) {
* set(pyr, passed);
* pyr->owner->set_attrib(pyra);
* }
* last_passed_size = pyr->size;
* }
*/
quicklist *flist = al->members;
int qi;
for (qi = 0; flist; ql_advance(&flist, &qi, 1)) {
faction *f = (faction *)ql_get(flist, qi);
if (key_get(f->attribs, atoi36("pyra"))) {
return 1;
}
}
return 0;
}
return -1;
}
void alliance_setname(alliance * self, const char *name) void alliance_setname(alliance * self, const char *name)
{ {
free(self->name); free(self->name);

View File

@ -38,6 +38,7 @@ extern "C" {
ALLIANCE_MAX ALLIANCE_MAX
}; };
extern const char* alliance_kwd[ALLIANCE_MAX];
#define ALF_NON_ALLIED (1<<0) /* this alliance is just a default for a non-allied faction */ #define ALF_NON_ALLIED (1<<0) /* this alliance is just a default for a non-allied faction */
#define ALLY_ENEMY (1<<0) #define ALLY_ENEMY (1<<0)

View File

@ -1,6 +1,9 @@
#include <platform.h> #include <platform.h>
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/faction.h> #include <kernel/faction.h>
#include <kernel/unit.h>
#include <kernel/order.h>
#include <util/base36.h>
#include "alliance.h" #include "alliance.h"
#include <CuTest.h> #include <CuTest.h>
#include <tests.h> #include <tests.h>
@ -83,12 +86,126 @@ static void test_alliance_dead_faction(CuTest *tc) {
test_cleanup(); test_cleanup();
} }
static void test_alliance_cmd(CuTest *tc) {
unit *u1, *u2;
struct region *r;
struct alliance *al;
test_cleanup();
r = test_create_region(0, 0, 0);
u1 = test_create_unit(test_create_faction(0), r);
u2 = test_create_unit(test_create_faction(0), r);
unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_NEW], itoa36(42)));
unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_INVITE], itoa36(u2->faction->no)));
unit_addorder(u2, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_JOIN], itoa36(42)));
CuAssertTrue(tc, is_allied(u1->faction, u1->faction));
CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
alliance_cmd();
al = f_get_alliance(u1->faction);
CuAssertPtrNotNull(tc, al);
CuAssertIntEquals(tc, 42, al->id);
CuAssertPtrNotNull(tc, al->members);
CuAssertPtrEquals(tc, u1->faction, alliance_get_leader(al));
CuAssertPtrEquals(tc, al, findalliance(42));
CuAssertTrue(tc, is_allied(u1->faction, u1->faction));
CuAssertPtrEquals(tc, al, u2->faction->alliance);
test_cleanup();
}
static void test_alliance_cmd_kick(CuTest *tc) {
unit *u1, *u2;
struct region *r;
struct alliance *al;
test_cleanup();
al = makealliance(42, "Hodor");
r = test_create_region(0, 0, 0);
u1 = test_create_unit(test_create_faction(0), r);
u2 = test_create_unit(test_create_faction(0), r);
setalliance(u1->faction, al);
setalliance(u2->faction, al);
unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_KICK], itoa36(u2->faction->no)));
CuAssertTrue(tc, is_allied(u1->faction, u2->faction));
alliance_cmd();
CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
CuAssertPtrEquals(tc, 0, f_get_alliance(u2->faction));
test_cleanup();
}
static void test_alliance_cmd_no_invite(CuTest *tc) {
unit *u1, *u2;
struct region *r;
test_cleanup();
r = test_create_region(0, 0, 0);
u1 = test_create_unit(test_create_faction(0), r);
u2 = test_create_unit(test_create_faction(0), r);
unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_NEW], itoa36(42)));
unit_addorder(u2, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_JOIN], itoa36(42)));
CuAssertTrue(tc, is_allied(u1->faction, u1->faction));
CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
alliance_cmd();
CuAssertPtrNotNull(tc, f_get_alliance(u1->faction));
CuAssertPtrEquals(tc, 0, f_get_alliance(u2->faction));
CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
test_cleanup();
}
static void test_alliance_cmd_leave(CuTest *tc) {
unit *u1, *u2;
struct region *r;
struct alliance *al;
test_cleanup();
al = makealliance(42, "Hodor");
r = test_create_region(0, 0, 0);
u1 = test_create_unit(test_create_faction(0), r);
u2 = test_create_unit(test_create_faction(0), r);
setalliance(u1->faction, al);
setalliance(u2->faction, al);
unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s", alliance_kwd[ALLIANCE_LEAVE]));
CuAssertTrue(tc, is_allied(u1->faction, u2->faction));
alliance_cmd();
CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
test_cleanup();
}
static void test_alliance_cmd_transfer(CuTest *tc) {
unit *u1, *u2;
struct region *r;
struct alliance *al;
test_cleanup();
al = makealliance(42, "Hodor");
r = test_create_region(0, 0, 0);
u1 = test_create_unit(test_create_faction(0), r);
u2 = test_create_unit(test_create_faction(0), r);
setalliance(u1->faction, al);
setalliance(u2->faction, al);
CuAssertPtrEquals(tc, u1->faction, alliance_get_leader(al));
unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_TRANSFER], itoa36(u2->faction->no)));
alliance_cmd();
CuAssertPtrEquals(tc, u2->faction, alliance_get_leader(al));
test_cleanup();
}
CuSuite *get_alliance_suite(void) CuSuite *get_alliance_suite(void)
{ {
CuSuite *suite = CuSuiteNew(); CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_alliance_dead_faction); SUITE_ADD_TEST(suite, test_alliance_dead_faction);
SUITE_ADD_TEST(suite, test_alliance_make); SUITE_ADD_TEST(suite, test_alliance_make);
SUITE_ADD_TEST(suite, test_alliance_join); SUITE_ADD_TEST(suite, test_alliance_join);
SUITE_ADD_TEST(suite, test_alliance_cmd);
SUITE_ADD_TEST(suite, test_alliance_cmd_no_invite);
SUITE_ADD_TEST(suite, test_alliance_cmd_kick);
SUITE_ADD_TEST(suite, test_alliance_cmd_leave);
SUITE_ADD_TEST(suite, test_alliance_cmd_transfer);
return suite; return suite;
} }

View File

@ -39,6 +39,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <util/bsdstring.h> #include <util/bsdstring.h>
#include <util/event.h> #include <util/event.h>
#include <util/functions.h> #include <util/functions.h>
#include <util/gamedata.h>
#include <util/language.h> #include <util/language.h>
#include <util/log.h> #include <util/log.h>
#include <quicklist.h> #include <quicklist.h>

View File

@ -43,6 +43,15 @@ void *stree_find(const syntaxtree * stree, const struct locale *lang)
return NULL; return NULL;
} }
void stree_free(syntaxtree *stree) {
while (stree) {
syntaxtree *snext = stree->next;
freetokens(stree->root);
free(stree);
stree = snext;
}
}
syntaxtree *stree_create(void) syntaxtree *stree_create(void)
{ {
syntaxtree *sroot = NULL; syntaxtree *sroot = NULL;
@ -65,6 +74,7 @@ const char *str, parser fun)
command *cmd = (command *)malloc(sizeof(command)); command *cmd = (command *)malloc(sizeof(command));
variant var; variant var;
assert(str);
cmd->fun = fun; cmd->fun = fun;
cmd->nodes = tnext; cmd->nodes = tnext;
var.v = cmd; var.v = cmd;

View File

@ -32,6 +32,7 @@ extern "C" {
void do_command(const void *troot, struct unit *u, struct order *); void do_command(const void *troot, struct unit *u, struct order *);
struct syntaxtree *stree_create(void); struct syntaxtree *stree_create(void);
void stree_free(struct syntaxtree *);
void *stree_find(const struct syntaxtree *stree, void *stree_find(const struct syntaxtree *stree,
const struct locale *lang); const struct locale *lang);

57
src/kernel/command.test.c Normal file
View File

@ -0,0 +1,57 @@
/*
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
| | Enno Rehling <enno@eressea.de>
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
| (c) 1998 - 2003 | Henning Peters <faroul@beyond.kn-bremen.de>
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
+-------------------+ Stefan Reich <reich@halbling.de>
This program may not be used, modified or distributed
without prior permission by the authors of Eressea.
*/
#include "command.h"
#include "unit.h"
#include "order.h"
#include <CuTest.h>
#include <tests.h>
static void parser_two(const void *nodes, struct unit * u, struct order *ord) {
scale_number(u, 2);
}
static void parser_six(const void *nodes, struct unit * u, struct order *ord) {
scale_number(u, 6);
}
static void test_command(CuTest * tc) {
struct syntaxtree *st;
struct locale * loc;
unit *u;
test_cleanup();
loc = test_create_locale();
st = stree_create();
CuAssertPtrNotNull(tc, st);
CuAssertPtrEquals(tc, loc, (struct locale *)st->lang);
CuAssertPtrEquals(tc, 0, st->root);
CuAssertPtrEquals(tc, 0, st->next);
add_command(&st->root, 0, "two", parser_two);
add_command(&st->root, 0, "six", parser_six);
CuAssertPtrNotNull(tc, st->root);
CuAssertPtrEquals(tc, st->root, stree_find(st, loc));
u = test_create_unit(test_create_faction(0), test_create_region(0, 0, 0));
u->thisorder = create_order(K_ALLIANCE, loc, "two");
do_command(st->root, u, u->thisorder);
CuAssertIntEquals(tc, u->number, 2);
stree_free(st);
test_cleanup();
}
CuSuite *get_command_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_command);
return suite;
}

View File

@ -1003,33 +1003,24 @@ void kernel_init(void)
} }
static order * defaults[MAXLOCALES]; static order * defaults[MAXLOCALES];
keyword_t default_keyword = NOKEYWORD;
void set_default_order(int kwd) {
default_keyword = (keyword_t)kwd;
}
// TODO: outside of tests, default_keyword is never used, why is this here?
// see also test_long_order_hungry
order *default_order(const struct locale *lang) order *default_order(const struct locale *lang)
{ {
static int usedefault = 1;
int i = locale_index(lang); int i = locale_index(lang);
order *result = 0; order *result = 0;
assert(i < MAXLOCALES); assert(i < MAXLOCALES);
if (default_keyword != NOKEYWORD) {
return create_order(default_keyword, lang, 0);
}
result = defaults[i]; result = defaults[i];
if (!result && usedefault) { if (!result) {
const char * str = LOC(lang, "defaultorder"); const char * str;
keyword_t kwd = NOKEYWORD;
str = config_get("orders.default");
if (str) { if (str) {
result = defaults[i] = parse_order(str, lang); kwd = findkeyword(str);
} }
else { if (kwd != NOKEYWORD) {
usedefault = 0; result = create_order(kwd, lang, NULL);
defaults[i] = result;
} }
} }
return result ? copy_order(result) : 0; return result ? copy_order(result) : 0;

View File

@ -193,7 +193,6 @@ struct param;
bool IsImmune(const struct faction *f); bool IsImmune(const struct faction *f);
struct order *default_order(const struct locale *lang); struct order *default_order(const struct locale *lang);
void set_default_order(int kwd);
int entertainmoney(const struct region *r); int entertainmoney(const struct region *r);
void init_parameters(struct locale *lang); void init_parameters(struct locale *lang);

View File

@ -172,6 +172,23 @@ static void test_forbiddenid(CuTest *tc) {
CuAssertIntEquals(tc, 1, forbiddenid(atoi36("t"))); CuAssertIntEquals(tc, 1, forbiddenid(atoi36("t")));
} }
static void test_default_order(CuTest *tc) {
order *ord;
struct locale * loc;
test_cleanup();
loc = test_create_locale();
ord = default_order(loc);
CuAssertPtrEquals(tc, 0, ord);
config_set("orders.default", "work");
ord = default_order(loc);
CuAssertPtrNotNull(tc, ord);
CuAssertIntEquals(tc, K_WORK, getkeyword(ord));
CuAssertPtrEquals(tc, ord->data, default_order(loc)->data);
test_cleanup();
}
CuSuite *get_config_suite(void) CuSuite *get_config_suite(void)
{ {
CuSuite *suite = CuSuiteNew(); CuSuite *suite = CuSuiteNew();
@ -181,5 +198,6 @@ CuSuite *get_config_suite(void)
SUITE_ADD_TEST(suite, test_forbiddenid); SUITE_ADD_TEST(suite, test_forbiddenid);
SUITE_ADD_TEST(suite, test_getunit); SUITE_ADD_TEST(suite, test_getunit);
SUITE_ADD_TEST(suite, test_read_unitid); SUITE_ADD_TEST(suite, test_read_unitid);
SUITE_ADD_TEST(suite, test_default_order);
return suite; return suite;
} }

View File

@ -40,6 +40,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <util/base36.h> #include <util/base36.h>
#include <util/bsdstring.h> #include <util/bsdstring.h>
#include <util/event.h> #include <util/event.h>
#include <util/gamedata.h>
#include <util/goodies.h> #include <util/goodies.h>
#include <util/lists.h> #include <util/lists.h>
#include <util/language.h> #include <util/language.h>

View File

@ -511,7 +511,7 @@ static void json_prefixes(cJSON *json) {
} }
/** disable a feature. /** disable a feature.
* features are identified by eone of: * features are identified by one of:
* 1. the keyword for their orders, * 1. the keyword for their orders,
* 2. the name of the skill they use, * 2. the name of the skill they use,
* 3. a "module.enabled" flag in the settings * 3. a "module.enabled" flag in the settings
@ -525,13 +525,11 @@ static void disable_feature(const char *str) {
enable_skill(sk, false); enable_skill(sk, false);
return; return;
} }
for (k = 0; k != MAXKEYWORDS; ++k) { k = findkeyword(str);
// FIXME: this loop is slow as balls. if (k!=NOKEYWORD) {
if (strcmp(keywords[k], str) == 0) { log_debug("disable keyword %s\n", str);
log_debug("disable keyword %s\n", str); enable_keyword(k, false);
enable_keyword(k, false); return;
return;
}
} }
_snprintf(name, sizeof(name), "%s.enabled", str); _snprintf(name, sizeof(name), "%s.enabled", str);
log_info("disable feature %s\n", name); log_info("disable feature %s\n", name);

View File

@ -28,6 +28,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <stdlib.h> #include <stdlib.h>
#include <assert.h> #include <assert.h>
#define MAXDEPTH 1024
bool allowed_swim(const region * src, const region * r) bool allowed_swim(const region * src, const region * r)
{ {
if (fval(r->terrain, SWIM_INTO)) if (fval(r->terrain, SWIM_INTO))

View File

@ -22,11 +22,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
extern "C" { extern "C" {
#endif #endif
#define MAXDEPTH 1024
extern int search[MAXDEPTH][2];
extern int search_len;
extern struct region **path_find(struct region *start, extern struct region **path_find(struct region *start,
const struct region *target, int maxlen, const struct region *target, int maxlen,
bool(*allowed) (const struct region *, const struct region *)); bool(*allowed) (const struct region *, const struct region *));

View File

@ -60,7 +60,6 @@ extern "C" {
struct plane *getplane(const struct region *r); struct plane *getplane(const struct region *r);
struct plane *findplane(int x, int y); struct plane *findplane(int x, int y);
void init_planes(void);
int getplaneid(const struct region *r); int getplaneid(const struct region *r);
struct plane *getplanebyid(int id); struct plane *getplanebyid(int id);
int plane_center_x(const struct plane *pl); int plane_center_x(const struct plane *pl);

67
src/kernel/plane.test.c Normal file
View File

@ -0,0 +1,67 @@
#include <platform.h>
#include <kernel/config.h>
#include "plane.h"
#include "faction.h"
#include <tests.h>
#include <CuTest.h>
static void test_plane(CuTest *tc) {
struct region *r;
plane *pl;
test_cleanup();
r = test_create_region(0, 0, 0);
CuAssertPtrEquals(tc, 0, findplane(0, 0));
CuAssertPtrEquals(tc, 0, getplane(r));
CuAssertIntEquals(tc, 0, getplaneid(r));
CuAssertPtrEquals(tc, 0, getplanebyid(0));
CuAssertIntEquals(tc, 0, plane_center_x(0));
CuAssertIntEquals(tc, 0, plane_center_y(0));
CuAssertIntEquals(tc, 0, plane_width(0));
CuAssertIntEquals(tc, 0, plane_height(0));
CuAssertPtrEquals(tc, 0, get_homeplane());
pl = create_new_plane(1, "Hell", 4, 8, 40, 80, 15);
r = test_create_region(4, 40, 0);
CuAssertIntEquals(tc, 15, pl->flags);
CuAssertIntEquals(tc, 4, pl->minx);
CuAssertIntEquals(tc, 8, pl->maxx);
CuAssertIntEquals(tc, 40, pl->miny);
CuAssertIntEquals(tc, 80, pl->maxy);
CuAssertPtrEquals(tc, 0, pl->attribs);
CuAssertStrEquals(tc, "Hell", pl->name);
CuAssertPtrEquals(tc, pl, findplane(4, 40));
CuAssertPtrEquals(tc, pl, getplane(r));
CuAssertPtrEquals(tc, pl, getplanebyid(1));
CuAssertIntEquals(tc, 1, getplaneid(r));
CuAssertIntEquals(tc, 6, plane_center_x(pl));
CuAssertIntEquals(tc, 60, plane_center_y(pl));
CuAssertIntEquals(tc, 5, plane_width(pl));
CuAssertIntEquals(tc, 41, plane_height(pl));
}
static void test_origin(CuTest *tc) {
struct faction *f;
int x, y;
test_cleanup();
f = test_create_faction(0);
x = 0;
y = 0;
adjust_coordinates(f, &x, &y, 0);
CuAssertIntEquals(tc, 0, x);
CuAssertIntEquals(tc, 0, y);
faction_setorigin(f, 0, 10, 20);
adjust_coordinates(f, &x, &y, 0);
CuAssertIntEquals(tc, -10, x);
CuAssertIntEquals(tc, -20, y);
test_cleanup();
}
CuSuite *get_plane_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_plane);
SUITE_ADD_TEST(suite, test_origin);
return suite;
}

View File

@ -168,7 +168,6 @@ extern "C" {
extern struct attrib_type at_woodcount; extern struct attrib_type at_woodcount;
extern struct attrib_type at_deathcount; extern struct attrib_type at_deathcount;
void initrhash(void);
void rhash(struct region *r); void rhash(struct region *r);
void runhash(struct region *r); void runhash(struct region *r);
@ -176,10 +175,7 @@ extern "C" {
void add_regionlist(region_list ** rl, struct region *r); void add_regionlist(region_list ** rl, struct region *r);
int deathcount(const struct region *r); int deathcount(const struct region *r);
int chaoscount(const struct region *r);
void deathcounts(struct region *r, int delta); void deathcounts(struct region *r, int delta);
void chaoscounts(struct region *r, int delta);
void setluxuries(struct region *r, const struct luxury_type *sale); void setluxuries(struct region *r, const struct luxury_type *sale);
int get_maxluxuries(void); int get_maxluxuries(void);

View File

@ -20,7 +20,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define H_KRNL_SAVE #define H_KRNL_SAVE
#include <stream.h> #include <stream.h>
#include <util/gamedata.h> // FIXME: eliminate include dependency from this file
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -78,8 +77,8 @@ extern "C" {
void create_backup(char *file); void create_backup(char *file);
int write_game(gamedata *data); int write_game(struct gamedata *data);
int read_game(gamedata *data); int read_game(struct gamedata *data);
/* test-only functions that give access to internal implementation details (BAD) */ /* test-only functions that give access to internal implementation details (BAD) */
void _test_write_password(struct gamedata *data, const struct faction *f); void _test_write_password(struct gamedata *data, const struct faction *f);

View File

@ -227,14 +227,13 @@ static void test_default_name(CuTest *tc) {
test_cleanup(); test_cleanup();
test_create_world(); test_create_world();
lang = get_or_create_locale("de"); lang = get_or_create_locale("de");
/* FIXME this has no real effect: default_name uses a static buffer that is initialized in some other test. This sucks. */ locale_setstring(lang, "unitdefault", "Zweiheit");
locale_setstring(lang, "unitdefault", "Einheit");
u = test_create_unit(test_create_faction(test_create_race("human")), findregion(0, 0)); u = test_create_unit(test_create_faction(test_create_race("human")), findregion(0, 0));
default_name(u, buf, sizeof(buf)); default_name(u, buf, sizeof(buf));
sprintf(compare, "Einheit %s", itoa36(u->no)); sprintf(compare, "Zweiheit %s", itoa36(u->no));
CuAssertStrEquals(tc, compare, buf); CuAssertStrEquals(tc, compare, buf);
test_cleanup(); test_cleanup();

View File

@ -998,8 +998,6 @@ static void test_long_order_buy_cast(CuTest *tc) {
} }
static void test_long_order_hungry(CuTest *tc) { static void test_long_order_hungry(CuTest *tc) {
// FIXME: set_default_order is a test-only function, this is a bad test.
// see also default_order
unit *u; unit *u;
test_cleanup(); test_cleanup();
config_set("hunger.long", "1"); config_set("hunger.long", "1");
@ -1007,12 +1005,11 @@ static void test_long_order_hungry(CuTest *tc) {
fset(u, UFL_HUNGER); fset(u, UFL_HUNGER);
unit_addorder(u, create_order(K_MOVE, u->faction->locale, 0)); unit_addorder(u, create_order(K_MOVE, u->faction->locale, 0));
unit_addorder(u, create_order(K_DESTROY, u->faction->locale, 0)); unit_addorder(u, create_order(K_DESTROY, u->faction->locale, 0));
set_default_order(K_WORK); config_set("orders.default", "work");
update_long_order(u); update_long_order(u);
CuAssertIntEquals(tc, K_WORK, getkeyword(u->thisorder)); CuAssertIntEquals(tc, K_WORK, getkeyword(u->thisorder));
CuAssertPtrNotNull(tc, u->orders); CuAssertPtrNotNull(tc, u->orders);
CuAssertPtrEquals(tc, 0, u->faction->msgs); CuAssertPtrEquals(tc, 0, u->faction->msgs);
set_default_order(NOKEYWORD);
test_cleanup(); test_cleanup();
} }

View File

@ -253,7 +253,6 @@ static void test_write_unit(CuTest *tc) {
race *rc; race *rc;
struct locale *lang; struct locale *lang;
char buffer[1024]; char buffer[1024];
/* FIXME: test emits ERROR: no translation for combat status status_aggressive in locale de */
test_cleanup(); test_cleanup();
rc = rc_get_or_create("human"); rc = rc_get_or_create("human");

View File

@ -87,6 +87,8 @@ int RunAllTests(int argc, char *argv[])
ADD_SUITE(xerewards); ADD_SUITE(xerewards);
/* kernel */ /* kernel */
ADD_SUITE(alliance); ADD_SUITE(alliance);
ADD_SUITE(command);
ADD_SUITE(plane);
ADD_SUITE(unit); ADD_SUITE(unit);
ADD_SUITE(faction); ADD_SUITE(faction);
ADD_SUITE(group); ADD_SUITE(group);

View File

@ -6,6 +6,7 @@
#include "reports.h" #include "reports.h"
#include <kernel/config.h> #include <kernel/config.h>
#include <kernel/alliance.h>
#include <kernel/plane.h> #include <kernel/plane.h>
#include <kernel/region.h> #include <kernel/region.h>
#include <kernel/terrain.h> #include <kernel/terrain.h>
@ -78,6 +79,9 @@ struct locale * test_create_locale(void) {
if (!locale_getstring(loc, mkname("skill", skillnames[i]))) if (!locale_getstring(loc, mkname("skill", skillnames[i])))
locale_setstring(loc, mkname("skill", skillnames[i]), skillnames[i]); locale_setstring(loc, mkname("skill", skillnames[i]), skillnames[i]);
} }
for (i = 0; i != ALLIANCE_MAX; ++i) {
locale_setstring(loc, alliance_kwd[i], alliance_kwd[i]);
}
for (i = 0; i != MAXDIRECTIONS; ++i) { for (i = 0; i != MAXDIRECTIONS; ++i) {
locale_setstring(loc, directions[i], directions[i]); locale_setstring(loc, directions[i], directions[i]);
init_direction(loc, i, directions[i]); init_direction(loc, i, directions[i]);
@ -97,6 +101,7 @@ struct locale * test_create_locale(void) {
test_translate_param(loc, i, parameters[i]); test_translate_param(loc, i, parameters[i]);
} }
init_parameters(loc); init_parameters(loc);
init_keywords(loc);
init_skills(loc); init_skills(loc);
} }
return loc; return loc;

View File

@ -1,18 +1,34 @@
project(util C) project(util C)
SET(_TEST_FILES SET(_TEST_FILES
attrib.test.c
base36.test.c base36.test.c
bsdstring.test.c
# crmessage.test.c
# dice.test.c
# event.test.c
# filereader.test.c
functions.test.c
gamedata.test.c gamedata.test.c
# goodies.test.c
# language.test.c
# lists.test.c
# log.test.c
# message.test.c
# nrmessage.test.c
parser.test.c parser.test.c
password.test.c password.test.c
attrib.test.c # rand.test.c
# resolve.test.c
rng.test.c
strings.test.c strings.test.c
bsdstring.test.c bsdstring.test.c
functions.test.c functions.test.c
log.test.c log.test.c
# translation.test.c
umlaut.test.c umlaut.test.c
unicode.test.c unicode.test.c
rng.test.c # xml.test.c
) )
SET(_FILES SET(_FILES
@ -26,7 +42,6 @@ filereader.c
functions.c functions.c
gamedata.c gamedata.c
goodies.c goodies.c
gamedata.c
language.c language.c
lists.c lists.c
log.c log.c