source: mainline/uspace/lib/ui/test/menuentry.c@ 6828a56

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 6828a56 was 59768c7, checked in by Jiri Svoboda <jiri@…>, 3 years ago

Menu control using F10, cursor keys, Enter, Escape

  • Property mode set to 100644
File size: 22.2 KB
RevLine 
[95a9cbc]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 <ui/control.h>
35#include <ui/menu.h>
36#include <ui/menubar.h>
37#include <ui/menuentry.h>
38#include <ui/ui.h>
[c68c18b9]39#include <ui/window.h>
[95a9cbc]40#include "../private/menuentry.h"
41
42PCUT_INIT;
43
44PCUT_TEST_SUITE(menuentry);
45
46typedef struct {
47 bool activated;
48} test_resp_t;
49
50static void test_entry_cb(ui_menu_entry_t *, void *);
51
[6186f9f]52/** Create and destroy menu entry */
[95a9cbc]53PCUT_TEST(create_destroy)
54{
[c68c18b9]55 ui_t *ui = NULL;
56 ui_window_t *window = NULL;
57 ui_wnd_params_t params;
[6186f9f]58 ui_menu_bar_t *mbar = NULL;
59 ui_menu_t *menu = NULL;
60 ui_menu_entry_t *mentry = NULL;
61 errno_t rc;
62
[c68c18b9]63 rc = ui_create_disp(NULL, &ui);
[6186f9f]64 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
65
[c68c18b9]66 ui_wnd_params_init(&params);
67 params.caption = "Hello";
[6186f9f]68
[c68c18b9]69 rc = ui_window_create(ui, &params, &window);
[6186f9f]70 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]71 PCUT_ASSERT_NOT_NULL(window);
[6186f9f]72
[c68c18b9]73 rc = ui_menu_bar_create(ui, window, &mbar);
[6186f9f]74 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
75 PCUT_ASSERT_NOT_NULL(mbar);
76
77 rc = ui_menu_create(mbar, "Test", &menu);
78 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
79 PCUT_ASSERT_NOT_NULL(menu);
80
81 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
82 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
83 PCUT_ASSERT_NOT_NULL(mentry);
84
85 /* Just for sake of test. Menu entry is destroyed along with menu */
86 ui_menu_entry_destroy(mentry);
87
88 ui_menu_bar_destroy(mbar);
[c68c18b9]89 ui_window_destroy(window);
90 ui_destroy(ui);
[6186f9f]91}
92
93/** Create and destroy separator menu entry */
94PCUT_TEST(create_sep_destroy)
95{
[c68c18b9]96 ui_t *ui = NULL;
97 ui_window_t *window = NULL;
98 ui_wnd_params_t params;
[95a9cbc]99 ui_menu_bar_t *mbar = NULL;
[6186f9f]100 ui_menu_t *menu = NULL;
101 ui_menu_entry_t *mentry = NULL;
[95a9cbc]102 errno_t rc;
103
[c68c18b9]104 rc = ui_create_disp(NULL, &ui);
[6186f9f]105 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
106
[c68c18b9]107 ui_wnd_params_init(&params);
108 params.caption = "Hello";
[6186f9f]109
[c68c18b9]110 rc = ui_window_create(ui, &params, &window);
[6186f9f]111 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]112 PCUT_ASSERT_NOT_NULL(window);
[6186f9f]113
[c68c18b9]114 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]115 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
116 PCUT_ASSERT_NOT_NULL(mbar);
117
[6186f9f]118 rc = ui_menu_create(mbar, "Test", &menu);
119 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
120 PCUT_ASSERT_NOT_NULL(menu);
121
122 rc = ui_menu_entry_sep_create(menu, &mentry);
123 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
124 PCUT_ASSERT_NOT_NULL(mentry);
125
126 /* Just for sake of test. Menu entry is destroyed along with menu */
127 ui_menu_entry_destroy(mentry);
128
[95a9cbc]129 ui_menu_bar_destroy(mbar);
[c68c18b9]130 ui_window_destroy(window);
131 ui_destroy(ui);
[95a9cbc]132}
133
134/** ui_menu_bar_destroy() can take NULL argument (no-op) */
135PCUT_TEST(destroy_null)
136{
137 ui_menu_bar_destroy(NULL);
138}
139
140/** ui_menu_entry_set_cb() .. */
141PCUT_TEST(set_cb)
142{
[c68c18b9]143 ui_t *ui = NULL;
144 ui_window_t *window = NULL;
145 ui_wnd_params_t params;
[95a9cbc]146 ui_menu_bar_t *mbar = NULL;
147 ui_menu_t *menu = NULL;
148 ui_menu_entry_t *mentry = NULL;
149 test_resp_t resp;
150 errno_t rc;
151
[c68c18b9]152 rc = ui_create_disp(NULL, &ui);
[95a9cbc]153 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
154
[c68c18b9]155 ui_wnd_params_init(&params);
156 params.caption = "Hello";
[95a9cbc]157
[c68c18b9]158 rc = ui_window_create(ui, &params, &window);
[95a9cbc]159 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]160 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]161
[c68c18b9]162 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]163 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
164 PCUT_ASSERT_NOT_NULL(mbar);
165
166 rc = ui_menu_create(mbar, "Test", &menu);
167 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
168 PCUT_ASSERT_NOT_NULL(menu);
169
[b8b64a8]170 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
[95a9cbc]171 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
172 PCUT_ASSERT_NOT_NULL(mentry);
173
174 ui_menu_entry_set_cb(mentry, test_entry_cb, &resp);
175
176 resp.activated = false;
177 ui_menu_entry_cb(mentry);
178 PCUT_ASSERT_TRUE(resp.activated);
179
180 ui_menu_bar_destroy(mbar);
[c68c18b9]181 ui_window_destroy(window);
182 ui_destroy(ui);
[95a9cbc]183}
184
185/** ui_menu_entry_first() / ui_menu_entry_next() iterate over entries */
186PCUT_TEST(first_next)
187{
[c68c18b9]188 ui_t *ui = NULL;
189 ui_window_t *window = NULL;
190 ui_wnd_params_t params;
[95a9cbc]191 ui_menu_bar_t *mbar = NULL;
192 ui_menu_t *menu = NULL;
193 ui_menu_entry_t *entry1 = NULL;
194 ui_menu_entry_t *entry2 = NULL;
195 ui_menu_entry_t *e;
196 errno_t rc;
197
[c68c18b9]198 rc = ui_create_disp(NULL, &ui);
[95a9cbc]199 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
200
[c68c18b9]201 ui_wnd_params_init(&params);
202 params.caption = "Hello";
[95a9cbc]203
[c68c18b9]204 rc = ui_window_create(ui, &params, &window);
[95a9cbc]205 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]206 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]207
[c68c18b9]208 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]209 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
210 PCUT_ASSERT_NOT_NULL(mbar);
211
212 rc = ui_menu_create(mbar, "Test", &menu);
213 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
214 PCUT_ASSERT_NOT_NULL(menu);
215
[b8b64a8]216 rc = ui_menu_entry_create(menu, "Foo", "F1", &entry1);
[95a9cbc]217 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
218 PCUT_ASSERT_NOT_NULL(entry1);
219
[b8b64a8]220 rc = ui_menu_entry_create(menu, "Bar", "F2", &entry2);
[95a9cbc]221 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
222 PCUT_ASSERT_NOT_NULL(entry2);
223
224 e = ui_menu_entry_first(menu);
225 PCUT_ASSERT_EQUALS(entry1, e);
226
227 e = ui_menu_entry_next(e);
228 PCUT_ASSERT_EQUALS(entry2, e);
229
230 e = ui_menu_entry_next(e);
231 PCUT_ASSERT_NULL(e);
232
233 ui_menu_bar_destroy(mbar);
[c68c18b9]234 ui_window_destroy(window);
235 ui_destroy(ui);
[95a9cbc]236}
237
[59768c7]238/** ui_menu_entry_last() / ui_menu_entry_prev() iterate over entries in reverse */
239PCUT_TEST(last_prev)
240{
241 ui_t *ui = NULL;
242 ui_window_t *window = NULL;
243 ui_wnd_params_t params;
244 ui_menu_bar_t *mbar = NULL;
245 ui_menu_t *menu = NULL;
246 ui_menu_entry_t *entry1 = NULL;
247 ui_menu_entry_t *entry2 = NULL;
248 ui_menu_entry_t *e;
249 errno_t rc;
250
251 rc = ui_create_disp(NULL, &ui);
252 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
253
254 ui_wnd_params_init(&params);
255 params.caption = "Hello";
256
257 rc = ui_window_create(ui, &params, &window);
258 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
259 PCUT_ASSERT_NOT_NULL(window);
260
261 rc = ui_menu_bar_create(ui, window, &mbar);
262 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
263 PCUT_ASSERT_NOT_NULL(mbar);
264
265 rc = ui_menu_create(mbar, "Test", &menu);
266 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
267 PCUT_ASSERT_NOT_NULL(menu);
268
269 rc = ui_menu_entry_create(menu, "Foo", "F1", &entry1);
270 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
271 PCUT_ASSERT_NOT_NULL(entry1);
272
273 rc = ui_menu_entry_create(menu, "Bar", "F2", &entry2);
274 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
275 PCUT_ASSERT_NOT_NULL(entry2);
276
277 e = ui_menu_entry_last(menu);
278 PCUT_ASSERT_EQUALS(entry2, e);
279
280 e = ui_menu_entry_prev(e);
281 PCUT_ASSERT_EQUALS(entry1, e);
282
283 e = ui_menu_entry_prev(e);
284 PCUT_ASSERT_NULL(e);
285
286 ui_menu_bar_destroy(mbar);
287 ui_window_destroy(window);
288 ui_destroy(ui);
289}
290
[c68c18b9]291/** ui_menu_entry_column_widths() / ui_menu_entry_height() */
[b8b64a8]292PCUT_TEST(widths_height)
[95a9cbc]293{
[c68c18b9]294 ui_t *ui = NULL;
295 ui_window_t *window = NULL;
296 ui_wnd_params_t params;
[95a9cbc]297 ui_menu_bar_t *mbar = NULL;
298 ui_menu_t *menu = NULL;
299 ui_menu_entry_t *mentry = NULL;
[b8b64a8]300 gfx_coord_t caption_w;
301 gfx_coord_t shortcut_w;
[95a9cbc]302 gfx_coord_t width;
303 gfx_coord_t height;
304 errno_t rc;
305
[c68c18b9]306 rc = ui_create_disp(NULL, &ui);
[95a9cbc]307 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
308
[c68c18b9]309 ui_wnd_params_init(&params);
310 params.caption = "Hello";
[95a9cbc]311
[c68c18b9]312 rc = ui_window_create(ui, &params, &window);
[95a9cbc]313 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]314 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]315
[c68c18b9]316 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]317 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
318 PCUT_ASSERT_NOT_NULL(mbar);
319
320 rc = ui_menu_create(mbar, "Test", &menu);
321 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
322 PCUT_ASSERT_NOT_NULL(menu);
323
[b8b64a8]324 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]325 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
326 PCUT_ASSERT_NOT_NULL(mentry);
327
[b8b64a8]328 ui_menu_entry_column_widths(mentry, &caption_w, &shortcut_w);
329 PCUT_ASSERT_INT_EQUALS(11, caption_w);
330 PCUT_ASSERT_INT_EQUALS(10, shortcut_w);
331
332 width = ui_menu_entry_calc_width(menu, caption_w, shortcut_w);
333 PCUT_ASSERT_INT_EQUALS(4 + 11 + 8 + 10 + 4, width);
[95a9cbc]334
335 height = ui_menu_entry_height(mentry);
336 PCUT_ASSERT_INT_EQUALS(13 + 8, height);
337
338 ui_menu_bar_destroy(mbar);
[c68c18b9]339 ui_window_destroy(window);
340 ui_destroy(ui);
[95a9cbc]341}
342
343/** Paint menu entry */
344PCUT_TEST(paint)
345{
[3c8c580]346 ui_t *ui = NULL;
[c68c18b9]347 ui_window_t *window = NULL;
348 ui_wnd_params_t params;
[95a9cbc]349 ui_menu_bar_t *mbar = NULL;
350 ui_menu_t *menu = NULL;
351 ui_menu_entry_t *mentry = NULL;
352 gfx_coord2_t pos;
[3c8c580]353 gfx_rect_t prect;
[95a9cbc]354 errno_t rc;
355
[3c8c580]356 rc = ui_create_disp(NULL, &ui);
357 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
358
[c68c18b9]359 ui_wnd_params_init(&params);
360 params.caption = "Hello";
361
362 rc = ui_window_create(ui, &params, &window);
[95a9cbc]363 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]364 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]365
[c68c18b9]366 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]367 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
368 PCUT_ASSERT_NOT_NULL(mbar);
369
370 rc = ui_menu_create(mbar, "Test", &menu);
371 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
372 PCUT_ASSERT_NOT_NULL(menu);
373
[b8b64a8]374 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
[95a9cbc]375 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
376 PCUT_ASSERT_NOT_NULL(mentry);
377
[3c8c580]378 prect.p0.x = 0;
379 prect.p0.y = 0;
380 prect.p1.x = 0;
381 prect.p1.y = 0;
382
383 rc = ui_menu_open(menu, &prect);
384 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
385
[95a9cbc]386 pos.x = 0;
387 pos.y = 0;
388 rc = ui_menu_entry_paint(mentry, &pos);
389 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
390
391 ui_menu_bar_destroy(mbar);
[c68c18b9]392 ui_window_destroy(window);
[3c8c580]393 ui_destroy(ui);
[95a9cbc]394}
395
[59768c7]396/** ui_menu_entry_selectable() returns correct value based on entry type */
397PCUT_TEST(selectable)
398{
399 ui_t *ui = NULL;
400 ui_window_t *window = NULL;
401 ui_wnd_params_t params;
402 ui_menu_bar_t *mbar = NULL;
403 ui_menu_t *menu = NULL;
404 ui_menu_entry_t *mentry = NULL;
405 errno_t rc;
406
407 rc = ui_create_disp(NULL, &ui);
408 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
409
410 ui_wnd_params_init(&params);
411 params.caption = "Hello";
412
413 rc = ui_window_create(ui, &params, &window);
414 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
415 PCUT_ASSERT_NOT_NULL(window);
416
417 rc = ui_menu_bar_create(ui, window, &mbar);
418 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
419 PCUT_ASSERT_NOT_NULL(mbar);
420
421 rc = ui_menu_create(mbar, "Test", &menu);
422 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
423 PCUT_ASSERT_NOT_NULL(menu);
424
425 /* Selectable entry */
426
427 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
428 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
429 PCUT_ASSERT_NOT_NULL(mentry);
430
431 PCUT_ASSERT_TRUE(ui_menu_entry_selectable(mentry));
432
433 ui_menu_entry_destroy(mentry);
434
435 /* Non-selectable separator entry */
436
437 rc = ui_menu_entry_sep_create(menu, &mentry);
438 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
439 PCUT_ASSERT_NOT_NULL(mentry);
440
441 PCUT_ASSERT_FALSE(ui_menu_entry_selectable(mentry));
442
443 ui_menu_entry_destroy(mentry);
444
445 ui_menu_bar_destroy(mbar);
446 ui_window_destroy(window);
447 ui_destroy(ui);
448}
449
[95a9cbc]450/** Press and release activates menu entry */
451PCUT_TEST(press_release)
452{
[3c8c580]453 ui_t *ui = NULL;
[c68c18b9]454 ui_window_t *window = NULL;
455 ui_wnd_params_t params;
[95a9cbc]456 ui_menu_bar_t *mbar = NULL;
457 ui_menu_t *menu = NULL;
458 ui_menu_entry_t *mentry = NULL;
459 gfx_coord2_t pos;
[3c8c580]460 gfx_rect_t prect;
[95a9cbc]461 test_resp_t resp;
462 errno_t rc;
463
[3c8c580]464 rc = ui_create_disp(NULL, &ui);
465 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
466
[c68c18b9]467 ui_wnd_params_init(&params);
468 params.caption = "Hello";
469
470 rc = ui_window_create(ui, &params, &window);
[95a9cbc]471 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]472 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]473
[c68c18b9]474 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]475 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
476 PCUT_ASSERT_NOT_NULL(mbar);
477
478 rc = ui_menu_create(mbar, "Test", &menu);
479 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
480 PCUT_ASSERT_NOT_NULL(menu);
481
[b8b64a8]482 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]483 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
484 PCUT_ASSERT_NOT_NULL(mentry);
485
486 ui_menu_entry_set_cb(mentry, test_entry_cb, &resp);
487 resp.activated = false;
488
[3c8c580]489 prect.p0.x = 0;
490 prect.p0.y = 0;
491 prect.p1.x = 0;
492 prect.p1.y = 0;
493
494 rc = ui_menu_open(menu, &prect);
495 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
496
[95a9cbc]497 pos.x = 0;
498 pos.y = 0;
499 ui_menu_entry_press(mentry, &pos);
500 PCUT_ASSERT_TRUE(mentry->inside);
501 PCUT_ASSERT_TRUE(mentry->held);
502 PCUT_ASSERT_FALSE(resp.activated);
503
504 ui_menu_entry_release(mentry);
505 PCUT_ASSERT_FALSE(mentry->held);
506 PCUT_ASSERT_TRUE(resp.activated);
507
508 ui_menu_bar_destroy(mbar);
[c68c18b9]509 ui_window_destroy(window);
[3c8c580]510 ui_destroy(ui);
[95a9cbc]511}
512
513/** Press, leave and release does not activate entry */
514PCUT_TEST(press_leave_release)
515{
[3c8c580]516 ui_t *ui = NULL;
[c68c18b9]517 ui_window_t *window = NULL;
518 ui_wnd_params_t params;
[95a9cbc]519 ui_menu_bar_t *mbar = NULL;
520 ui_menu_t *menu = NULL;
521 ui_menu_entry_t *mentry = NULL;
522 gfx_coord2_t pos;
[3c8c580]523 gfx_rect_t prect;
[95a9cbc]524 test_resp_t resp;
525 errno_t rc;
526
[3c8c580]527 rc = ui_create_disp(NULL, &ui);
528 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
529
[c68c18b9]530 ui_wnd_params_init(&params);
531 params.caption = "Hello";
532
533 rc = ui_window_create(ui, &params, &window);
[95a9cbc]534 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]535 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]536
[c68c18b9]537 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]538 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
539 PCUT_ASSERT_NOT_NULL(mbar);
540
541 rc = ui_menu_create(mbar, "Test", &menu);
542 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
543 PCUT_ASSERT_NOT_NULL(menu);
544
[b8b64a8]545 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]546 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
547 PCUT_ASSERT_NOT_NULL(mentry);
548
549 ui_menu_entry_set_cb(mentry, test_entry_cb, &resp);
550 resp.activated = false;
551
[3c8c580]552 prect.p0.x = 0;
553 prect.p0.y = 0;
554 prect.p1.x = 0;
555 prect.p1.y = 0;
556
557 rc = ui_menu_open(menu, &prect);
558 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
559
[95a9cbc]560 pos.x = 0;
561 pos.y = 0;
562 ui_menu_entry_press(mentry, &pos);
563 PCUT_ASSERT_TRUE(mentry->inside);
564 PCUT_ASSERT_TRUE(mentry->held);
565 PCUT_ASSERT_FALSE(resp.activated);
566
567 ui_menu_entry_leave(mentry, &pos);
568 PCUT_ASSERT_FALSE(mentry->inside);
569 PCUT_ASSERT_TRUE(mentry->held);
570 PCUT_ASSERT_FALSE(resp.activated);
571
572 ui_menu_entry_release(mentry);
573 PCUT_ASSERT_FALSE(mentry->held);
574 PCUT_ASSERT_FALSE(resp.activated);
575
576 ui_menu_bar_destroy(mbar);
[c68c18b9]577 ui_window_destroy(window);
[3c8c580]578 ui_destroy(ui);
[95a9cbc]579}
580
581/** Press, leave, enter and release activates menu entry */
582PCUT_TEST(press_leave_enter_release)
583{
[3c8c580]584 ui_t *ui = NULL;
[c68c18b9]585 ui_window_t *window = NULL;
586 ui_wnd_params_t params;
[95a9cbc]587 ui_menu_bar_t *mbar = NULL;
588 ui_menu_t *menu = NULL;
589 ui_menu_entry_t *mentry = NULL;
590 gfx_coord2_t pos;
[3c8c580]591 gfx_rect_t prect;
[95a9cbc]592 test_resp_t resp;
593 errno_t rc;
594
[3c8c580]595 rc = ui_create_disp(NULL, &ui);
596 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
597
[c68c18b9]598 ui_wnd_params_init(&params);
599 params.caption = "Hello";
600
601 rc = ui_window_create(ui, &params, &window);
[95a9cbc]602 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]603 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]604
[c68c18b9]605 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]606 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
607 PCUT_ASSERT_NOT_NULL(mbar);
608
609 rc = ui_menu_create(mbar, "Test", &menu);
610 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
611 PCUT_ASSERT_NOT_NULL(menu);
612
[b8b64a8]613 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]614 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
615 PCUT_ASSERT_NOT_NULL(mentry);
616
617 ui_menu_entry_set_cb(mentry, test_entry_cb, &resp);
618 resp.activated = false;
619
[3c8c580]620 prect.p0.x = 0;
621 prect.p0.y = 0;
622 prect.p1.x = 0;
623 prect.p1.y = 0;
624
625 rc = ui_menu_open(menu, &prect);
626 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
627
[95a9cbc]628 pos.x = 0;
629 pos.y = 0;
630 ui_menu_entry_press(mentry, &pos);
631 PCUT_ASSERT_TRUE(mentry->inside);
632 PCUT_ASSERT_TRUE(mentry->held);
633 PCUT_ASSERT_FALSE(resp.activated);
634
635 ui_menu_entry_leave(mentry, &pos);
636 PCUT_ASSERT_FALSE(mentry->inside);
637 PCUT_ASSERT_TRUE(mentry->held);
638 PCUT_ASSERT_FALSE(resp.activated);
639
640 ui_menu_entry_enter(mentry, &pos);
641 PCUT_ASSERT_TRUE(mentry->inside);
642 PCUT_ASSERT_TRUE(mentry->held);
643 PCUT_ASSERT_FALSE(resp.activated);
644
645 ui_menu_entry_release(mentry);
646 PCUT_ASSERT_FALSE(mentry->held);
647 PCUT_ASSERT_TRUE(resp.activated);
648
649 ui_menu_bar_destroy(mbar);
[c68c18b9]650 ui_window_destroy(window);
[3c8c580]651 ui_destroy(ui);
[95a9cbc]652}
653
[59768c7]654/** ui_menu_entry_activate() activates menu entry */
655PCUT_TEST(activate)
656{
657 ui_t *ui = NULL;
658 ui_window_t *window = NULL;
659 ui_wnd_params_t params;
660 ui_menu_bar_t *mbar = NULL;
661 ui_menu_t *menu = NULL;
662 ui_menu_entry_t *mentry = NULL;
663 gfx_rect_t prect;
664 test_resp_t resp;
665 errno_t rc;
666
667 rc = ui_create_disp(NULL, &ui);
668 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
669
670 ui_wnd_params_init(&params);
671 params.caption = "Hello";
672
673 rc = ui_window_create(ui, &params, &window);
674 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
675 PCUT_ASSERT_NOT_NULL(window);
676
677 rc = ui_menu_bar_create(ui, window, &mbar);
678 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
679 PCUT_ASSERT_NOT_NULL(mbar);
680
681 rc = ui_menu_create(mbar, "Test", &menu);
682 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
683 PCUT_ASSERT_NOT_NULL(menu);
684
685 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
686 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
687 PCUT_ASSERT_NOT_NULL(mentry);
688
689 ui_menu_entry_set_cb(mentry, test_entry_cb, &resp);
690 resp.activated = false;
691
692 prect.p0.x = 0;
693 prect.p0.y = 0;
694 prect.p1.x = 0;
695 prect.p1.y = 0;
696
697 rc = ui_menu_open(menu, &prect);
698 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
699
700 PCUT_ASSERT_FALSE(resp.activated);
701 ui_menu_entry_activate(mentry);
702
703 ui_menu_entry_release(mentry);
704 PCUT_ASSERT_TRUE(resp.activated);
705
706 ui_menu_bar_destroy(mbar);
707 ui_window_destroy(window);
708 ui_destroy(ui);
709}
710
[95a9cbc]711/** Press event inside menu entry */
712PCUT_TEST(pos_press_inside)
713{
[3c8c580]714 ui_t *ui = NULL;
[c68c18b9]715 ui_window_t *window = NULL;
716 ui_wnd_params_t params;
[95a9cbc]717 ui_menu_bar_t *mbar = NULL;
718 ui_menu_t *menu = NULL;
719 ui_menu_entry_t *mentry = NULL;
720 gfx_coord2_t pos;
[3c8c580]721 gfx_rect_t prect;
[95a9cbc]722 pos_event_t event;
723 errno_t rc;
724
[3c8c580]725 rc = ui_create_disp(NULL, &ui);
726 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
727
[c68c18b9]728 ui_wnd_params_init(&params);
729 params.caption = "Hello";
730
731 rc = ui_window_create(ui, &params, &window);
[95a9cbc]732 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]733 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]734
[c68c18b9]735 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]736 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
737 PCUT_ASSERT_NOT_NULL(mbar);
738
739 rc = ui_menu_create(mbar, "Test", &menu);
740 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
741 PCUT_ASSERT_NOT_NULL(menu);
742
[b8b64a8]743 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]744 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
745 PCUT_ASSERT_NOT_NULL(mentry);
746
[3c8c580]747 prect.p0.x = 0;
748 prect.p0.y = 0;
749 prect.p1.x = 0;
750 prect.p1.y = 0;
751
752 rc = ui_menu_open(menu, &prect);
753 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
754
[95a9cbc]755 pos.x = 0;
756 pos.y = 0;
757
758 event.type = POS_PRESS;
759 event.hpos = 4;
760 event.vpos = 4;
761
762 ui_menu_entry_pos_event(mentry, &pos, &event);
763 PCUT_ASSERT_TRUE(mentry->inside);
764 PCUT_ASSERT_TRUE(mentry->held);
765
766 ui_menu_bar_destroy(mbar);
[c68c18b9]767 ui_window_destroy(window);
[3c8c580]768 ui_destroy(ui);
[95a9cbc]769}
770
771/** Press event outside menu entry */
772PCUT_TEST(pos_press_outside)
773{
[3c8c580]774 ui_t *ui = NULL;
[c68c18b9]775 ui_window_t *window = NULL;
776 ui_wnd_params_t params;
[95a9cbc]777 ui_menu_bar_t *mbar = NULL;
778 ui_menu_t *menu = NULL;
779 ui_menu_entry_t *mentry = NULL;
780 gfx_coord2_t pos;
[3c8c580]781 gfx_rect_t prect;
[95a9cbc]782 pos_event_t event;
783 errno_t rc;
784
[3c8c580]785 rc = ui_create_disp(NULL, &ui);
786 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
787
[c68c18b9]788 ui_wnd_params_init(&params);
789 params.caption = "Hello";
790
791 rc = ui_window_create(ui, &params, &window);
[95a9cbc]792 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]793 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]794
[c68c18b9]795 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]796 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
797 PCUT_ASSERT_NOT_NULL(mbar);
798
799 rc = ui_menu_create(mbar, "Test", &menu);
800 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
801 PCUT_ASSERT_NOT_NULL(menu);
802
[b8b64a8]803 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]804 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
805 PCUT_ASSERT_NOT_NULL(mentry);
806
[3c8c580]807 prect.p0.x = 0;
808 prect.p0.y = 0;
809 prect.p1.x = 0;
810 prect.p1.y = 0;
811
812 rc = ui_menu_open(menu, &prect);
813 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
814
[95a9cbc]815 pos.x = 0;
816 pos.y = 0;
817
818 event.type = POS_PRESS;
[b8b64a8]819 event.hpos = 40;
[95a9cbc]820 event.vpos = 20;
821
822 ui_menu_entry_pos_event(mentry, &pos, &event);
823 PCUT_ASSERT_FALSE(mentry->inside);
824 PCUT_ASSERT_FALSE(mentry->held);
825
826 ui_menu_bar_destroy(mbar);
[c68c18b9]827 ui_window_destroy(window);
[3c8c580]828 ui_destroy(ui);
[95a9cbc]829}
830
831/** Position event moving out of menu entry */
832PCUT_TEST(pos_move_out)
833{
[3c8c580]834 ui_t *ui = NULL;
[c68c18b9]835 ui_window_t *window = NULL;
836 ui_wnd_params_t params;
[95a9cbc]837 ui_menu_bar_t *mbar = NULL;
838 ui_menu_t *menu = NULL;
839 ui_menu_entry_t *mentry = NULL;
840 gfx_coord2_t pos;
[3c8c580]841 gfx_rect_t prect;
[95a9cbc]842 pos_event_t event;
843 errno_t rc;
844
[3c8c580]845 rc = ui_create_disp(NULL, &ui);
846 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
847
[c68c18b9]848 ui_wnd_params_init(&params);
849 params.caption = "Hello";
850
851 rc = ui_window_create(ui, &params, &window);
[95a9cbc]852 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]853 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]854
[c68c18b9]855 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]856 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
857 PCUT_ASSERT_NOT_NULL(mbar);
858
859 rc = ui_menu_create(mbar, "Test", &menu);
860 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
861 PCUT_ASSERT_NOT_NULL(menu);
862
[b8b64a8]863 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]864 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
865 PCUT_ASSERT_NOT_NULL(mentry);
866
[3c8c580]867 prect.p0.x = 0;
868 prect.p0.y = 0;
869 prect.p1.x = 0;
870 prect.p1.y = 0;
871
872 rc = ui_menu_open(menu, &prect);
873 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
874
[95a9cbc]875 pos.x = 0;
876 pos.y = 0;
877 ui_menu_entry_press(mentry, &pos);
878 PCUT_ASSERT_TRUE(mentry->inside);
879 PCUT_ASSERT_TRUE(mentry->held);
880
881 event.type = POS_UPDATE;
[b8b64a8]882 event.hpos = 40;
[95a9cbc]883 event.vpos = 20;
884
885 ui_menu_entry_pos_event(mentry, &pos, &event);
886 PCUT_ASSERT_FALSE(mentry->inside);
887 PCUT_ASSERT_TRUE(mentry->held);
888
889 ui_menu_bar_destroy(mbar);
[c68c18b9]890 ui_window_destroy(window);
[3c8c580]891 ui_destroy(ui);
[95a9cbc]892}
893
894/** Position event moving inside menu entry */
895PCUT_TEST(pos_move_in)
896{
[3c8c580]897 ui_t *ui = NULL;
[c68c18b9]898 ui_window_t *window = NULL;
899 ui_wnd_params_t params;
[95a9cbc]900 ui_menu_bar_t *mbar = NULL;
901 ui_menu_t *menu = NULL;
902 ui_menu_entry_t *mentry = NULL;
903 gfx_coord2_t pos;
[3c8c580]904 gfx_rect_t prect;
[95a9cbc]905 pos_event_t event;
906 errno_t rc;
907
[3c8c580]908 rc = ui_create_disp(NULL, &ui);
909 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
910
[c68c18b9]911 ui_wnd_params_init(&params);
912 params.caption = "Hello";
913
914 rc = ui_window_create(ui, &params, &window);
[95a9cbc]915 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]916 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]917
[c68c18b9]918 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]919 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
920 PCUT_ASSERT_NOT_NULL(mbar);
921
922 rc = ui_menu_create(mbar, "Test", &menu);
923 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
924 PCUT_ASSERT_NOT_NULL(menu);
925
[b8b64a8]926 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]927 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
928 PCUT_ASSERT_NOT_NULL(mentry);
929
[3c8c580]930 prect.p0.x = 0;
931 prect.p0.y = 0;
932 prect.p1.x = 0;
933 prect.p1.y = 0;
934
935 rc = ui_menu_open(menu, &prect);
936 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
937
[95a9cbc]938 event.type = POS_UPDATE;
939 event.hpos = 4;
940 event.vpos = 4;
941
942 pos.x = 0;
943 pos.y = 0;
944
945 ui_menu_entry_pos_event(mentry, &pos, &event);
946 PCUT_ASSERT_TRUE(mentry->inside);
947 PCUT_ASSERT_FALSE(mentry->held);
948
949 ui_menu_bar_destroy(mbar);
[c68c18b9]950 ui_window_destroy(window);
[3c8c580]951 ui_destroy(ui);
[95a9cbc]952}
953
954static void test_entry_cb(ui_menu_entry_t *mentry, void *arg)
955{
956 test_resp_t *resp = (test_resp_t *) arg;
957
958 resp->activated = true;
959}
960
961PCUT_EXPORT(menuentry);
Note: See TracBrowser for help on using the repository browser.