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

Last change on this file was 46bd63c9, checked in by Jiri Svoboda <jiri@…>, 22 months ago

Split drop-down menu into two classes: drop-down and menu

Naming is clearly the hardest problem in computer science.

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