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

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

Specify parent window when creating popup

This will be used in conjunction with ui_wnd_popup_params_t.place
(a rectangle relative to the parent window) to determine where on
the screen the popup window should appear.

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