source: mainline/uspace/lib/ui/test/menu.c@ 6c0766b

serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6c0766b was ff6e91b, checked in by Jiri Svoboda <jiri@…>, 4 years ago

Make use of code page 437 characters

To draw proper text boxes, for a nice round radio button light,
for a nice contiguous slider groove.

  • Property mode set to 100644
File size: 10.6 KB
Line 
1/*
2 * Copyright (c) 2021 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <gfx/context.h>
30#include <gfx/coord.h>
31#include <mem.h>
32#include <pcut/pcut.h>
33#include <stdbool.h>
34#include <str.h>
35#include <ui/control.h>
36#include <ui/menu.h>
37#include <ui/menubar.h>
38#include <ui/ui.h>
39#include <ui/window.h>
40#include "../private/menu.h"
41#include "../private/menubar.h"
42
43PCUT_INIT;
44
45PCUT_TEST_SUITE(menu);
46
47/** Create and destroy menu */
48PCUT_TEST(create_destroy)
49{
50 ui_menu_bar_t *mbar = NULL;
51 ui_menu_t *menu = NULL;
52 errno_t rc;
53
54 rc = ui_menu_bar_create(NULL, NULL, &mbar);
55 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
56
57 rc = ui_menu_create(mbar, "Test", &menu);
58 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
59 PCUT_ASSERT_NOT_NULL(menu);
60
61 /*
62 * Normally we don't need to destroy a menu explicitly, it will
63 * be destroyed along with menu bar, but here we'll test destroying
64 * it explicitly.
65 */
66 ui_menu_destroy(menu);
67 ui_menu_bar_destroy(mbar);
68}
69
70/** ui_menu_destroy() can take NULL argument (no-op) */
71PCUT_TEST(destroy_null)
72{
73 ui_menu_destroy(NULL);
74}
75
76/** ui_menu_first() / ui_menu_next() iterate over menus */
77PCUT_TEST(first_next)
78{
79 ui_t *ui = NULL;
80 ui_window_t *window = NULL;
81 ui_wnd_params_t params;
82 ui_menu_bar_t *mbar = NULL;
83 ui_menu_t *menu1 = NULL;
84 ui_menu_t *menu2 = NULL;
85 ui_menu_t *m;
86 errno_t rc;
87
88 rc = ui_create_disp(NULL, &ui);
89 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
90
91 ui_wnd_params_init(&params);
92 params.caption = "Hello";
93
94 rc = ui_window_create(ui, &params, &window);
95 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
96 PCUT_ASSERT_NOT_NULL(window);
97
98 rc = ui_menu_bar_create(ui, window, &mbar);
99 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
100 PCUT_ASSERT_NOT_NULL(mbar);
101
102 rc = ui_menu_create(mbar, "Test 1", &menu1);
103 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
104 PCUT_ASSERT_NOT_NULL(menu1);
105
106 rc = ui_menu_create(mbar, "Test 1", &menu2);
107 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
108 PCUT_ASSERT_NOT_NULL(menu2);
109
110 m = ui_menu_first(mbar);
111 PCUT_ASSERT_EQUALS(menu1, m);
112
113 m = ui_menu_next(m);
114 PCUT_ASSERT_EQUALS(menu2, m);
115
116 m = ui_menu_next(m);
117 PCUT_ASSERT_NULL(m);
118
119 ui_menu_bar_destroy(mbar);
120 ui_window_destroy(window);
121 ui_destroy(ui);
122}
123
124/** ui_menu_caption() returns the menu's caption */
125PCUT_TEST(caption)
126{
127 ui_t *ui = NULL;
128 ui_window_t *window = NULL;
129 ui_wnd_params_t params;
130 ui_menu_bar_t *mbar = NULL;
131 ui_menu_t *menu = NULL;
132 const char *caption;
133 errno_t rc;
134
135 rc = ui_create_disp(NULL, &ui);
136 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
137
138 ui_wnd_params_init(&params);
139 params.caption = "Hello";
140
141 rc = ui_window_create(ui, &params, &window);
142 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
143 PCUT_ASSERT_NOT_NULL(window);
144
145 rc = ui_menu_bar_create(ui, window, &mbar);
146 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
147 PCUT_ASSERT_NOT_NULL(mbar);
148
149 rc = ui_menu_create(mbar, "Test", &menu);
150 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
151 PCUT_ASSERT_NOT_NULL(menu);
152
153 caption = ui_menu_caption(menu);
154 PCUT_ASSERT_NOT_NULL(caption);
155
156 PCUT_ASSERT_INT_EQUALS(0, str_cmp(caption, "Test"));
157
158 ui_menu_bar_destroy(mbar);
159 ui_window_destroy(window);
160 ui_destroy(ui);
161}
162
163/** ui_menu_get_rect() returns outer menu rectangle */
164PCUT_TEST(get_rect)
165{
166 ui_t *ui = NULL;
167 ui_window_t *window = NULL;
168 ui_wnd_params_t params;
169 ui_menu_bar_t *mbar = NULL;
170 ui_menu_t *menu = NULL;
171 gfx_coord2_t pos;
172 gfx_rect_t rect;
173 const char *caption;
174 errno_t rc;
175
176 rc = ui_create_disp(NULL, &ui);
177 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
178
179 ui_wnd_params_init(&params);
180 params.caption = "Hello";
181
182 rc = ui_window_create(ui, &params, &window);
183 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
184 PCUT_ASSERT_NOT_NULL(window);
185
186 rc = ui_menu_bar_create(ui, window, &mbar);
187 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
188 PCUT_ASSERT_NOT_NULL(mbar);
189
190 rc = ui_menu_create(mbar, "Test", &menu);
191 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
192 PCUT_ASSERT_NOT_NULL(menu);
193
194 caption = ui_menu_caption(menu);
195 PCUT_ASSERT_NOT_NULL(caption);
196
197 pos.x = 0;
198 pos.y = 0;
199 ui_menu_get_rect(menu, &pos, &rect);
200
201 PCUT_ASSERT_INT_EQUALS(0, rect.p0.x);
202 PCUT_ASSERT_INT_EQUALS(0, rect.p0.y);
203 PCUT_ASSERT_INT_EQUALS(16, rect.p1.x);
204 PCUT_ASSERT_INT_EQUALS(8, rect.p1.y);
205
206 ui_menu_bar_destroy(mbar);
207 ui_window_destroy(window);
208 ui_destroy(ui);
209}
210
211/** Paint background in graphics mode */
212PCUT_TEST(paint_bg_gfx)
213{
214 ui_t *ui = NULL;
215 ui_window_t *window = NULL;
216 ui_wnd_params_t params;
217 ui_menu_bar_t *mbar = NULL;
218 ui_menu_t *menu = NULL;
219 gfx_rect_t prect;
220 gfx_coord2_t pos;
221 errno_t rc;
222
223 rc = ui_create_disp(NULL, &ui);
224 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
225
226 ui_wnd_params_init(&params);
227 params.caption = "Hello";
228
229 rc = ui_window_create(ui, &params, &window);
230 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
231 PCUT_ASSERT_NOT_NULL(window);
232
233 rc = ui_menu_bar_create(ui, window, &mbar);
234 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
235 PCUT_ASSERT_NOT_NULL(mbar);
236
237 rc = ui_menu_create(mbar, "Test", &menu);
238 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
239 PCUT_ASSERT_NOT_NULL(menu);
240
241 prect.p0.x = 0;
242 prect.p0.y = 0;
243 prect.p1.x = 0;
244 prect.p1.y = 0;
245
246 /* Menu needs to be open to be able to paint it */
247 rc = ui_menu_open(menu, &prect);
248 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
249
250 pos.x = 0;
251 pos.y = 0;
252 rc = ui_menu_paint_bg_gfx(menu, &pos);
253 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
254
255 ui_menu_bar_destroy(mbar);
256 ui_window_destroy(window);
257 ui_destroy(ui);
258}
259
260/** Paint background in text mode */
261PCUT_TEST(paint_bg_text)
262{
263 ui_t *ui = NULL;
264 ui_window_t *window = NULL;
265 ui_wnd_params_t params;
266 ui_menu_bar_t *mbar = NULL;
267 ui_menu_t *menu = NULL;
268 gfx_rect_t prect;
269 gfx_coord2_t pos;
270 errno_t rc;
271
272 rc = ui_create_disp(NULL, &ui);
273 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
274
275 ui_wnd_params_init(&params);
276 params.caption = "Hello";
277
278 rc = ui_window_create(ui, &params, &window);
279 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
280 PCUT_ASSERT_NOT_NULL(window);
281
282 rc = ui_menu_bar_create(ui, window, &mbar);
283 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
284 PCUT_ASSERT_NOT_NULL(mbar);
285
286 rc = ui_menu_create(mbar, "Test", &menu);
287 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
288 PCUT_ASSERT_NOT_NULL(menu);
289
290 prect.p0.x = 0;
291 prect.p0.y = 0;
292 prect.p1.x = 0;
293 prect.p1.y = 0;
294
295 /* Menu needs to be open to be able to paint it */
296 rc = ui_menu_open(menu, &prect);
297 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
298
299 pos.x = 0;
300 pos.y = 0;
301 rc = ui_menu_paint_bg_text(menu, &pos);
302 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
303
304 ui_menu_bar_destroy(mbar);
305 ui_window_destroy(window);
306 ui_destroy(ui);
307}
308
309/** Paint menu */
310PCUT_TEST(paint)
311{
312 ui_t *ui = NULL;
313 ui_window_t *window = NULL;
314 ui_wnd_params_t params;
315 ui_menu_bar_t *mbar = NULL;
316 ui_menu_t *menu = NULL;
317 gfx_rect_t prect;
318 gfx_coord2_t pos;
319 errno_t rc;
320
321 rc = ui_create_disp(NULL, &ui);
322 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
323
324 ui_wnd_params_init(&params);
325 params.caption = "Hello";
326
327 rc = ui_window_create(ui, &params, &window);
328 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
329 PCUT_ASSERT_NOT_NULL(window);
330
331 rc = ui_menu_bar_create(ui, window, &mbar);
332 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
333 PCUT_ASSERT_NOT_NULL(mbar);
334
335 rc = ui_menu_create(mbar, "Test", &menu);
336 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
337 PCUT_ASSERT_NOT_NULL(menu);
338
339 prect.p0.x = 0;
340 prect.p0.y = 0;
341 prect.p1.x = 0;
342 prect.p1.y = 0;
343
344 /* Menu needs to be open to be able to paint it */
345 rc = ui_menu_open(menu, &prect);
346 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
347
348 pos.x = 0;
349 pos.y = 0;
350 rc = ui_menu_paint(menu, &pos);
351 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
352
353 ui_menu_bar_destroy(mbar);
354 ui_window_destroy(window);
355 ui_destroy(ui);
356}
357
358/** ui_menu_pos_event() inside menu is claimed */
359PCUT_TEST(pos_event_inside)
360{
361 ui_t *ui = NULL;
362 ui_window_t *window = NULL;
363 ui_wnd_params_t params;
364 ui_menu_bar_t *mbar = NULL;
365 ui_menu_t *menu = NULL;
366 ui_evclaim_t claimed;
367 gfx_coord2_t pos;
368 pos_event_t event;
369 errno_t rc;
370
371 rc = ui_create_disp(NULL, &ui);
372 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
373
374 ui_wnd_params_init(&params);
375 params.caption = "Hello";
376
377 rc = ui_window_create(ui, &params, &window);
378 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
379 PCUT_ASSERT_NOT_NULL(window);
380
381 rc = ui_menu_bar_create(ui, window, &mbar);
382 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
383 PCUT_ASSERT_NOT_NULL(mbar);
384
385 rc = ui_menu_create(mbar, "Test", &menu);
386 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
387 PCUT_ASSERT_NOT_NULL(menu);
388
389 pos.x = 0;
390 pos.y = 0;
391 event.type = POS_PRESS;
392 event.hpos = 0;
393 event.vpos = 0;
394 claimed = ui_menu_pos_event(menu, &pos, &event);
395 PCUT_ASSERT_EQUALS(ui_claimed, claimed);
396
397 ui_menu_bar_destroy(mbar);
398 ui_window_destroy(window);
399 ui_destroy(ui);
400}
401
402/** Computing menu geometry */
403PCUT_TEST(get_geom)
404{
405 ui_t *ui = NULL;
406 ui_window_t *window = NULL;
407 ui_wnd_params_t params;
408 ui_menu_bar_t *mbar = NULL;
409 ui_menu_t *menu = NULL;
410 ui_menu_geom_t geom;
411 gfx_coord2_t pos;
412 errno_t rc;
413
414 rc = ui_create_disp(NULL, &ui);
415 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
416
417 ui_wnd_params_init(&params);
418 params.caption = "Hello";
419
420 rc = ui_window_create(ui, &params, &window);
421 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
422 PCUT_ASSERT_NOT_NULL(window);
423
424 rc = ui_menu_bar_create(ui, window, &mbar);
425 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
426 PCUT_ASSERT_NOT_NULL(mbar);
427
428 rc = ui_menu_create(mbar, "Test", &menu);
429 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
430 PCUT_ASSERT_NOT_NULL(menu);
431
432 pos.x = 0;
433 pos.y = 0;
434 ui_menu_get_geom(menu, &pos, &geom);
435
436 PCUT_ASSERT_INT_EQUALS(0, geom.outer_rect.p0.x);
437 PCUT_ASSERT_INT_EQUALS(0, geom.outer_rect.p0.y);
438 PCUT_ASSERT_INT_EQUALS(16, geom.outer_rect.p1.x);
439 PCUT_ASSERT_INT_EQUALS(8, geom.outer_rect.p1.y);
440 PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p0.x);
441 PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p0.y);
442 PCUT_ASSERT_INT_EQUALS(12, geom.entries_rect.p1.x);
443 PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p1.y);
444
445 ui_menu_bar_destroy(mbar);
446 ui_window_destroy(window);
447 ui_destroy(ui);
448}
449
450PCUT_EXPORT(menu);
Note: See TracBrowser for help on using the repository browser.