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

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d4ea1f6 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
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 <ui/control.h>
35#include <ui/menu.h>
36#include <ui/menubar.h>
37#include <ui/menuentry.h>
38#include <ui/ui.h>
39#include <ui/window.h>
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
52/** Create and destroy menu entry */
53PCUT_TEST(create_destroy)
54{
55 ui_t *ui = NULL;
56 ui_window_t *window = NULL;
57 ui_wnd_params_t params;
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
63 rc = ui_create_disp(NULL, &ui);
64 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
65
66 ui_wnd_params_init(&params);
67 params.caption = "Hello";
68
69 rc = ui_window_create(ui, &params, &window);
70 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
71 PCUT_ASSERT_NOT_NULL(window);
72
73 rc = ui_menu_bar_create(ui, window, &mbar);
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);
89 ui_window_destroy(window);
90 ui_destroy(ui);
91}
92
93/** Create and destroy separator menu entry */
94PCUT_TEST(create_sep_destroy)
95{
96 ui_t *ui = NULL;
97 ui_window_t *window = NULL;
98 ui_wnd_params_t params;
99 ui_menu_bar_t *mbar = NULL;
100 ui_menu_t *menu = NULL;
101 ui_menu_entry_t *mentry = NULL;
102 errno_t rc;
103
104 rc = ui_create_disp(NULL, &ui);
105 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
106
107 ui_wnd_params_init(&params);
108 params.caption = "Hello";
109
110 rc = ui_window_create(ui, &params, &window);
111 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
112 PCUT_ASSERT_NOT_NULL(window);
113
114 rc = ui_menu_bar_create(ui, window, &mbar);
115 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
116 PCUT_ASSERT_NOT_NULL(mbar);
117
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
129 ui_menu_bar_destroy(mbar);
130 ui_window_destroy(window);
131 ui_destroy(ui);
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{
143 ui_t *ui = NULL;
144 ui_window_t *window = NULL;
145 ui_wnd_params_t params;
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
152 rc = ui_create_disp(NULL, &ui);
153 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
154
155 ui_wnd_params_init(&params);
156 params.caption = "Hello";
157
158 rc = ui_window_create(ui, &params, &window);
159 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
160 PCUT_ASSERT_NOT_NULL(window);
161
162 rc = ui_menu_bar_create(ui, window, &mbar);
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
170 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
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);
181 ui_window_destroy(window);
182 ui_destroy(ui);
183}
184
185/** ui_menu_entry_first() / ui_menu_entry_next() iterate over entries */
186PCUT_TEST(first_next)
187{
188 ui_t *ui = NULL;
189 ui_window_t *window = NULL;
190 ui_wnd_params_t params;
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
198 rc = ui_create_disp(NULL, &ui);
199 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
200
201 ui_wnd_params_init(&params);
202 params.caption = "Hello";
203
204 rc = ui_window_create(ui, &params, &window);
205 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
206 PCUT_ASSERT_NOT_NULL(window);
207
208 rc = ui_menu_bar_create(ui, window, &mbar);
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
216 rc = ui_menu_entry_create(menu, "Foo", "F1", &entry1);
217 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
218 PCUT_ASSERT_NOT_NULL(entry1);
219
220 rc = ui_menu_entry_create(menu, "Bar", "F2", &entry2);
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);
234 ui_window_destroy(window);
235 ui_destroy(ui);
236}
237
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
291/** ui_menu_entry_column_widths() / ui_menu_entry_height() */
292PCUT_TEST(widths_height)
293{
294 ui_t *ui = NULL;
295 ui_window_t *window = NULL;
296 ui_wnd_params_t params;
297 ui_menu_bar_t *mbar = NULL;
298 ui_menu_t *menu = NULL;
299 ui_menu_entry_t *mentry = NULL;
300 gfx_coord_t caption_w;
301 gfx_coord_t shortcut_w;
302 gfx_coord_t width;
303 gfx_coord_t height;
304 errno_t rc;
305
306 rc = ui_create_disp(NULL, &ui);
307 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
308
309 ui_wnd_params_init(&params);
310 params.caption = "Hello";
311
312 rc = ui_window_create(ui, &params, &window);
313 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
314 PCUT_ASSERT_NOT_NULL(window);
315
316 rc = ui_menu_bar_create(ui, window, &mbar);
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
324 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
325 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
326 PCUT_ASSERT_NOT_NULL(mentry);
327
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);
334
335 height = ui_menu_entry_height(mentry);
336 PCUT_ASSERT_INT_EQUALS(13 + 8, height);
337
338 ui_menu_bar_destroy(mbar);
339 ui_window_destroy(window);
340 ui_destroy(ui);
341}
342
343/** Paint menu entry */
344PCUT_TEST(paint)
345{
346 ui_t *ui = NULL;
347 ui_window_t *window = NULL;
348 ui_wnd_params_t params;
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;
353 gfx_rect_t prect;
354 errno_t rc;
355
356 rc = ui_create_disp(NULL, &ui);
357 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
358
359 ui_wnd_params_init(&params);
360 params.caption = "Hello";
361
362 rc = ui_window_create(ui, &params, &window);
363 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
364 PCUT_ASSERT_NOT_NULL(window);
365
366 rc = ui_menu_bar_create(ui, window, &mbar);
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
374 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
375 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
376 PCUT_ASSERT_NOT_NULL(mentry);
377
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
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);
392 ui_window_destroy(window);
393 ui_destroy(ui);
394}
395
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
450/** Press and release activates menu entry */
451PCUT_TEST(press_release)
452{
453 ui_t *ui = NULL;
454 ui_window_t *window = NULL;
455 ui_wnd_params_t params;
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;
460 gfx_rect_t prect;
461 test_resp_t resp;
462 errno_t rc;
463
464 rc = ui_create_disp(NULL, &ui);
465 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
466
467 ui_wnd_params_init(&params);
468 params.caption = "Hello";
469
470 rc = ui_window_create(ui, &params, &window);
471 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
472 PCUT_ASSERT_NOT_NULL(window);
473
474 rc = ui_menu_bar_create(ui, window, &mbar);
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
482 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
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
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
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);
509 ui_window_destroy(window);
510 ui_destroy(ui);
511}
512
513/** Press, leave and release does not activate entry */
514PCUT_TEST(press_leave_release)
515{
516 ui_t *ui = NULL;
517 ui_window_t *window = NULL;
518 ui_wnd_params_t params;
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;
523 gfx_rect_t prect;
524 test_resp_t resp;
525 errno_t rc;
526
527 rc = ui_create_disp(NULL, &ui);
528 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
529
530 ui_wnd_params_init(&params);
531 params.caption = "Hello";
532
533 rc = ui_window_create(ui, &params, &window);
534 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
535 PCUT_ASSERT_NOT_NULL(window);
536
537 rc = ui_menu_bar_create(ui, window, &mbar);
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
545 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
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
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
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);
577 ui_window_destroy(window);
578 ui_destroy(ui);
579}
580
581/** Press, leave, enter and release activates menu entry */
582PCUT_TEST(press_leave_enter_release)
583{
584 ui_t *ui = NULL;
585 ui_window_t *window = NULL;
586 ui_wnd_params_t params;
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;
591 gfx_rect_t prect;
592 test_resp_t resp;
593 errno_t rc;
594
595 rc = ui_create_disp(NULL, &ui);
596 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
597
598 ui_wnd_params_init(&params);
599 params.caption = "Hello";
600
601 rc = ui_window_create(ui, &params, &window);
602 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
603 PCUT_ASSERT_NOT_NULL(window);
604
605 rc = ui_menu_bar_create(ui, window, &mbar);
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
613 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
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
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
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);
650 ui_window_destroy(window);
651 ui_destroy(ui);
652}
653
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
711/** Press event inside menu entry */
712PCUT_TEST(pos_press_inside)
713{
714 ui_t *ui = NULL;
715 ui_window_t *window = NULL;
716 ui_wnd_params_t params;
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;
721 gfx_rect_t prect;
722 pos_event_t event;
723 errno_t rc;
724
725 rc = ui_create_disp(NULL, &ui);
726 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
727
728 ui_wnd_params_init(&params);
729 params.caption = "Hello";
730
731 rc = ui_window_create(ui, &params, &window);
732 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
733 PCUT_ASSERT_NOT_NULL(window);
734
735 rc = ui_menu_bar_create(ui, window, &mbar);
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
743 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
744 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
745 PCUT_ASSERT_NOT_NULL(mentry);
746
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
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);
767 ui_window_destroy(window);
768 ui_destroy(ui);
769}
770
771/** Press event outside menu entry */
772PCUT_TEST(pos_press_outside)
773{
774 ui_t *ui = NULL;
775 ui_window_t *window = NULL;
776 ui_wnd_params_t params;
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;
781 gfx_rect_t prect;
782 pos_event_t event;
783 errno_t rc;
784
785 rc = ui_create_disp(NULL, &ui);
786 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
787
788 ui_wnd_params_init(&params);
789 params.caption = "Hello";
790
791 rc = ui_window_create(ui, &params, &window);
792 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
793 PCUT_ASSERT_NOT_NULL(window);
794
795 rc = ui_menu_bar_create(ui, window, &mbar);
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
803 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
804 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
805 PCUT_ASSERT_NOT_NULL(mentry);
806
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
815 pos.x = 0;
816 pos.y = 0;
817
818 event.type = POS_PRESS;
819 event.hpos = 40;
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);
827 ui_window_destroy(window);
828 ui_destroy(ui);
829}
830
831/** Position event moving out of menu entry */
832PCUT_TEST(pos_move_out)
833{
834 ui_t *ui = NULL;
835 ui_window_t *window = NULL;
836 ui_wnd_params_t params;
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;
841 gfx_rect_t prect;
842 pos_event_t event;
843 errno_t rc;
844
845 rc = ui_create_disp(NULL, &ui);
846 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
847
848 ui_wnd_params_init(&params);
849 params.caption = "Hello";
850
851 rc = ui_window_create(ui, &params, &window);
852 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
853 PCUT_ASSERT_NOT_NULL(window);
854
855 rc = ui_menu_bar_create(ui, window, &mbar);
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
863 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
864 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
865 PCUT_ASSERT_NOT_NULL(mentry);
866
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
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;
882 event.hpos = 40;
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);
890 ui_window_destroy(window);
891 ui_destroy(ui);
892}
893
894/** Position event moving inside menu entry */
895PCUT_TEST(pos_move_in)
896{
897 ui_t *ui = NULL;
898 ui_window_t *window = NULL;
899 ui_wnd_params_t params;
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;
904 gfx_rect_t prect;
905 pos_event_t event;
906 errno_t rc;
907
908 rc = ui_create_disp(NULL, &ui);
909 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
910
911 ui_wnd_params_init(&params);
912 params.caption = "Hello";
913
914 rc = ui_window_create(ui, &params, &window);
915 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
916 PCUT_ASSERT_NOT_NULL(window);
917
918 rc = ui_menu_bar_create(ui, window, &mbar);
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
926 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
927 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
928 PCUT_ASSERT_NOT_NULL(mentry);
929
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
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);
950 ui_window_destroy(window);
951 ui_destroy(ui);
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.