Crossfire Server, Trunk
check_arch.cpp
Go to the documentation of this file.
1 /*
2  * static char *rcsid_check_arch_c =
3  * "$Id$";
4  */
5 
6 /*
7  * CrossFire, A Multiplayer game for X-windows
8  *
9  * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10  * Copyright (C) 1992 Frank Tore Johansen
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25  *
26  * The authors can be reached via e-mail at crossfire-devel@real-time.com
27  */
28 
29 /*
30  * This is the unit tests file for common/arch.c
31  */
32 
33 #include <global.h>
34 #include <stdlib.h>
35 #include <check.h>
36 #include <loader.h>
37 #include <toolkit_common.h>
38 
39 static void setup(void) {
40  cctk_setdatadir(SOURCE_ROOT"lib");
41  cctk_setlog(LOGDIR"/unit/common/arch.out");
43 }
44 
45 static void teardown(void) {
46  /* put any cleanup steps here, they will be run after each testcase */
47 }
48 
49 START_TEST(test_find_archetype_by_object_name) {
50  archetype *arch;
51 
52  arch = find_archetype_by_object_name("large city");
53  FAIL_UNLESS(arch != NULL, "Searching for an existing arch name (large city) should work");
54  FAIL_UNLESS(!strcmp(arch->clone.name, "large city"), "Searching for an existing arch name shoud have returned us large city but returned %s", arch->clone.name);
55  arch = find_archetype_by_object_name("Cloak of Magic Resistance");
56  FAIL_UNLESS(arch != NULL, "Searching for an existing arch name (Cloak of Magic Resistance) should work");
57  FAIL_UNLESS(!strcmp(arch->clone.name, "Cloak of Magic Resistance"), "Searching for an existing arch name shoud have returned us Cloak of Magic Resistance but returned %s", arch->clone.name);
58  arch = find_archetype_by_object_name("Cloak of Magic Resistanc");
59  FAIL_UNLESS(arch == NULL, "Searching for an inexistant arch name (Cloak of Magic Resistanc) should return NULL");
60  arch = find_archetype_by_object_name("some really non existant archetype");
61  FAIL_UNLESS(arch == NULL, "Searching for an inexistant arch name (some really non existant archetype) should return NULL");
63  FAIL_UNLESS(arch == NULL, "Searching for empty arch name should return NULL");
65  FAIL_UNLESS(arch == NULL, "Searching for NULL arch name should return NULL");
66 }
67 END_TEST
68 
69 START_TEST(test_find_archetype_by_object_type_name) {
70  archetype *arch;
71 
72  arch = find_archetype_by_object_type_name(66, "large city");
73  FAIL_UNLESS(arch != NULL, "Searching for an existing arch name (large city) + type (66) should work");
74  FAIL_UNLESS(arch->clone.type == 66, "Requested type 66 but got %d", arch->clone.type);
75  FAIL_UNLESS(!strcmp(arch->clone.name, "large city"), "Searching for an existing arch name shoud have returned us large city but returned %s", arch->clone.name);
76  arch = find_archetype_by_object_type_name(87, "Cloak of Magic Resistance");
77  FAIL_UNLESS(arch != NULL, "Searching for an existing arch name (Cloak of Magic Resistance) + type (87) should work");
78  FAIL_UNLESS(arch->clone.type == 87, "Requested type 87 but got %d", arch->clone.type);
79  FAIL_UNLESS(!strcmp(arch->clone.name, "Cloak of Magic Resistance"), "Searching for an existing arch name shoud have returned us Cloak of Magic Resistance but returned %s", arch->clone.name);
80  arch = find_archetype_by_object_type_name(87, "Cloak of Magic Resistanc");
81  FAIL_UNLESS(arch == NULL, "Searching for an inexistant arch name (Cloak of Magic Resistanc) should return NULL");
82  arch = find_archetype_by_object_type_name(88, "Cloak of Magic Resistance");
83  FAIL_UNLESS(arch == NULL, "Searching for an existing arch name (Cloak of Magic Resistance) but with wrong type (88) should return NULL");
85  FAIL_UNLESS(arch == NULL, "Searching for type with NULL name should return NULL");
86 }
87 END_TEST
88 
89 
90 START_TEST(test_get_archetype_by_skill_name) {
91  archetype *arch;
92 
94  FAIL_UNLESS(arch != NULL, "Should be able to discover the alchemy skill");
95  FAIL_UNLESS(!strcmp(arch->name, "skill_alchemy"), "should have returned skill_alchemy but returned %s", arch->name);
97  FAIL_UNLESS(arch != NULL, "Should be able to discover the scroll of alchemy skill or something similar");
98  arch = get_archetype_by_skill_name("one handed weapons", -1);
99  FAIL_UNLESS(arch != NULL, "Should be able to discover something related to the 'one handed weapons' skill");
100  arch = get_archetype_by_skill_name(NULL, -1);
101  FAIL_UNLESS(arch == NULL, "Asking for null skill should return null");
102 }
103 END_TEST
104 
105 START_TEST(test_get_archetype_by_type_subtype) {
106  archetype *arch;
107 
109  FAIL_UNLESS(arch != NULL, "Should be able to find an arch of type SKILL, subtype SK_LITERACY");
110  FAIL_UNLESS(arch->clone.type == SKILL, "Arch of type SKILL, subtype SK_LITERACY shoud have type %d but has type %d", SKILL, arch->clone.type);
111  FAIL_UNLESS(arch->clone.subtype == SK_LITERACY, "Arch of type SKILL, subtype SK_LITERACY shoud have subtype %d but has subtype %d", SK_LITERACY, arch->clone.subtype);
113  FAIL_UNLESS(arch != NULL, "Should be able to find an arch of type SKILL, no subtype");
114  FAIL_UNLESS(arch->clone.type == SKILL, "arch of type SKILL, no subtype should have type %d but has %d", SKILL, arch->clone.type);
116  FAIL_UNLESS(arch != NULL, "Should be able to find an arch of type unknown, SK_LITERACY");
117  FAIL_UNLESS(arch->clone.subtype == SK_LITERACY, "arch of type unknown, subtype quest in progress shoud have subtype %d but has subtype %d", SK_LITERACY, arch->clone.subtype);
119  FAIL_UNLESS(arch != NULL, "Should be able to find arch of type unknown, subtype unknown, despite this being useless");
121  FAIL_UNLESS(arch == NULL, "Should be not able to find arch of inexistant type but got %p (%s)", arch, arch->name);
122 }
123 END_TEST
124 
125 
126 START_TEST(test_create_archetype_by_object_name) {
127  object *ob;
128 
129  ob = create_archetype_by_object_name("writing pen");
130  FAIL_UNLESS(ob != NULL, "Should never return null");
131  FAIL_UNLESS(strncmp(ob->name, ARCH_SINGULARITY, strlen(ARCH_SINGULARITY)), "Searching for writing pen should NOT have returned a singularity");
132  FAIL_UNLESS(!strncmp(ob->name, "writing pen", strlen(ob->name)), "Searching for writing pen should have returned something with same base name but returned '%s'", ob->name);
133  ob = create_archetype_by_object_name("writing pen of hell raiser +3");
134  FAIL_UNLESS(ob != NULL, "Should never return null");
135  FAIL_UNLESS(strncmp(ob->name, ARCH_SINGULARITY, strlen(ARCH_SINGULARITY)), "Searching for writing pen of hell raiser +3 should NOT have returned a singularity");
136  FAIL_UNLESS(!strncmp(ob->name, "writing pen of hell raiser +3", strlen(ob->name)), "Searching for writing pen of hell raiser +3 should have returned something with same base name but returned %s", ob->name);
138  FAIL_UNLESS(ob != NULL, "Inexistent item shuold return a singularity");
139  FAIL_UNLESS(!strncmp(ob->name, ARCH_SINGULARITY, strlen(ARCH_SINGULARITY)), "Searching for %%* should have returned a singularity");
141  FAIL_UNLESS(ob != NULL, "Inexistent item shuold return a singularity");
142  FAIL_UNLESS(!strncmp(ob->name, ARCH_SINGULARITY, strlen(ARCH_SINGULARITY)), "Searching for \"\" should have returned a singularity");
143 }
144 END_TEST
145 
146 START_TEST(test_init_archetypes) {
147  /*init_archetypes is used by setup, just check it created the empty_archetype*/
148  archetype *arch = find_archetype("empty_archetype");
149 
150  FAIL_UNLESS(arch != NULL, "init_archetype should have an 'empty_archetype' loaded");
151 }
152 END_TEST
153 
154 START_TEST(test_get_archetype_struct) {
156 
157  FAIL_UNLESS(arch != NULL, "get_archetype_struct should not return NULL");
158  FAIL_UNLESS(arch->name == NULL, "arch->name of get_archetype_struct should be inited to NULL");
159  FAIL_UNLESS(arch->head == NULL, "arch->head of get_archetype_struct should be inited to NULL");
160  FAIL_UNLESS(arch->more == NULL, "arch->more of get_archetype_struct should be inited to NULL");
161  FAIL_UNLESS(arch->clone.other_arch == NULL, "arch->clone.other_arch of get_archetype_struct should be inited to NULL");
162  FAIL_UNLESS(arch->clone.contr == NULL, "arch->clone.contr of get_archetype_struct should be inited to NULL");
163  FAIL_UNLESS(arch->clone.next == NULL, "arch->clone.next of get_archetype_struct should be inited to NULL");
164  FAIL_UNLESS(arch->clone.prev == NULL, "arch->clone.prev of get_archetype_struct should be inited to NULL");
165  FAIL_UNLESS(arch->clone.active_next == NULL, "arch->clone.active_next of get_archetype_struct should be inited to NULL");
166  FAIL_UNLESS(arch->clone.active_prev == NULL, "arch->clone.active_prev of get_archetype_struct should be inited to NULL");
167  FAIL_UNLESS(arch->clone.below == NULL, "arch->clone.below of get_archetype_struct should be inited to NULL");
168  FAIL_UNLESS(arch->clone.above == NULL, "arch->clone.above of get_archetype_struct should be inited to NULL");
169  FAIL_UNLESS(arch->clone.inv == NULL, "arch->clone.inv of get_archetype_struct should be inited to NULL");
170  FAIL_UNLESS(arch->clone.container == NULL, "arch->clone.container of get_archetype_struct should be inited to NULL");
171  FAIL_UNLESS(arch->clone.env == NULL, "arch->clone.env of get_archetype_struct should be inited to NULL");
172  FAIL_UNLESS(arch->clone.more == NULL, "arch->clone.more of get_archetype_struct should be inited to NULL");
173  FAIL_UNLESS(arch->clone.head == NULL, "arch->clone.head of get_archetype_struct should be inited to NULL");
174  FAIL_UNLESS(arch->clone.map == NULL, "arch->clone.map of get_archetype_struct should be inited to NULL");
175 
176  FAIL_UNLESS(arch->clone.name == NULL, "arch->clone.name of get_archetype_struct should be inited to NULL");
177  FAIL_UNLESS(arch->clone.name_pl == NULL, "arch->clone.name_pl of get_archetype_struct should be inited to NULL");
178  FAIL_UNLESS(arch->clone.title == NULL, "arch->clone.title of get_archetype_struct should be inited to NULL");
179  FAIL_UNLESS(arch->clone.race == NULL, "arch->clone.race of get_archetype_struct should be inited to NULL");
180  FAIL_UNLESS(arch->clone.slaying == NULL, "arch->clone.slaying of get_archetype_struct should be inited to NULL");
181  FAIL_UNLESS(arch->clone.msg == NULL, "arch->clone.msg of get_archetype_struct should be inited to NULL");
182  FAIL_UNLESS(arch->clone.skill == NULL, "arch->clone.skill of get_archetype_struct should be inited to NULL");
183  FAIL_UNLESS(arch->clone.lore == NULL, "arch->clone.lore of get_archetype_struct should be inited to NULL");
184 
185  FAIL_UNLESS(arch->clone.current_weapon == NULL, "arch->clone.current_weapon of get_archetype_struct should be inited to NULL");
186  FAIL_UNLESS(arch->clone.enemy == NULL, "arch->clone.enemy of get_archetype_struct should be inited to NULL");
187  FAIL_UNLESS(arch->clone.attacked_by == NULL, "arch->clone.attacked_by of get_archetype_struct should be inited to NULL");
188  FAIL_UNLESS(arch->clone.randomitems == NULL, "arch->clone.randomitems of get_archetype_struct should be inited to NULL");
189  FAIL_UNLESS(arch->clone.chosen_skill == NULL, "arch->clone.chosen_skill of get_archetype_struct should be inited to NULL");
190  FAIL_UNLESS(arch->clone.spellitem == NULL, "arch->clone.spellitem of get_archetype_struct should be inited to NULL");
191  FAIL_UNLESS(arch->clone.spell == NULL, "arch->clone.spell of get_archetype_struct should be inited to NULL");
192  FAIL_UNLESS(arch->clone.spellarg == NULL, "arch->clone.spellarg of get_archetype_struct should be inited to NULL");
193  FAIL_UNLESS(arch->clone.arch == arch, "arch->clone.arch of get_archetype_struct should be inited to arch");
194  FAIL_UNLESS(arch->clone.other_arch == NULL, "arch->clone.other_arch of get_archetype_struct should be inited to NULL");
195  FAIL_UNLESS(arch->clone.key_values == NULL, "arch->clone.key_values of get_archetype_struct should be inited to NULL");
196 }
197 END_TEST
198 
199 START_TEST(test_arch_to_object) {
200  archetype *arch;
201  object *obj;
202 
203  arch = find_archetype("empty_archetype");
205  FAIL_UNLESS(obj != NULL, "instanciating an arch should not return null");
206 }
207 END_TEST
208 
209 START_TEST(test_create_singularity) {
210  object *obj;
211 
212  obj = create_singularity("XYZABCD");
213  FAIL_UNLESS(obj != NULL, "create_singularity should not return null");
214  FAIL_UNLESS(strstr(obj->name, "XYZABCD") != NULL, "create_singularity(\"XYZABCD\") should put XYZABCD somewhere in singularity name");
215 }
216 END_TEST
217 
218 START_TEST(test_create_archetype) {
219  object *obj;
220 
221  obj = create_archetype("empty_archetype");
222  FAIL_UNLESS(obj != NULL, "create_archetype(\"empty_archetype\") should not return null");
223 }
224 END_TEST
225 
226 START_TEST(test_find_archetype) {
227  archetype *arch;
228 
229  arch = find_archetype("empty_archetype");
230  FAIL_UNLESS(arch != NULL, "find_archetype(\"empty_archetype\") should not return null");
231  arch = find_archetype("elvenboots");
232  FAIL_UNLESS(arch != NULL, "find_archetype(\"elvenboots\") should not return null");
233  arch = find_archetype("AA1234567890");
234  FAIL_UNLESS(arch != NULL, "find_archetype(\"AA1234567890\") should not return null");
235 }
236 END_TEST
237 
238 START_TEST(test_object_create_arch) {
239  archetype *arch;
240  object *obj;
241 
242  arch = find_archetype("dark_palace_4");
244  FAIL_UNLESS(obj != NULL, "Should be able to fully instanciate the dark_palace");
245  FAIL_UNLESS(obj->head == NULL, "The object is full, so we should have got it's head. So head should be null but was %p for object %p", obj->head, obj);
246  FAIL_UNLESS(obj->more != NULL, "The object is full and multisquare, so more should not return null");
247 }
248 END_TEST
249 
250 static Suite *arch_suite(void) {
251  Suite *s = suite_create("arch");
252  TCase *tc_core = tcase_create("Core");
253  tcase_set_timeout(tc_core, 60);
254 
255  /*setup and teardown will be called before each test in testcase 'tc_core' */
256  tcase_add_checked_fixture(tc_core, setup, teardown);
257 
258  suite_add_tcase(s, tc_core);
259  tcase_add_test(tc_core, test_find_archetype_by_object_name);
260  tcase_add_test(tc_core, test_find_archetype_by_object_type_name);
261  tcase_add_test(tc_core, test_get_archetype_by_skill_name);
262  tcase_add_test(tc_core, test_get_archetype_by_type_subtype);
263  tcase_add_test(tc_core, test_create_archetype_by_object_name);
264  tcase_add_test(tc_core, test_init_archetypes);
265  tcase_add_test(tc_core, test_get_archetype_struct);
266  tcase_add_test(tc_core, test_arch_to_object);
267  tcase_add_test(tc_core, test_create_singularity);
268  tcase_add_test(tc_core, test_create_archetype);
269  tcase_add_test(tc_core, test_find_archetype);
270  tcase_add_test(tc_core, test_object_create_arch);
271 
272  return s;
273 }
274 
275 int main(void) {
276  int nf;
277  Suite *s = arch_suite();
278  SRunner *sr = srunner_create(s);
279 
280  srunner_set_xml(sr, LOGDIR "/unit/common/arch.xml");
281  srunner_set_log(sr, LOGDIR "/unit/common/arch.out");
282  srunner_run_all(sr, CK_ENV); /*verbosity from env variable*/
283  nf = srunner_ntests_failed(sr);
284  srunner_free(sr);
285  return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
286 }
START_TEST
START_TEST(test_find_archetype_by_object_name)
Definition: check_arch.cpp:49
global.h
find_archetype_by_object_type_name
archetype * find_archetype_by_object_type_name(int type, const char *name)
Definition: arch.cpp:66
altar_valkyrie.obj
obj
Definition: altar_valkyrie.py:33
create_singularity
object * create_singularity(const char *name)
Definition: arch.cpp:255
archininventory.arch
arch
DIALOGCHECK MINARGS 1 MAXARGS 1
Definition: archininventory.py:16
get_archetype_struct
archetype * get_archetype_struct(void)
Definition: arch.cpp:195
cctk_setdatadir
void cctk_setdatadir(const char *datadir)
Definition: toolkit_common.cpp:69
guildjoin.ob
ob
Definition: guildjoin.py:42
SKILL
@ SKILL
Definition: object.h:148
setup
static void setup(void)
Definition: check_arch.cpp:39
arch_suite
static END_TEST Suite * arch_suite(void)
Definition: check_arch.cpp:250
FAIL_UNLESS
#define FAIL_UNLESS(expr,...)
Definition: toolkit_common.h:11
toolkit_common.h
cctk_setlog
void cctk_setlog(const char *logfile)
Definition: toolkit_common.cpp:64
teardown
static void teardown(void)
Definition: check_arch.cpp:45
main
int main(void)
Definition: check_arch.cpp:275
SK_LITERACY
@ SK_LITERACY
Definition: skills.h:27
SKILLSCROLL
@ SKILLSCROLL
Definition: object.h:239
object_create_arch
object * object_create_arch(archetype *at)
Definition: arch.cpp:298
archetype
Definition: object.h:483
create_archetype
object * create_archetype(const char *name)
Definition: arch.cpp:278
cctk_init_std_archetypes
void cctk_init_std_archetypes(void)
Definition: toolkit_common.cpp:83
find_archetype_by_object_name
archetype * find_archetype_by_object_name(const char *name)
Definition: arch.cpp:53
OBJECT_TYPE_MAX
@ OBJECT_TYPE_MAX
Definition: object.h:256
create_archetype_by_object_name
object * create_archetype_by_object_name(const char *name)
Definition: arch.cpp:116
find_archetype
archetype * find_archetype(const char *name)
Definition: assets.cpp:266
arch_to_object
object * arch_to_object(archetype *at)
Definition: arch.cpp:229
ARCH_SINGULARITY
#define ARCH_SINGULARITY
Definition: object.h:588
loader.h
get_archetype_by_type_subtype
archetype * get_archetype_by_type_subtype(int type, int subtype)
Definition: arch.cpp:99
get_archetype_by_skill_name
archetype * get_archetype_by_skill_name(const char *skill, int type)
Definition: arch.cpp:80