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

serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 3c8c580 was 3c8c580, checked in by jxsvoboda <5887334+jxsvoboda@…>, 4 years ago

Open menu in separate popup window (WIP)

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