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
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/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
[6186f9f]53/** Create and destroy menu entry */
[95a9cbc]54PCUT_TEST(create_destroy)
55{
[6186f9f]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
[3c8c580]73 rc = ui_menu_bar_create(NULL, resource, &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);
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;
[95a9cbc]98 ui_menu_bar_t *mbar = NULL;
[6186f9f]99 ui_menu_t *menu = NULL;
100 ui_menu_entry_t *mentry = NULL;
[95a9cbc]101 errno_t rc;
102
[6186f9f]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
[3c8c580]112 rc = ui_menu_bar_create(NULL, resource, &mbar);
[95a9cbc]113 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
114 PCUT_ASSERT_NOT_NULL(mbar);
115
[6186f9f]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
[95a9cbc]127 ui_menu_bar_destroy(mbar);
[6186f9f]128 dummygc_destroy(dgc);
[95a9cbc]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
[3c8c580]158 rc = ui_menu_bar_create(NULL, resource, &mbar);
[95a9cbc]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
[b8b64a8]166 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
[95a9cbc]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
[3c8c580]203 rc = ui_menu_bar_create(NULL, resource, &mbar);
[95a9cbc]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
[b8b64a8]211 rc = ui_menu_entry_create(menu, "Foo", "F1", &entry1);
[95a9cbc]212 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
213 PCUT_ASSERT_NOT_NULL(entry1);
214
[b8b64a8]215 rc = ui_menu_entry_create(menu, "Bar", "F2", &entry2);
[95a9cbc]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
[b8b64a8]233/** ui_menu_entry_widths() / ui_menu_entry_height() */
234PCUT_TEST(widths_height)
[95a9cbc]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;
[b8b64a8]242 gfx_coord_t caption_w;
243 gfx_coord_t shortcut_w;
[95a9cbc]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
[3c8c580]257 rc = ui_menu_bar_create(NULL, resource, &mbar);
[95a9cbc]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
[b8b64a8]265 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]266 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
267 PCUT_ASSERT_NOT_NULL(mentry);
268
[b8b64a8]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);
[95a9cbc]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;
[3c8c580]289 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]295 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]303 rc = ui_create_disp(NULL, &ui);
304 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
305
[95a9cbc]306 rc = ui_resource_create(gc, false, &resource);
307 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
308 PCUT_ASSERT_NOT_NULL(resource);
309
[3c8c580]310 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]318 rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
[95a9cbc]319 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
320 PCUT_ASSERT_NOT_NULL(mentry);
321
[3c8c580]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
[95a9cbc]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);
[3c8c580]337 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]346 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]352 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]361 rc = ui_create_disp(NULL, &ui);
362 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
363
[95a9cbc]364 rc = ui_resource_create(gc, false, &resource);
365 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
366 PCUT_ASSERT_NOT_NULL(resource);
367
[3c8c580]368 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]376 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]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
[3c8c580]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
[95a9cbc]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);
[3c8c580]404 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]413 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]419 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]428 rc = ui_create_disp(NULL, &ui);
429 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
430
[95a9cbc]431 rc = ui_resource_create(gc, false, &resource);
432 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
433 PCUT_ASSERT_NOT_NULL(resource);
434
[3c8c580]435 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]443 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]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
[3c8c580]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
[95a9cbc]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);
[3c8c580]476 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]485 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]491 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]500 rc = ui_create_disp(NULL, &ui);
501 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
502
[95a9cbc]503 rc = ui_resource_create(gc, false, &resource);
504 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
505 PCUT_ASSERT_NOT_NULL(resource);
506
[3c8c580]507 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]515 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]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
[3c8c580]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
[95a9cbc]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);
[3c8c580]553 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]562 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]568 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]577 rc = ui_create_disp(NULL, &ui);
578 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
579
[95a9cbc]580 rc = ui_resource_create(gc, false, &resource);
581 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
582 PCUT_ASSERT_NOT_NULL(resource);
583
[3c8c580]584 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]592 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]593 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
594 PCUT_ASSERT_NOT_NULL(mentry);
595
[3c8c580]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
[95a9cbc]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);
[3c8c580]617 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]626 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]632 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]641 rc = ui_create_disp(NULL, &ui);
642 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
643
[95a9cbc]644 rc = ui_resource_create(gc, false, &resource);
645 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
646 PCUT_ASSERT_NOT_NULL(resource);
647
[3c8c580]648 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]656 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]657 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
658 PCUT_ASSERT_NOT_NULL(mentry);
659
[3c8c580]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
[95a9cbc]668 pos.x = 0;
669 pos.y = 0;
670
671 event.type = POS_PRESS;
[b8b64a8]672 event.hpos = 40;
[95a9cbc]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);
[3c8c580]681 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]690 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]696 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]705 rc = ui_create_disp(NULL, &ui);
706 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
707
[95a9cbc]708 rc = ui_resource_create(gc, false, &resource);
709 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
710 PCUT_ASSERT_NOT_NULL(resource);
711
[3c8c580]712 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]720 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]721 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
722 PCUT_ASSERT_NOT_NULL(mentry);
723
[3c8c580]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
[95a9cbc]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;
[b8b64a8]739 event.hpos = 40;
[95a9cbc]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);
[3c8c580]748 ui_destroy(ui);
[95a9cbc]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;
[3c8c580]757 ui_t *ui = NULL;
[95a9cbc]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;
[3c8c580]763 gfx_rect_t prect;
[95a9cbc]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
[3c8c580]772 rc = ui_create_disp(NULL, &ui);
773 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
774
[95a9cbc]775 rc = ui_resource_create(gc, false, &resource);
776 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
777 PCUT_ASSERT_NOT_NULL(resource);
778
[3c8c580]779 rc = ui_menu_bar_create(ui, resource, &mbar);
[95a9cbc]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
[b8b64a8]787 rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
[95a9cbc]788 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
789 PCUT_ASSERT_NOT_NULL(mentry);
790
[3c8c580]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
[95a9cbc]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);
[3c8c580]812 ui_destroy(ui);
[95a9cbc]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.