source: mainline/uspace/lib/ui/test/menubar.c@ 4034954c

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 4034954c was 4034954c, checked in by Jiri Svoboda <jiri@…>, 21 months ago

Do not forget to close system menu. Close first, open second!

When moving out of system menu to menu bar we would forget to
close it. This was only causing noticeable problems in text mode.
Also we first close the current menu, then open the other one,
as juggling multiple popup windows in text mode could cause problems.

  • Property mode set to 100644
File size: 12.1 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/coord.h>
30#include <mem.h>
31#include <pcut/pcut.h>
32#include <stdbool.h>
33#include <ui/control.h>
34#include <ui/menubar.h>
[46bd63c9]35#include <ui/menudd.h>
[95a9cbc]36#include <ui/ui.h>
[c68c18b9]37#include <ui/window.h>
[95a9cbc]38#include "../private/menubar.h"
[8d1bcd7]39#include "../private/wdecor.h"
40#include "../private/window.h"
[95a9cbc]41
42PCUT_INIT;
43
44PCUT_TEST_SUITE(menubar);
45
46/** Create and destroy menu bar */
47PCUT_TEST(create_destroy)
48{
[8d1bcd7]49 ui_t *ui = NULL;
50 ui_window_t *window = NULL;
51 ui_wnd_params_t params;
[95a9cbc]52 ui_menu_bar_t *mbar = NULL;
53 errno_t rc;
54
[8d1bcd7]55 rc = ui_create_disp(NULL, &ui);
56 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
57
58 ui_wnd_params_init(&params);
59 params.caption = "Hello";
60
61 rc = ui_window_create(ui, &params, &window);
62 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
63 PCUT_ASSERT_NOT_NULL(window);
64
65 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]66 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
67 PCUT_ASSERT_NOT_NULL(mbar);
68
69 ui_menu_bar_destroy(mbar);
[8d1bcd7]70 ui_window_destroy(window);
71 ui_destroy(ui);
[95a9cbc]72}
73
74/** ui_menu_bar_destroy() can take NULL argument (no-op) */
75PCUT_TEST(destroy_null)
76{
77 ui_menu_bar_destroy(NULL);
78}
79
80/** ui_menu_bar_ctl() returns control that has a working virtual destructor */
81PCUT_TEST(ctl)
82{
[8d1bcd7]83 ui_t *ui = NULL;
84 ui_window_t *window = NULL;
85 ui_wnd_params_t params;
[95a9cbc]86 ui_menu_bar_t *mbar = NULL;
87 ui_control_t *control;
88 errno_t rc;
89
[8d1bcd7]90 rc = ui_create_disp(NULL, &ui);
91 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
92
93 ui_wnd_params_init(&params);
94 params.caption = "Hello";
95
96 rc = ui_window_create(ui, &params, &window);
97 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
98 PCUT_ASSERT_NOT_NULL(window);
99
100 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]101 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
102 PCUT_ASSERT_NOT_NULL(mbar);
103
104 control = ui_menu_bar_ctl(mbar);
105 PCUT_ASSERT_NOT_NULL(control);
106
107 ui_control_destroy(control);
[8d1bcd7]108 ui_window_destroy(window);
109 ui_destroy(ui);
[95a9cbc]110}
111
112/** Set menu bar rectangle sets internal field */
113PCUT_TEST(set_rect)
114{
115 errno_t rc;
[c68c18b9]116 ui_t *ui = NULL;
117 ui_window_t *window = NULL;
118 ui_wnd_params_t params;
[95a9cbc]119 ui_menu_bar_t *mbar = NULL;
120 gfx_rect_t rect;
121
[c68c18b9]122 rc = ui_create_disp(NULL, &ui);
[95a9cbc]123 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
124
[c68c18b9]125 ui_wnd_params_init(&params);
126 params.caption = "Hello";
[95a9cbc]127
[c68c18b9]128 rc = ui_window_create(ui, &params, &window);
[95a9cbc]129 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]130 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]131
[c68c18b9]132 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]133 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
134 PCUT_ASSERT_NOT_NULL(mbar);
135
136 rect.p0.x = 1;
137 rect.p0.y = 2;
138 rect.p1.x = 3;
139 rect.p1.y = 4;
140
141 ui_menu_bar_set_rect(mbar, &rect);
142 PCUT_ASSERT_INT_EQUALS(rect.p0.x, mbar->rect.p0.x);
143 PCUT_ASSERT_INT_EQUALS(rect.p0.y, mbar->rect.p0.y);
144 PCUT_ASSERT_INT_EQUALS(rect.p1.x, mbar->rect.p1.x);
145 PCUT_ASSERT_INT_EQUALS(rect.p1.y, mbar->rect.p1.y);
146
147 ui_menu_bar_destroy(mbar);
[c68c18b9]148 ui_window_destroy(window);
149 ui_destroy(ui);
[95a9cbc]150}
151
152/** Paint menu bar */
153PCUT_TEST(paint)
154{
[c68c18b9]155 ui_t *ui = NULL;
156 ui_window_t *window = NULL;
157 ui_wnd_params_t params;
[95a9cbc]158 ui_menu_bar_t *mbar = NULL;
159 errno_t rc;
160
[c68c18b9]161 rc = ui_create_disp(NULL, &ui);
[95a9cbc]162 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
163
[c68c18b9]164 ui_wnd_params_init(&params);
165 params.caption = "Hello";
[95a9cbc]166
[c68c18b9]167 rc = ui_window_create(ui, &params, &window);
[95a9cbc]168 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]169 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]170
[c68c18b9]171 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]172 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
173 PCUT_ASSERT_NOT_NULL(mbar);
174
175 rc = ui_menu_bar_paint(mbar);
176 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
177
178 ui_menu_bar_destroy(mbar);
[c68c18b9]179 ui_window_destroy(window);
180 ui_destroy(ui);
[95a9cbc]181}
182
[59768c7]183/** Deliver menu bar keyboard event */
184PCUT_TEST(kbd_event)
185{
186 ui_t *ui = NULL;
187 ui_window_t *window = NULL;
188 ui_wnd_params_t params;
189 ui_menu_bar_t *mbar = NULL;
190 ui_menu_t *menu = NULL;
191 ui_evclaim_t claimed;
192 kbd_event_t event;
193 gfx_rect_t rect;
194 errno_t rc;
195
196 rc = ui_create_disp(NULL, &ui);
197 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
198
199 ui_wnd_params_init(&params);
200 params.caption = "Hello";
201
202 rc = ui_window_create(ui, &params, &window);
203 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
204 PCUT_ASSERT_NOT_NULL(window);
205
206 rc = ui_menu_bar_create(ui, window, &mbar);
207 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
208 PCUT_ASSERT_NOT_NULL(mbar);
209
210 rect.p0.x = 0;
211 rect.p0.y = 0;
212 rect.p1.x = 50;
213 rect.p1.y = 25;
214 ui_menu_bar_set_rect(mbar, &rect);
215
[46bd63c9]216 rc = ui_menu_dd_create(mbar, "Test", NULL, &menu);
[59768c7]217 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
218 PCUT_ASSERT_NOT_NULL(menu);
219
220 event.type = KEY_PRESS;
[96c6a00]221 event.key = KC_F10;
222 event.mods = 0;
[5de852c]223 claimed = ui_menu_bar_kbd_event(mbar, &event);
[59768c7]224 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
225 PCUT_ASSERT_EQUALS(ui_claimed, claimed);
226
227 ui_menu_bar_destroy(mbar);
228 ui_window_destroy(window);
229 ui_destroy(ui);
230}
231
[b3b48f4]232/** ui_menu_bar_press_accel() opens the corresponding menu */
233PCUT_TEST(press_accel)
234{
235 ui_t *ui = NULL;
236 ui_window_t *window = NULL;
237 ui_wnd_params_t params;
238 ui_menu_bar_t *mbar = NULL;
239 ui_menu_t *menu = NULL;
[46bd63c9]240 ui_menu_dd_t *mdd = NULL;
[b3b48f4]241 gfx_rect_t rect;
242 errno_t rc;
243
244 rc = ui_create_disp(NULL, &ui);
245 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
246
247 ui_wnd_params_init(&params);
248 params.caption = "Hello";
249
250 rc = ui_window_create(ui, &params, &window);
251 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
252 PCUT_ASSERT_NOT_NULL(window);
253
254 rc = ui_menu_bar_create(ui, window, &mbar);
255 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
256 PCUT_ASSERT_NOT_NULL(mbar);
257
258 rect.p0.x = 0;
259 rect.p0.y = 0;
260 rect.p1.x = 50;
261 rect.p1.y = 25;
262 ui_menu_bar_set_rect(mbar, &rect);
263
[46bd63c9]264 rc = ui_menu_dd_create(mbar, "~T~est", &mdd, &menu);
[b3b48f4]265 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[46bd63c9]266 PCUT_ASSERT_NOT_NULL(mdd);
[b3b48f4]267 PCUT_ASSERT_NOT_NULL(menu);
268
[46bd63c9]269 PCUT_ASSERT_FALSE(ui_menu_dd_is_open(mdd));
[b3b48f4]270
[5d380b6]271 ui_menu_bar_press_accel(mbar, 't', 0);
[b3b48f4]272
[46bd63c9]273 PCUT_ASSERT_TRUE(ui_menu_dd_is_open(mdd));
[b3b48f4]274
275 ui_menu_bar_destroy(mbar);
276 ui_window_destroy(window);
277 ui_destroy(ui);
278}
279
[95a9cbc]280/** Press event on menu bar entry selects menu */
281PCUT_TEST(pos_event_select)
282{
[3c8c580]283 ui_t *ui = NULL;
[c68c18b9]284 ui_window_t *window = NULL;
285 ui_wnd_params_t params;
[95a9cbc]286 ui_menu_bar_t *mbar = NULL;
287 ui_menu_t *menu = NULL;
[46bd63c9]288 ui_menu_dd_t *mdd = NULL;
[95a9cbc]289 ui_evclaim_t claimed;
290 pos_event_t event;
291 gfx_rect_t rect;
292 errno_t rc;
293
[3c8c580]294 rc = ui_create_disp(NULL, &ui);
295 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
296
[c68c18b9]297 ui_wnd_params_init(&params);
298 params.caption = "Hello";
299
300 rc = ui_window_create(ui, &params, &window);
[95a9cbc]301 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]302 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]303
[c68c18b9]304 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]305 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
306 PCUT_ASSERT_NOT_NULL(mbar);
307
308 rect.p0.x = 0;
309 rect.p0.y = 0;
310 rect.p1.x = 50;
311 rect.p1.y = 25;
312 ui_menu_bar_set_rect(mbar, &rect);
313
[46bd63c9]314 rc = ui_menu_dd_create(mbar, "Test", &mdd, &menu);
[95a9cbc]315 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
316 PCUT_ASSERT_NOT_NULL(menu);
317
318 event.type = POS_PRESS;
319 event.hpos = 4;
320 event.vpos = 4;
321 claimed = ui_menu_bar_pos_event(mbar, &event);
322 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
323 PCUT_ASSERT_EQUALS(ui_claimed, claimed);
324
[46bd63c9]325 /* Clicking the menu bar entry should select menu drop-down */
326 PCUT_ASSERT_EQUALS(mdd, mbar->selected);
[95a9cbc]327
328 ui_menu_bar_destroy(mbar);
[c68c18b9]329 ui_window_destroy(window);
[3c8c580]330 ui_destroy(ui);
[95a9cbc]331}
332
333/** Calling ui_menu_bar_select() with another menu selects it */
334PCUT_TEST(select_different)
335{
[3c8c580]336 ui_t *ui = NULL;
[c68c18b9]337 ui_window_t *window = NULL;
338 ui_wnd_params_t params;
[95a9cbc]339 ui_menu_bar_t *mbar = NULL;
[46bd63c9]340 ui_menu_dd_t *mdd1 = NULL;
341 ui_menu_dd_t *mdd2 = NULL;
[95a9cbc]342 errno_t rc;
343
[3c8c580]344 rc = ui_create_disp(NULL, &ui);
345 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
346
[c68c18b9]347 ui_wnd_params_init(&params);
348 params.caption = "Hello";
349
350 rc = ui_window_create(ui, &params, &window);
[95a9cbc]351 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[c68c18b9]352 PCUT_ASSERT_NOT_NULL(window);
[95a9cbc]353
[c68c18b9]354 rc = ui_menu_bar_create(ui, window, &mbar);
[95a9cbc]355 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
356 PCUT_ASSERT_NOT_NULL(mbar);
357
[46bd63c9]358 rc = ui_menu_dd_create(mbar, "Test 1", &mdd1, NULL);
[95a9cbc]359 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[46bd63c9]360 PCUT_ASSERT_NOT_NULL(mdd1);
[95a9cbc]361
[46bd63c9]362 rc = ui_menu_dd_create(mbar, "Test 2", &mdd2, NULL);
[95a9cbc]363 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[46bd63c9]364 PCUT_ASSERT_NOT_NULL(mdd2);
[95a9cbc]365
[46bd63c9]366 ui_menu_bar_select(mbar, mdd1, true, 0);
367 PCUT_ASSERT_EQUALS(mdd1, mbar->selected);
[95a9cbc]368
369 /* Selecting different menu should select it */
[46bd63c9]370 ui_menu_bar_select(mbar, mdd2, true, 0);
371 PCUT_ASSERT_EQUALS(mdd2, mbar->selected);
[95a9cbc]372
373 ui_menu_bar_destroy(mbar);
[c68c18b9]374 ui_window_destroy(window);
[3c8c580]375 ui_destroy(ui);
[95a9cbc]376}
377
[8d1bcd7]378/** ui_menu_bar_select_first/last() selects first/last drop-down */
379PCUT_TEST(select_first_last)
380{
381 ui_t *ui = NULL;
382 ui_window_t *window = NULL;
383 ui_wnd_params_t params;
384 ui_menu_bar_t *mbar = NULL;
385 ui_menu_dd_t *mdd1 = NULL;
386 ui_menu_dd_t *mdd2 = NULL;
387 errno_t rc;
388
389 rc = ui_create_disp(NULL, &ui);
390 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
391
392 ui_wnd_params_init(&params);
393 params.caption = "Hello";
394
395 rc = ui_window_create(ui, &params, &window);
396 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
397 PCUT_ASSERT_NOT_NULL(window);
398
399 rc = ui_menu_bar_create(ui, window, &mbar);
400 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
401 PCUT_ASSERT_NOT_NULL(mbar);
402
403 rc = ui_menu_dd_create(mbar, "Test 1", &mdd1, NULL);
404 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
405 PCUT_ASSERT_NOT_NULL(mdd1);
406
407 rc = ui_menu_dd_create(mbar, "Test 2", &mdd2, NULL);
408 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
409 PCUT_ASSERT_NOT_NULL(mdd2);
410
411 ui_menu_bar_select_first(mbar, true, 0);
412 PCUT_ASSERT_EQUALS(mdd1, mbar->selected);
413
414 ui_menu_bar_select_last(mbar, true, 0);
415 PCUT_ASSERT_EQUALS(mdd2, mbar->selected);
416
417 ui_menu_bar_destroy(mbar);
418 ui_window_destroy(window);
419 ui_destroy(ui);
420}
421
422/** ui_menu_bar_select_sysmenu() activates system menu */
423PCUT_TEST(select_sysmenu)
424{
425 ui_t *ui = NULL;
426 ui_window_t *window = NULL;
427 ui_wnd_params_t params;
428 ui_menu_bar_t *mbar = NULL;
429 ui_menu_dd_t *mdd1 = NULL;
430 ui_menu_dd_t *mdd2 = NULL;
431 errno_t rc;
432
433 rc = ui_create_disp(NULL, &ui);
434 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
435
436 ui_wnd_params_init(&params);
437 params.caption = "Hello";
438
439 rc = ui_window_create(ui, &params, &window);
440 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
441 PCUT_ASSERT_NOT_NULL(window);
442
443 rc = ui_menu_bar_create(ui, window, &mbar);
444 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
445 PCUT_ASSERT_NOT_NULL(mbar);
446
447 rc = ui_menu_dd_create(mbar, "Test 1", &mdd1, NULL);
448 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
449 PCUT_ASSERT_NOT_NULL(mdd1);
450
451 rc = ui_menu_dd_create(mbar, "Test 2", &mdd2, NULL);
452 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
453 PCUT_ASSERT_NOT_NULL(mdd2);
454
[4034954c]455 ui_menu_bar_select_sysmenu(mbar, false, 0);
[8d1bcd7]456 PCUT_ASSERT_TRUE(window->wdecor->sysmenu_hdl_active);
457
458 ui_menu_bar_destroy(mbar);
459 ui_window_destroy(window);
460 ui_destroy(ui);
461}
462
[59768c7]463/** ui_menu_bar_activate() activates/deactivates menu bar */
464PCUT_TEST(activate_deactivate)
465{
466 ui_t *ui = NULL;
467 ui_window_t *window = NULL;
468 ui_wnd_params_t params;
469 ui_menu_bar_t *mbar = NULL;
[46bd63c9]470 ui_menu_dd_t *mdd = NULL;
[59768c7]471 errno_t rc;
472
473 rc = ui_create_disp(NULL, &ui);
474 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
475
476 ui_wnd_params_init(&params);
477 params.caption = "Hello";
478
479 rc = ui_window_create(ui, &params, &window);
480 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
481 PCUT_ASSERT_NOT_NULL(window);
482
483 rc = ui_menu_bar_create(ui, window, &mbar);
484 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
485 PCUT_ASSERT_NOT_NULL(mbar);
486
[46bd63c9]487 rc = ui_menu_dd_create(mbar, "Test", &mdd, NULL);
[59768c7]488 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
[46bd63c9]489 PCUT_ASSERT_NOT_NULL(mdd);
[59768c7]490
491 ui_menu_bar_activate(mbar);
[46bd63c9]492 PCUT_ASSERT_EQUALS(mdd, mbar->selected);
[59768c7]493
494 ui_menu_bar_deactivate(mbar);
495 PCUT_ASSERT_NULL(mbar->selected);
496
497 ui_menu_bar_destroy(mbar);
498 ui_window_destroy(window);
499 ui_destroy(ui);
500}
501
[95a9cbc]502PCUT_EXPORT(menubar);
Note: See TracBrowser for help on using the repository browser.