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

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

Create menu windows in the correct seat

Add a mechanism to set the seat of a new display window, UI window,
UI popup - input device ID. This is set to the ID of the device which
activated the menu (mouse, keyboard). The display server determines
the correct seat from there.

This makes sure clicking outside closes the correct pop-up window.

  • Property mode set to 100644
File size: 22.3 KB
Line 
1/*
2 * Copyright (c) 2023 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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
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.