Crossfire Server, Trunk  R20513
check_attack.c
Go to the documentation of this file.
1 /*
2  * static char *rcsid_check_attack_c =
3  * "$Id: check_attack.c 15379 2011-11-01 19:40:45Z ryo_saeba $";
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 static void setup(void) {
41 }
42 
43 static 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  object_insert_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  object_insert_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  object_insert_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  object_insert_in_map_at(hitter, map, NULL, 0, 1, 0);
80 
81  fail_unless(arch_present_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(arch_present_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 && arch_present_in_ob(deplete, victim) == NULL; test++) {
93  hit_player(victim, hitter->stats.dam, hitter, hitter->attacktype, 0);
94  }
95  fail_unless(arch_present_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 static 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)
Finds, using the hashtable, which archetype matches the given name.
Definition: arch.c:695
#define AT_DEPLETE
Definition: attack.h:92
const char * race
Human, goblin, dragon, etc.
Definition: object.h:318
mapstruct * get_empty_map(int sizex, int sizey)
Creates and returns a map of the specific size.
Definition: map.c:874
static void setup(void)
Definition: check_attack.c:40
#define ATNR_DEPLETE
Definition: attack.h:65
const char * slaying
Which race to do double damage to.
Definition: object.h:319
static void teardown(void)
Definition: check_attack.c:43
LogLevel debug
Default debugging level.
Definition: global.h:240
object * arch_present_in_ob(const archetype *at, const object *op)
Searches for any objects with a matching archetype in the inventory of the given object.
Definition: object.c:3061
Global type definitions and header inclusions.
The archetype structure is a set of rules on how to generate and manipulate objects which point to ar...
Definition: object.h:465
int16_t hp
Hit Points.
Definition: living.h:39
object * object_insert_in_map_at(object *op, mapstruct *m, object *originator, int flag, int x, int y)
Same as object_insert_in_map() except it handle separate coordinates and do a clean job preparing mul...
Definition: object.c:1921
int16_t maxhp
Max hit points.
Definition: living.h:40
object * create_archetype(const char *name)
Finds which archetype matches the given name, and returns a new object containing a copy of the arche...
Definition: arch.c:620
Defines for loader.l / loader.c.
struct mapdef * map
Pointer to the map in which this object is present.
Definition: object.h:297
#define ARCH_DEPLETION
Archetype for depletion.
Definition: object.h:579
int16_t dam
How much damage this object does when hitting.
Definition: living.h:45
START_TEST(test_hit_player)
Definition: check_attack.c:47
#define AT_FIRE
Definition: attack.h:78
int main(void)
Definition: check_attack.c:113
void init(int argc, char **argv)
This is the main server initialization function.
Definition: init.c:978
int16_t resist[NROFATTACKS]
Resistance adjustments for attacks.
Definition: object.h:341
uint32_t attacktype
Bitmask of attacks this object does.
Definition: object.h:342
living stats
Str, Con, Dex, etc.
Definition: object.h:368
static END_TEST Suite * attack_suite(void)
Definition: check_attack.c:100
struct Settings settings
Server settings.
Definition: init.c:40
sstring add_string(const char *str)
This will add &#39;str&#39; to the hash table.
Definition: shstr.c:124
struct obj * inv
Pointer to the first object in the inventory.
Definition: object.h:290
This is a game-map.
Definition: map.h:325
int hit_player(object *op, int dam, object *hitter, uint32_t type, int full_hit)
Object is attacked by something.
Definition: attack.c:1861
#define ATNR_FIRE
Definition: attack.h:51