server/src/tests.c

357 lines
9.6 KiB
C
Raw Normal View History

2010-08-08 10:06:34 +02:00
#include <platform.h>
#include "tests.h"
#include "keyword.h"
#include "seen.h"
#include "prefix.h"
2010-08-08 10:06:34 +02:00
#include <kernel/config.h>
#include <kernel/plane.h>
2010-08-08 10:06:34 +02:00
#include <kernel/region.h>
#include <kernel/terrain.h>
#include <kernel/item.h>
#include <kernel/unit.h>
#include <kernel/order.h>
2010-08-08 10:06:34 +02:00
#include <kernel/race.h>
#include <kernel/faction.h>
#include <kernel/building.h>
#include <kernel/ship.h>
2012-06-04 11:41:07 +02:00
#include <kernel/spell.h>
#include <kernel/spellbook.h>
#include <kernel/terrain.h>
#include <kernel/messages.h>
#include <util/bsdstring.h>
#include <util/functions.h>
2010-08-08 10:06:34 +02:00
#include <util/language.h>
#include <util/message.h>
2012-06-02 03:05:07 +02:00
#include <util/log.h>
#include <util/rand.h>
2012-06-02 03:05:07 +02:00
#include <CuTest.h>
2012-06-02 03:05:07 +02:00
#include <assert.h>
2015-08-18 17:28:07 +02:00
#include <errno.h>
#include <stdlib.h>
#include <string.h>
2010-08-08 10:06:34 +02:00
2011-03-07 08:02:35 +01:00
struct race *test_create_race(const char *name)
2010-08-08 10:06:34 +02:00
{
race *rc = rc_get_or_create(name);
rc->maintenance = 10;
rc->hitpoints = 20;
rc->maxaura = 1.0;
rc->ec_flags |= GETITEM;
rc->battle_flags = BF_EQUIPMENT;
return rc;
2010-08-08 10:06:34 +02:00
}
struct region *test_create_region(int x, int y, const terrain_type *terrain)
2010-08-08 10:06:34 +02:00
{
region *r = findregion(x, y);
if (!r) {
r = new_region(x, y, findplane(x, y), 0);
}
if (!terrain) {
terrain_type *t = get_or_create_terrain("plain");
t->size = 1000;
2015-11-07 23:34:51 +01:00
fset(t, LAND_REGION|CAVALRY_REGION|FOREST_REGION);
terraform_region(r, t);
}
else {
terraform_region(r, terrain);
}
rsettrees(r, 0, 0);
rsettrees(r, 1, 0);
rsettrees(r, 2, 0);
rsethorses(r, 0);
rsetpeasants(r, r->terrain->size);
return r;
2010-08-08 10:06:34 +02:00
}
2011-03-07 08:02:35 +01:00
struct faction *test_create_faction(const struct race *rc)
2010-08-08 10:06:34 +02:00
{
faction *f = addfaction("nobody@eressea.de", NULL, rc ? rc : test_create_race("human"), default_locale, 0);
test_clear_messages(f);
return f;
2010-08-08 10:06:34 +02:00
}
2011-03-07 08:02:35 +01:00
struct unit *test_create_unit(struct faction *f, struct region *r)
2010-08-08 10:06:34 +02:00
{
const struct race * rc = f ? f->race : 0;
assert(f || !r);
return create_unit(r, f, 1, rc ? rc : rc_get_or_create("human"), 0, 0, 0);
2010-08-08 10:06:34 +02:00
}
2011-03-07 08:02:35 +01:00
void test_cleanup(void)
{
int i;
2016-01-11 18:03:53 +01:00
free_gamedata();
free_terrains();
2014-12-30 23:49:50 +01:00
free_resources();
free_config();
default_locale = 0;
close_orders();
free_locales();
free_spells();
free_buildingtypes();
free_shiptypes();
free_races();
free_spellbooks();
free_seen();
free_prefixes();
mt_clear();
2015-09-12 17:43:31 +02:00
for (i = 0; i != MAXSKILLS; ++i) {
enable_skill(i, true);
}
for (i = 0; i != MAXKEYWORDS; ++i) {
enable_keyword(i, true);
}
if (errno) {
int error = errno;
errno = 0;
log_error("errno: %d (%s)", error, strerror(error));
}
random_source_reset();
2010-08-08 10:06:34 +02:00
}
terrain_type *
test_create_terrain(const char * name, unsigned int flags)
{
terrain_type * t = get_or_create_terrain(name);
t->flags = flags;
return t;
}
building * test_create_building(region * r, const building_type * btype)
{
building * b = new_building(btype ? btype : test_create_buildingtype("castle"), r, default_locale);
b->size = b->type->maxsize > 0 ? b->type->maxsize : 1;
return b;
}
ship * test_create_ship(region * r, const ship_type * stype)
{
ship * s = new_ship(stype ? stype : test_create_shiptype("boat"), r, default_locale);
s->size = s->type->construction ? s->type->construction->maxsize : 1;
return s;
}
ship_type * test_create_shiptype(const char * name)
{
ship_type * stype = st_get_or_create(name);
stype->cptskill = 1;
stype->sumskill = 1;
stype->minskill = 1;
stype->range = 2;
stype->cargo = 1000;
stype->damage = 1;
if (!stype->construction) {
stype->construction = calloc(1, sizeof(construction));
stype->construction->maxsize = 5;
stype->construction->minskill = 1;
stype->construction->reqsize = 1;
stype->construction->skill = SK_SHIPBUILDING;
}
stype->coasts =
(terrain_type **)malloc(sizeof(terrain_type *)*2);
stype->coasts[0] = test_create_terrain("plain", LAND_REGION | FOREST_REGION | WALK_INTO | CAVALRY_REGION | SAIL_INTO | FLY_INTO);
stype->coasts[1] = NULL;
if (default_locale) {
locale_setstring(default_locale, name, name);
}
return stype;
}
building_type * test_create_buildingtype(const char * name)
{
building_type *btype = bt_get_or_create(name);
btype->flags = BTF_NAMECHANGE;
if (!btype->construction) {
btype->construction = (construction *)calloc(sizeof(construction), 1);
btype->construction->skill = SK_BUILDING;
btype->construction->maxsize = -1;
btype->construction->minskill = 1;
btype->construction->reqsize = 1;
}
if (!btype->construction->materials) {
btype->construction->materials = (requirement *)calloc(sizeof(requirement), 2);
btype->construction->materials[1].number = 0;
btype->construction->materials[0].number = 1;
btype->construction->materials[0].rtype = get_resourcetype(R_STONE);
}
if (default_locale) {
locale_setstring(default_locale, name, name);
}
return btype;
}
item_type * test_create_itemtype(const char * name) {
resource_type * rtype;
item_type * itype;
rtype = rt_get_or_create(name);
itype = it_get_or_create(rtype);
return itype;
}
void test_create_castorder(castorder *co, unit *u, int level, float force, int range, spellparameter *par) {
struct locale * lang;
order *ord;
lang = get_or_create_locale("en");
create_castorder(co, u, NULL, NULL, u->region, level, force, range, ord = create_order(K_CAST, lang, ""), par);
free_order(ord);
}
2015-11-12 19:34:25 +01:00
spell * test_create_spell(void)
{
spell *sp;
sp = create_spell("testspell", 0);
sp->components = (spell_component *)calloc(4, sizeof(spell_component));
sp->components[0].amount = 1;
sp->components[0].type = get_resourcetype(R_SILVER);
sp->components[0].cost = SPC_FIX;
sp->components[1].amount = 1;
sp->components[1].type = get_resourcetype(R_AURA);
sp->components[1].cost = SPC_LEVEL;
sp->components[2].amount = 1;
sp->components[2].type = get_resourcetype(R_HORSE);
sp->components[2].cost = SPC_LINEAR;
2015-11-13 15:35:17 +01:00
sp->syntax = 0;
sp->parameter = 0;
2015-11-12 19:34:25 +01:00
return sp;
}
2014-12-17 19:53:19 +01:00
void test_translate_param(const struct locale *lang, param_t param, const char *text) {
struct critbit_tree **cb;
2014-12-17 19:53:19 +01:00
assert(lang && text);
cb = (struct critbit_tree **)get_translations(lang, UT_PARAMS);
add_translation(cb, text, param);
}
2015-11-07 23:34:51 +01:00
item_type *test_create_horse(void) {
item_type * itype;
itype = test_create_itemtype("horse");
itype->flags |= ITF_BIG | ITF_ANIMAL;
itype->weight = 5000;
itype->capacity = 7000;
return itype;
}
2010-08-08 10:06:34 +02:00
/** creates a small world and some stuff in it.
* two terrains: 'plain' and 'ocean'
* one race: 'human'
* one ship_type: 'boat'
* one building_type: 'castle'
* in 0.0 and 1.0 is an island of two plains, around it is ocean.
*/
void test_create_world(void)
{
terrain_type *t_plain, *t_ocean;
region *island[2];
int i;
item_type * itype;
struct locale * loc;
loc = get_or_create_locale("de");
locale_setstring(loc, parameters[P_SHIP], "SCHIFF");
locale_setstring(loc, parameters[P_ANY], "ALLE");
init_parameters(loc);
locale_setstring(loc, "status_aggressive", "aggressiv");
locale_setstring(loc, keyword(K_RESERVE), "RESERVIEREN");
locale_setstring(loc, "money", "SILBER");
init_resources();
get_resourcetype(R_SILVER)->itype->weight = 1;
2015-11-07 23:34:51 +01:00
test_create_horse();
itype = test_create_itemtype("cart");
itype->flags |= ITF_BIG | ITF_VEHICLE;
itype->weight = 4000;
itype->capacity = 14000;
test_create_itemtype("iron");
test_create_itemtype("stone");
t_plain = test_create_terrain("plain", LAND_REGION | FOREST_REGION | WALK_INTO | CAVALRY_REGION | SAIL_INTO | FLY_INTO);
t_plain->size = 1000;
t_plain->max_road = 100;
2015-11-17 02:07:46 +01:00
t_ocean = test_create_terrain("ocean", SEA_REGION | SAIL_INTO | SWIM_INTO | FLY_INTO);
t_ocean->size = 0;
island[0] = test_create_region(0, 0, t_plain);
island[1] = test_create_region(1, 0, t_plain);
for (i = 0; i != 2; ++i) {
int j;
region *r = island[i];
for (j = 0; j != MAXDIRECTIONS; ++j) {
region *rn = r_connect(r, (direction_t)j);
if (!rn) {
rn = test_create_region(r->x + delta_x[j], r->y + delta_y[j], t_ocean);
}
}
2010-08-08 10:06:34 +02:00
}
test_create_race("human");
2010-08-08 10:06:34 +02:00
test_create_buildingtype("castle");
test_create_shiptype("boat");
2010-08-08 10:06:34 +02:00
}
message * test_get_last_message(message_list *msgs) {
if (msgs) {
struct mlist *iter = msgs->begin;
while (iter->next) {
iter = iter->next;
}
return iter->msg;
}
return 0;
}
const char * test_get_messagetype(const message *msg) {
const char * name;
assert(msg);
name = msg->type->name;
if (strcmp(name, "missing_message") == 0) {
name = (const char *)msg->parameters[0].v;
}
else if (strcmp(name, "missing_feedback") == 0) {
name = (const char *)msg->parameters[3].v;
}
return name;
}
struct message * test_find_messagetype(struct message_list *msgs, const char *name) {
struct mlist *ml;
2015-10-11 12:44:22 +02:00
if (!msgs) return 0;
for (ml = msgs->begin; ml; ml = ml->next) {
if (strcmp(name, test_get_messagetype(ml->msg)) == 0) {
return ml->msg;
}
}
return 0;
}
2015-10-12 13:27:39 +02:00
void test_clear_messages(faction *f) {
if (f->msgs) {
free_messagelist(f->msgs->begin);
free(f->msgs);
f->msgs = 0;
}
2015-10-12 13:27:39 +02:00
}
void disabled_test(void *suite, void (*test)(CuTest *), const char *name) {
(void)test;
fprintf(stderr, "%s: SKIP\n", name);
}