1 /* game/basic.c */
2
3 #include "unit-test.h"
4 #include "unit-test-data.h"
5 #include "test-utils.h"
6
7 #include <stdio.h>
8 #include "cave.h"
9 #include "cmd-core.h"
10 #include "game-event.h"
11 #include "game-world.h"
12 #include "init.h"
13 #include "savefile.h"
14 #include "player.h"
15 #include "player-timed.h"
16 #include "z-util.h"
17
event_message(game_event_type type,game_event_data * data,void * user)18 static void event_message(game_event_type type, game_event_data *data, void *user) {
19 printf("Message: %s\n", data->message.msg);
20 }
21
println(const char * str)22 static void println(const char *str) {
23 printf("%s\n", str);
24 }
25
setup_tests(void ** state)26 int setup_tests(void **state) {
27 /* Register a basic error handler */
28 plog_aux = println;
29
30 /* Register some display functions */
31 event_add_handler(EVENT_MESSAGE, event_message, NULL);
32 event_add_handler(EVENT_INITSTATUS, event_message, NULL);
33
34 /* Init the game */
35 set_file_paths();
36 init_angband();
37
38 return 0;
39 }
40
teardown_tests(void * state)41 int teardown_tests(void *state) {
42 file_delete("Test1");
43 cleanup_angband();
44 return 0;
45 }
46
test_newgame(void * state)47 int test_newgame(void *state) {
48
49 /* Try making a new game */
50
51 cmdq_push(CMD_BIRTH_INIT);
52 cmdq_push(CMD_BIRTH_RESET);
53 cmdq_push(CMD_CHOOSE_RACE);
54 cmd_set_arg_choice(cmdq_peek(), "choice", 0);
55
56 cmdq_push(CMD_CHOOSE_CLASS);
57 cmd_set_arg_choice(cmdq_peek(), "choice", 0);
58
59 cmdq_push(CMD_ROLL_STATS);
60 cmdq_push(CMD_NAME_CHOICE);
61 cmd_set_arg_string(cmdq_peek(), "name", "Tester");
62
63 cmdq_push(CMD_ACCEPT_CHARACTER);
64 cmdq_execute(CTX_BIRTH);
65
66 eq(player->is_dead, false);
67 prepare_next_level(&cave, player);
68 on_new_level();
69 notnull(cave);
70 eq(player->chp, player->mhp);
71 eq(player->timed[TMD_FOOD], PY_FOOD_FULL - 1);
72
73 /* Should be all set up to save properly now */
74 eq(savefile_save("Test1"), true);
75
76 /* Make sure it saved properly */
77 eq(file_exists("Test1"), true);
78
79 ok;
80 }
81
test_loadgame(void * state)82 int test_loadgame(void *state) {
83
84 /* Try loading the just-saved game */
85 eq(savefile_load("Test1", false), true);
86
87 eq(player->is_dead, false);
88 notnull(cave);
89 eq(player->chp, player->mhp);
90 eq(player->timed[TMD_FOOD], PY_FOOD_FULL - 1);
91
92 ok;
93 }
94
test_stairs1(void * state)95 int test_stairs1(void *state) {
96
97 /* Load the saved game */
98 eq(savefile_load("Test1", false), true);
99
100 cmdq_push(CMD_GO_DOWN);
101 run_game_loop();
102 eq(player->depth, 1);
103
104 ok;
105 }
106
test_stairs2(void * state)107 int test_stairs2(void *state) {
108
109 /* Load the saved game */
110 eq(savefile_load("Test1", false), true);
111
112 cmdq_push(CMD_WALK);
113 cmd_set_arg_direction(cmdq_peek(), "direction", 2);
114 run_game_loop();
115 cmdq_push(CMD_WALK);
116 cmd_set_arg_direction(cmdq_peek(), "direction", 8);
117 run_game_loop();
118 cmdq_push(CMD_GO_DOWN);
119 run_game_loop();
120 eq(player->depth, 1);
121
122 ok;
123 }
124
test_drop_pickup(void * state)125 int test_drop_pickup(void *state) {
126
127 /* Load the saved game */
128 eq(savefile_load("Test1", false), true);
129
130 cmdq_push(CMD_WALK);
131 cmd_set_arg_direction(cmdq_peek(), "direction", 2);
132 run_game_loop();
133 if (player->upkeep->inven[0]->number > 1) {
134 cmdq_push(CMD_DROP);
135 cmd_set_arg_item(cmdq_peek(), "item", player->upkeep->inven[0]);
136 cmd_set_arg_number(cmdq_peek(), "quantity", 1);
137 run_game_loop();
138 eq(square_object(cave, player->grid)->number, 1);
139 cmdq_push(CMD_AUTOPICKUP);
140 run_game_loop();
141 }
142 null(square_object(cave, player->grid));
143
144 ok;
145 }
146
test_drop_eat(void * state)147 int test_drop_eat(void *state) {
148 int num = 0;
149
150 /* Load the saved game */
151 eq(savefile_load("Test1", false), true);
152 num = player->upkeep->inven[0]->number;
153
154 cmdq_push(CMD_WALK);
155 cmd_set_arg_direction(cmdq_peek(), "direction", 2);
156 run_game_loop();
157 cmdq_push(CMD_DROP);
158 cmd_set_arg_item(cmdq_peek(), "item", player->upkeep->inven[0]);
159 cmd_set_arg_number(cmdq_peek(), "quantity",
160 player->upkeep->inven[0]->number);
161 run_game_loop();
162 eq(square_object(cave, player->grid)->number, num);
163 cmdq_push(CMD_EAT);
164 cmd_set_arg_item(cmdq_peek(), "item",
165 square_object(cave, player->grid));
166 run_game_loop();
167 if (num > 1) {
168 eq(square_object(cave, player->grid)->number, num - 1);
169 } else {
170 null(square_object(cave, player->grid));
171 }
172
173 ok;
174 }
175
176 const char *suite_name = "game/basic";
177 struct test tests[] = {
178 { "newgame", test_newgame },
179 { "loadgame", test_loadgame },
180 { "stairs1", test_stairs1 },
181 { "stairs2", test_stairs2 },
182 { "droppickup", test_drop_pickup },
183 { "dropeat", test_drop_eat },
184 { NULL, NULL }
185 };
186