Crossfire Server, Branches 1.12  R18729
check_attack.c
Go to the documentation of this file.
1 /*
2  * static char *rcsid_check_attack_c =
3  * "$Id: check_attack.c 11578 2009-02-23 22:02:27Z lalo $";
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 server/attack.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 #include <sproto.h>
39 
40 void setup(void) {
41 }
42 
43 void teardown(void) {
44  /* put any cleanup steps here, they will be run after each testcase */
45 }
46 
47 START_TEST(test_hit_player) {
48  object *victim = NULL;
49  object *hitter = NULL;
50  object *floor = NULL;
51  mapstruct *map = NULL;
52  archetype *deplete = NULL;
53  int test;
54 
55  map = get_empty_map(5, 5);
56  floor = create_archetype("battleground");
57  fail_unless(floor != NULL, "can't find archetype battleground");
58  insert_ob_in_map_at(floor, map, NULL, 0, 0, 0);
59  floor = create_archetype("battleground");
60  fail_unless(floor != NULL, "can't find archetype battleground");
61  insert_ob_in_map_at(floor, map, NULL, 0, 1, 0);
62 
63  deplete = find_archetype(ARCH_DEPLETION);
64  fail_unless(deplete != NULL, "can't find archetype %s", ARCH_DEPLETION);
65 
66  victim = create_archetype("kobold");
67  fail_unless(victim != NULL, "couldn't create kobold");
68  fail_unless(victim->inv == NULL, "kobold shouldn't have an inventory");
69  victim->stats.hp = 5000;
70  victim->stats.maxhp = 5000;
71  victim->resist[ATNR_DEPLETE] = 100;
72  victim->resist[ATNR_FIRE] = 100;
73  insert_ob_in_map_at(victim, map, NULL, 0, 0, 0);
74  hitter = create_archetype("sword");
75  fail_unless(hitter != NULL, "couldn't create sword");
76  hitter->attacktype = AT_DEPLETE|AT_FIRE;
77  hitter->stats.dam = 100;
78  hitter->map = map;
79  insert_ob_in_map_at(hitter, map, NULL, 0, 1, 0);
80 
81  fail_unless(present_arch_in_ob(deplete, victim) == NULL, "victim shouldn't be depleted before being attacked");
82 
83  for (test = 0; test < 100; test++) {
84  hit_player(victim, hitter->stats.dam, hitter, hitter->attacktype, 0);
85  fail_unless(victim->stats.hp == victim->stats.maxhp, "victim should have %d hp and not %d.", victim->stats.maxhp, victim->stats.hp);
86  }
87  fail_unless(victim->inv == NULL, "kobold shouldn't have an inventory after attacked");
88  fail_unless(present_arch_in_ob(deplete, victim) == NULL, "victim shouldn't be depleted when slaying not set");
89 
90  hitter->slaying = add_string(victim->race);
91  victim->resist[ATNR_FIRE] = 95;
92  for (test = 0; test < 100 && present_arch_in_ob(deplete, victim) == NULL; test++) {
93  hit_player(victim, hitter->stats.dam, hitter, hitter->attacktype, 0);
94  }
95  fail_unless(present_arch_in_ob(deplete, victim) != NULL, "victim should be depleted when slaying is set");
96  fail_unless(victim->stats.hp != victim->stats.maxhp, "victim shouldn't have %d hp", victim->stats.hp);
97 }
98 END_TEST
99 
100 Suite *attack_suite(void) {
101  Suite *s = suite_create("attack");
102  TCase *tc_core = tcase_create("Core");
103 
104  /*setup and teardown will be called before each test in testcase 'tc_core' */
105  tcase_add_checked_fixture(tc_core, setup, teardown);
106 
107  suite_add_tcase(s, tc_core);
108  tcase_add_test(tc_core, test_hit_player);
109 
110  return s;
111 }
112 
113 int main(void) {
114  int nf;
115  Suite *s = attack_suite();
116  SRunner *sr = srunner_create(s);
117 
118  /* If you wish to debug the program, uncomment this line. */
119  /*srunner_set_fork_status (sr, CK_NOFORK); */
120 
121  settings.debug = 0;
122  init(0, NULL);
123 
124  srunner_set_xml(sr, LOGDIR "/unit/server/attack.xml");
125  srunner_set_log(sr, LOGDIR "/unit/server/attack.out");
126  srunner_run_all(sr, CK_ENV); /*verbosity from env variable*/
127  nf = srunner_ntests_failed(sr);
128  srunner_free(sr);
129  return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
130 }
archetype * find_archetype(const char *name)
Definition: arch.c:700
#define AT_DEPLETE
Definition: attack.h:120
const char * race
Definition: object.h:171
mapstruct * get_empty_map(int sizex, int sizey)
Definition: map.c:884
object * insert_ob_in_map_at(object *op, mapstruct *m, object *originator, int flag, int x, int y)
Definition: object.c:1761
#define ATNR_DEPLETE
Definition: attack.h:93
const char * slaying
Definition: object.h:172
LogLevel debug
Definition: global.h:327
Definition: object.h:321
sint16 hp
Definition: living.h:81
END_TEST Suite * attack_suite(void)
Definition: check_attack.c:100
sint16 maxhp
Definition: living.h:82
void teardown(void)
Definition: check_attack.c:43
object * create_archetype(const char *name)
Definition: arch.c:625
struct mapdef * map
Definition: object.h:155
#define ARCH_DEPLETION
Definition: object.h:405
sint16 dam
Definition: living.h:87
START_TEST(test_hit_player)
Definition: check_attack.c:47
#define AT_FIRE
Definition: attack.h:106
void setup(void)
Definition: check_attack.c:40
int main(void)
Definition: check_attack.c:113
void init(int argc, char **argv)
Definition: init.c:905
sint16 resist[NROFATTACKS]
Definition: object.h:192
uint32 attacktype
Definition: object.h:193
living stats
Definition: object.h:219
object * present_arch_in_ob(const archetype *at, const object *op)
Definition: object.c:2859
struct Settings settings
Definition: init.c:48
sstring add_string(const char *str)
Definition: shstr.c:116
struct obj * inv
Definition: object.h:148
Definition: map.h:346
int hit_player(object *op, int dam, object *hitter, uint32 type, int full_hit)
Definition: attack.c:1868
#define ATNR_FIRE
Definition: attack.h:79