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