comparison tests/test-drawable.c @ 143:4f4795cba52f

tests: forgot to add file
author David Demelier <markand@malikania.fr>
date Wed, 14 Oct 2020 14:52:26 +0200
parents
children 196264679079
comparison
equal deleted inserted replaced
142:fea0cc899931 143:4f4795cba52f
1 /*
2 * test-action.c -- test actions
3 *
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #define GREATEST_USE_ABBREVS 0
20 #include <greatest.h>
21
22 #include <core/drawable.h>
23 #include <core/event.h>
24
25 struct invokes {
26 bool update;
27 bool draw;
28 bool end;
29 bool finish;
30 };
31
32 #define INIT(dat, up) { \
33 .data = (dat), \
34 .update = (up), \
35 .draw = my_draw, \
36 .end = my_end, \
37 .finish = my_finish \
38 }
39
40 static bool
41 my_update_false(struct drawable *dw, unsigned int ticks)
42 {
43 (void)ticks;
44
45 ((struct invokes *)dw->data)->update = true;
46
47 return false;
48 }
49
50 static bool
51 my_update_true(struct drawable *dw, unsigned int ticks)
52 {
53 (void)ticks;
54
55 ((struct invokes *)dw->data)->update = true;
56
57 return true;
58 }
59
60 static void
61 my_draw(struct drawable *dw)
62 {
63 ((struct invokes *)dw->data)->draw = true;
64 }
65
66 static void
67 my_end(struct drawable *dw)
68 {
69 ((struct invokes *)dw->data)->end = true;
70 }
71
72 static void
73 my_finish(struct drawable *dw)
74 {
75 ((struct invokes *)dw->data)->finish = true;
76 }
77
78 GREATEST_TEST
79 basics_update(void)
80 {
81 struct {
82 struct invokes inv;
83 struct drawable dw;
84 } table[] = {
85 { .dw = INIT(&table[0], my_update_true) },
86 { .dw = INIT(&table[1], my_update_false) }
87 };
88
89 /* True version. */
90 GREATEST_ASSERT(drawable_update(&table[0].dw, 0));
91 GREATEST_ASSERT(table[0].inv.update);
92 GREATEST_ASSERT(!table[0].inv.draw);
93 GREATEST_ASSERT(!table[0].inv.end);
94 GREATEST_ASSERT(!table[0].inv.finish);
95
96 /* False version. */
97 GREATEST_ASSERT(!drawable_update(&table[1].dw, 0));
98 GREATEST_ASSERT(table[1].inv.update);
99 GREATEST_ASSERT(!table[1].inv.draw);
100 GREATEST_ASSERT(!table[1].inv.end);
101 GREATEST_ASSERT(!table[1].inv.finish);
102
103 GREATEST_PASS();
104 }
105
106 GREATEST_TEST
107 basics_draw(void)
108 {
109 struct invokes inv = {0};
110 struct drawable dw = INIT(&inv, my_update_true);
111
112 drawable_draw(&dw);
113
114 GREATEST_ASSERT(!inv.update);
115 GREATEST_ASSERT(inv.draw);
116 GREATEST_ASSERT(!inv.end);
117 GREATEST_ASSERT(!inv.finish);
118 GREATEST_PASS();
119 }
120
121 GREATEST_TEST
122 basics_end(void)
123 {
124 struct invokes inv = {0};
125 struct drawable dw = INIT(&inv, my_update_true);
126
127 drawable_end(&dw);
128
129 GREATEST_ASSERT(!inv.update);
130 GREATEST_ASSERT(!inv.draw);
131 GREATEST_ASSERT(inv.end);
132 GREATEST_ASSERT(!inv.finish);
133 GREATEST_PASS();
134 }
135
136 GREATEST_TEST
137 basics_finish(void)
138 {
139 struct invokes inv = {0};
140 struct drawable dw = INIT(&inv, my_update_true);
141
142 drawable_finish(&dw);
143
144 GREATEST_ASSERT(!inv.update);
145 GREATEST_ASSERT(!inv.draw);
146 GREATEST_ASSERT(!inv.end);
147 GREATEST_ASSERT(inv.finish);
148 GREATEST_PASS();
149 }
150
151 GREATEST_SUITE(suite_basics)
152 {
153 GREATEST_RUN_TEST(basics_update);
154 GREATEST_RUN_TEST(basics_draw);
155 GREATEST_RUN_TEST(basics_end);
156 GREATEST_RUN_TEST(basics_finish);
157 }
158
159 GREATEST_TEST
160 stack_add(void)
161 {
162 struct drawable_stack st = {0};
163 struct drawable dw = {0};
164
165 GREATEST_ASSERT(drawable_stack_add(&st, &dw));
166
167 /* Now fill up. */
168 for (int i = 0; i < DRAWABLE_STACK_MAX - 1; ++i)
169 GREATEST_ASSERT(drawable_stack_add(&st, &dw));
170
171 /* This one should not fit in. */
172 GREATEST_ASSERT(!drawable_stack_add(&st, &dw));
173
174 GREATEST_PASS();
175 }
176
177 GREATEST_TEST
178 stack_update(void)
179 {
180 struct {
181 struct invokes inv;
182 struct drawable dw;
183 } table[] = {
184 { .dw = INIT(&table[0], my_update_false) },
185 { .dw = INIT(&table[1], my_update_true) },
186 { .dw = INIT(&table[2], my_update_false) },
187 { .dw = INIT(&table[3], my_update_false) },
188 { .dw = INIT(&table[4], my_update_true) },
189 { .dw = INIT(&table[5], my_update_true) },
190 { .dw = INIT(&table[6], my_update_false) },
191 };
192
193 struct drawable_stack st = {0};
194
195 drawable_stack_add(&st, &table[0].dw);
196 drawable_stack_add(&st, &table[1].dw);
197 drawable_stack_add(&st, &table[2].dw);
198 drawable_stack_add(&st, &table[3].dw);
199 drawable_stack_add(&st, &table[4].dw);
200 drawable_stack_add(&st, &table[5].dw);
201 drawable_stack_add(&st, &table[6].dw);
202
203 GREATEST_ASSERT(!drawable_stack_update(&st, 0));
204
205 GREATEST_ASSERT(table[0].inv.update);
206 GREATEST_ASSERT(table[1].inv.update);
207 GREATEST_ASSERT(table[2].inv.update);
208 GREATEST_ASSERT(table[3].inv.update);
209 GREATEST_ASSERT(table[4].inv.update);
210 GREATEST_ASSERT(table[5].inv.update);
211 GREATEST_ASSERT(table[6].inv.update);
212
213 GREATEST_ASSERT(!table[0].inv.draw);
214 GREATEST_ASSERT(!table[1].inv.draw);
215 GREATEST_ASSERT(!table[2].inv.draw);
216 GREATEST_ASSERT(!table[3].inv.draw);
217 GREATEST_ASSERT(!table[4].inv.draw);
218 GREATEST_ASSERT(!table[5].inv.draw);
219 GREATEST_ASSERT(!table[6].inv.draw);
220
221 GREATEST_ASSERT(!table[0].inv.end);
222 GREATEST_ASSERT(table[1].inv.end);
223 GREATEST_ASSERT(!table[2].inv.end);
224 GREATEST_ASSERT(!table[3].inv.end);
225 GREATEST_ASSERT(table[4].inv.end);
226 GREATEST_ASSERT(table[5].inv.end);
227 GREATEST_ASSERT(!table[6].inv.end);
228
229 GREATEST_ASSERT(!table[0].inv.finish);
230 GREATEST_ASSERT(table[1].inv.finish);
231 GREATEST_ASSERT(!table[2].inv.finish);
232 GREATEST_ASSERT(!table[3].inv.finish);
233 GREATEST_ASSERT(table[4].inv.finish);
234 GREATEST_ASSERT(table[5].inv.finish);
235 GREATEST_ASSERT(!table[6].inv.finish);
236
237 /* The following must still be there. */
238 GREATEST_ASSERT_EQ(st.objects[0], &table[0].dw);
239 GREATEST_ASSERT_EQ(st.objects[2], &table[2].dw);
240 GREATEST_ASSERT_EQ(st.objects[3], &table[3].dw);
241 GREATEST_ASSERT_EQ(st.objects[6], &table[6].dw);
242
243 /* The following must have been NULL-ed. */
244 GREATEST_ASSERT_EQ(st.objects[1], NULL);
245 GREATEST_ASSERT_EQ(st.objects[4], NULL);
246 GREATEST_ASSERT_EQ(st.objects[5], NULL);
247
248 /*
249 * Now make all actions to return true and check if it cleans the stack.
250 */
251 table[0].dw.update =
252 table[2].dw.update =
253 table[3].dw.update =
254 table[6].dw.update = my_update_true;
255
256 GREATEST_ASSERT(drawable_stack_update(&st, 0));
257 GREATEST_ASSERT_EQ(st.objects[0], NULL);
258 GREATEST_ASSERT_EQ(st.objects[1], NULL);
259 GREATEST_ASSERT_EQ(st.objects[2], NULL);
260 GREATEST_ASSERT_EQ(st.objects[3], NULL);
261 GREATEST_ASSERT_EQ(st.objects[4], NULL);
262 GREATEST_ASSERT_EQ(st.objects[5], NULL);
263 GREATEST_ASSERT_EQ(st.objects[6], NULL);
264
265 GREATEST_PASS();
266 }
267
268 GREATEST_TEST
269 stack_finish(void)
270 {
271 struct {
272 struct invokes inv;
273 struct drawable dw;
274 } table[] = {
275 { .dw = INIT(&table[0], my_update_true) },
276 { .dw = INIT(&table[0], my_update_false) },
277 };
278 struct drawable_stack st = {0};
279
280 drawable_stack_add(&st, &table[0].dw);
281 drawable_stack_add(&st, &table[1].dw);
282 drawable_stack_finish(&st);
283
284 GREATEST_ASSERT(!table[0].inv.update);
285 GREATEST_ASSERT(!table[0].inv.draw);
286 GREATEST_ASSERT(table[0].inv.end);
287 GREATEST_ASSERT(table[0].inv.finish);
288
289 GREATEST_ASSERT(!table[0].inv.update);
290 GREATEST_ASSERT(!table[0].inv.draw);
291 GREATEST_ASSERT(table[0].inv.end);
292 GREATEST_ASSERT(table[0].inv.finish);
293
294 /* They should also be NULL'ed. */
295 GREATEST_ASSERT_EQ(st.objects[0], NULL);
296 GREATEST_ASSERT_EQ(st.objects[1], NULL);
297
298 GREATEST_PASS();
299 }
300
301 GREATEST_SUITE(suite_stack)
302 {
303 GREATEST_RUN_TEST(stack_add);
304 GREATEST_RUN_TEST(stack_update);
305 GREATEST_RUN_TEST(stack_finish);
306 }
307
308 GREATEST_MAIN_DEFS();
309
310 int
311 main(int argc, char **argv)
312 {
313 GREATEST_MAIN_BEGIN();
314 GREATEST_RUN_SUITE(suite_basics);
315 GREATEST_RUN_SUITE(suite_stack);
316 GREATEST_MAIN_END();
317
318 return 0;
319 }