source: mainline/uspace/lib/ui/test/window.c@ 2fe799a

ticket/834-toolchain-update
Last change on this file since 2fe799a was 2fe799a, checked in by Vojtech Horky <vojtech.horky@…>, 2 years ago

Use keyboard, not mouse enum

  • Property mode set to 100644
File size: 23.5 KB
RevLine 
[f7a90df]1/*
[46a47c0]2 * Copyright (c) 2023 Jiri Svoboda
[f7a90df]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
[d284ce9]29#include <gfx/context.h>
30#include <gfx/coord.h>
[66a2becf]31#include <gfx/render.h>
[f03d1308]32#include <io/kbd_event.h>
[d284ce9]33#include <io/pos_event.h>
[f7a90df]34#include <mem.h>
35#include <pcut/pcut.h>
36#include <stdbool.h>
[b71c0fc]37#include <ui/control.h>
[3583ffb]38#include <ui/resource.h>
[f7a90df]39#include <ui/ui.h>
40#include <ui/window.h>
41#include "../private/window.h"
42
43PCUT_INIT;
44
45PCUT_TEST_SUITE(window);
46
[06176e1]47static void test_window_minimize(ui_window_t *, void *);
[35cffea]48static void test_window_maximize(ui_window_t *, void *);
49static void test_window_unmaximize(ui_window_t *, void *);
[d284ce9]50static void test_window_close(ui_window_t *, void *);
[46a47c0]51static void test_window_focus(ui_window_t *, void *, unsigned);
[f03d1308]52static void test_window_kbd(ui_window_t *, void *, kbd_event_t *);
[fa01c05]53static errno_t test_window_paint(ui_window_t *, void *);
[d284ce9]54static void test_window_pos(ui_window_t *, void *, pos_event_t *);
[46a47c0]55static void test_window_unfocus(ui_window_t *, void *, unsigned);
[d284ce9]56
57static ui_window_cb_t test_window_cb = {
[06176e1]58 .minimize = test_window_minimize,
[35cffea]59 .maximize = test_window_maximize,
60 .unmaximize = test_window_unmaximize,
[d284ce9]61 .close = test_window_close,
[f03d1308]62 .focus = test_window_focus,
63 .kbd = test_window_kbd,
[fa01c05]64 .paint = test_window_paint,
[f03d1308]65 .pos = test_window_pos,
66 .unfocus = test_window_unfocus
[d284ce9]67};
68
69static ui_window_cb_t dummy_window_cb = {
70};
71
[b71c0fc]72static errno_t test_ctl_paint(void *);
73static ui_evclaim_t test_ctl_pos_event(void *, pos_event_t *);
[46a47c0]74static void test_ctl_unfocus(void *, unsigned);
[b71c0fc]75
76static ui_control_ops_t test_ctl_ops = {
77 .paint = test_ctl_paint,
[62223ec]78 .pos_event = test_ctl_pos_event,
79 .unfocus = test_ctl_unfocus
[b71c0fc]80};
81
[d284ce9]82typedef struct {
[fa01c05]83 errno_t rc;
[06176e1]84 bool minimize;
[35cffea]85 bool maximize;
86 bool unmaximize;
[d284ce9]87 bool close;
[f03d1308]88 bool focus;
[46a47c0]89 unsigned focus_nfocus;
[f03d1308]90 bool kbd;
91 kbd_event_t kbd_event;
[fa01c05]92 bool paint;
[d284ce9]93 bool pos;
94 pos_event_t pos_event;
[f03d1308]95 bool unfocus;
[46a47c0]96 unsigned unfocus_nfocus;
[d284ce9]97} test_cb_resp_t;
98
[b71c0fc]99typedef struct {
100 errno_t rc;
101 ui_evclaim_t claim;
102 bool paint;
103 bool pos;
104 pos_event_t pos_event;
[62223ec]105 bool unfocus;
[46a47c0]106 unsigned unfocus_nfocus;
[b71c0fc]107} test_ctl_resp_t;
108
[f7a90df]109/** Create and destroy window */
110PCUT_TEST(create_destroy)
111{
112 errno_t rc;
113 ui_t *ui = NULL;
[d284ce9]114 ui_wnd_params_t params;
[f7a90df]115 ui_window_t *window = NULL;
116
117 rc = ui_create_disp(NULL, &ui);
118 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
119
[d284ce9]120 ui_wnd_params_init(&params);
[f7a90df]121 params.caption = "Hello";
122
123 rc = ui_window_create(ui, &params, &window);
124 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
125 PCUT_ASSERT_NOT_NULL(window);
126
127 ui_window_destroy(window);
128 ui_destroy(ui);
129}
130
131/** ui_window_destroy() can take NULL argument (no-op) */
132PCUT_TEST(destroy_null)
133{
134 ui_window_destroy(NULL);
135}
136
[b71c0fc]137/** ui_window_add()/ui_window_remove() ... */
138PCUT_TEST(add_remove)
139{
140 errno_t rc;
141 ui_t *ui = NULL;
142 ui_wnd_params_t params;
143 ui_window_t *window = NULL;
144 ui_control_t *control = NULL;
145 test_ctl_resp_t resp;
146
147 rc = ui_create_disp(NULL, &ui);
148 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
149
150 ui_wnd_params_init(&params);
151 params.caption = "Hello";
152
153 rc = ui_window_create(ui, &params, &window);
154 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
155 PCUT_ASSERT_NOT_NULL(window);
156
157 rc = ui_control_new(&test_ctl_ops, &resp, &control);
158 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
159
160 /* Control not called since it hasn't been added yet */
161 resp.rc = ENOMEM;
162 resp.paint = false;
163 rc = ui_window_def_paint(window);
164 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
165 PCUT_ASSERT_FALSE(resp.paint);
166
167 ui_window_add(window, control);
168
169 /* Now paint request should be delivered to control */
170 resp.rc = EOK;
171 resp.paint = false;
172 rc = ui_window_def_paint(window);
173 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
174 PCUT_ASSERT_TRUE(resp.paint);
175
176 ui_window_remove(window, control);
177
178 /*
179 * After having removed the control the request should no longer
180 * be delivered to it.
181 */
182 resp.rc = ENOMEM;
183 resp.paint = false;
184 rc = ui_window_def_paint(window);
185 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
186 PCUT_ASSERT_FALSE(resp.paint);
187
188 ui_window_destroy(window);
189 ui_destroy(ui);
190}
191
[252d03c]192/** ui_window_get_active */
193PCUT_TEST(get_active)
194{
195 errno_t rc;
196 ui_t *ui = NULL;
197 ui_wnd_params_t params;
198 ui_window_t *window1 = NULL;
199 ui_window_t *window2 = NULL;
200 ui_window_t *awnd;
201
202 rc = ui_create_cons(NULL, &ui);
203 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
204
205 awnd = ui_window_get_active(ui);
206 PCUT_ASSERT_NULL(awnd);
207
208 ui_wnd_params_init(&params);
209 params.caption = "Hello";
210
211 rc = ui_window_create(ui, &params, &window1);
212 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
213 PCUT_ASSERT_NOT_NULL(window1);
214
215 awnd = ui_window_get_active(ui);
216 PCUT_ASSERT_EQUALS(window1, awnd);
217
218 rc = ui_window_create(ui, &params, &window2);
219 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
220 PCUT_ASSERT_NOT_NULL(window2);
221
222 awnd = ui_window_get_active(ui);
223 PCUT_ASSERT_EQUALS(window2, awnd);
224
225 ui_window_destroy(window2);
226
227 awnd = ui_window_get_active(ui);
228 PCUT_ASSERT_EQUALS(window1, awnd);
229
230 ui_window_destroy(window1);
231
232 awnd = ui_window_get_active(ui);
233 PCUT_ASSERT_NULL(awnd);
234
235 ui_destroy(ui);
236}
237
[0576df9]238/** ui_window_resize */
239PCUT_TEST(resize)
240{
241 errno_t rc;
242 ui_t *ui = NULL;
243 ui_wnd_params_t params;
244 ui_window_t *window = NULL;
245 gfx_rect_t nrect;
246
247 rc = ui_create_disp(NULL, &ui);
248 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
249
250 ui_wnd_params_init(&params);
251 params.caption = "Hello";
252 params.rect.p0.x = 0;
253 params.rect.p0.y = 0;
254 params.rect.p1.x = 1;
255 params.rect.p1.y = 1;
256
257 rc = ui_window_create(ui, &params, &window);
258 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
259 PCUT_ASSERT_NOT_NULL(window);
260
261 nrect.p0.x = -1;
262 nrect.p0.y = -1;
263 nrect.p1.x = 2;
264 nrect.p1.y = 2;
265 rc = ui_window_resize(window, &nrect);
266 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
267
268 ui_window_destroy(window);
269 ui_destroy(ui);
270}
271
[3d10a2f]272/** ui_window_get_ui() returns containing UI */
273PCUT_TEST(get_ui)
274{
275 errno_t rc;
276 ui_t *ui = NULL;
277 ui_t *rui;
278 ui_wnd_params_t params;
279 ui_window_t *window = NULL;
280
281 rc = ui_create_disp(NULL, &ui);
282 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
283
284 ui_wnd_params_init(&params);
285 params.caption = "Hello";
286
287 rc = ui_window_create(ui, &params, &window);
288 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
289 PCUT_ASSERT_NOT_NULL(window);
290
291 rui = ui_window_get_ui(window);
292 PCUT_ASSERT_EQUALS(ui, rui);
293
294 ui_window_destroy(window);
295 ui_destroy(ui);
296}
297
[3583ffb]298/** ui_window_get_res/gc/rect() return valid objects */
299PCUT_TEST(get_res_gc_rect)
[d284ce9]300{
301 errno_t rc;
302 ui_t *ui = NULL;
303 ui_wnd_params_t params;
304 ui_window_t *window = NULL;
[3583ffb]305 ui_resource_t *res;
[d284ce9]306 gfx_context_t *gc;
307 gfx_rect_t rect;
308
309 rc = ui_create_disp(NULL, &ui);
310 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
311
312 ui_wnd_params_init(&params);
313 params.caption = "Hello";
314
315 rc = ui_window_create(ui, &params, &window);
316 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
317 PCUT_ASSERT_NOT_NULL(window);
318
[3583ffb]319 res = ui_window_get_res(window);
320 PCUT_ASSERT_NOT_NULL(res);
321
[d284ce9]322 gc = ui_window_get_gc(window);
323 PCUT_ASSERT_NOT_NULL(gc);
324
325 ui_window_get_app_rect(window, &rect);
326
327 ui_window_destroy(window);
328 ui_destroy(ui);
329}
330
[db3895d]331/** ui_window_set_ctl_cursor() */
332PCUT_TEST(set_ctl_cursor)
333{
334 errno_t rc;
335 ui_t *ui = NULL;
336 ui_wnd_params_t params;
337 ui_window_t *window = NULL;
338
339 rc = ui_create_disp(NULL, &ui);
340 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
341
342 ui_wnd_params_init(&params);
343 params.caption = "Hello";
344
345 rc = ui_window_create(ui, &params, &window);
346 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
347 PCUT_ASSERT_NOT_NULL(window);
348
349 ui_window_set_ctl_cursor(window, ui_curs_ibeam);
350
351 ui_window_destroy(window);
352 ui_destroy(ui);
353}
354
[66a2becf]355/** ui_window_get_app_gc() return valid GC */
356PCUT_TEST(get_app_gc)
357{
358 errno_t rc;
359 ui_t *ui = NULL;
360 ui_wnd_params_t params;
361 ui_window_t *window = NULL;
362 gfx_context_t *gc;
363
364 rc = ui_create_disp(NULL, &ui);
365 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
366
367 ui_wnd_params_init(&params);
368 params.caption = "Hello";
369 params.rect.p0.x = 0;
370 params.rect.p0.y = 0;
[2ab8ab3]371 params.rect.p0.x = 100;
372 params.rect.p0.y = 100;
[66a2becf]373
374 rc = ui_window_create(ui, &params, &window);
375 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
376 PCUT_ASSERT_NOT_NULL(window);
377
378 rc = ui_window_get_app_gc(window, &gc);
379 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
380 PCUT_ASSERT_NOT_NULL(gc);
381
382 rc = gfx_fill_rect(gc, &params.rect);
383 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
384
385 ui_window_destroy(window);
386 ui_destroy(ui);
387}
388
[fa01c05]389/** Test ui_window_paint() */
390PCUT_TEST(paint)
391{
392 errno_t rc;
393 ui_t *ui = NULL;
394 ui_wnd_params_t params;
395 ui_window_t *window = NULL;
396
397 rc = ui_create_disp(NULL, &ui);
398 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
399
400 ui_wnd_params_init(&params);
401 params.caption = "Hello";
402
403 rc = ui_window_create(ui, &params, &window);
404 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
405 PCUT_ASSERT_NOT_NULL(window);
406
407 ui_window_paint(window);
408
409 ui_window_destroy(window);
410 ui_destroy(ui);
411}
412
413/** Test ui_window_def_paint() */
414PCUT_TEST(def_paint)
415{
416 errno_t rc;
417 ui_t *ui = NULL;
418 ui_wnd_params_t params;
419 ui_window_t *window = NULL;
[b71c0fc]420 ui_control_t *control = NULL;
421 test_ctl_resp_t resp;
[fa01c05]422
423 rc = ui_create_disp(NULL, &ui);
424 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
425
426 ui_wnd_params_init(&params);
427 params.caption = "Hello";
428
429 rc = ui_window_create(ui, &params, &window);
430 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
431 PCUT_ASSERT_NOT_NULL(window);
432
[b71c0fc]433 rc = ui_control_new(&test_ctl_ops, &resp, &control);
434 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
435
436 ui_window_add(window, control);
437
438 resp.rc = EOK;
439 resp.paint = false;
440 rc = ui_window_def_paint(window);
441 PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
442 PCUT_ASSERT_TRUE(resp.paint);
443
444 resp.rc = ENOMEM;
445 resp.paint = false;
446 rc = ui_window_def_paint(window);
447 PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
448 PCUT_ASSERT_TRUE(resp.paint);
449
450 PCUT_ASSERT_TRUE(resp.paint);
451
452 /* Need to remove first because we didn't implement the destructor */
453 ui_window_remove(window, control);
454
455 ui_window_destroy(window);
456 ui_destroy(ui);
457}
458
459/** ui_window_def_pos() delivers position event to control in window */
460PCUT_TEST(def_pos)
461{
462 errno_t rc;
463 ui_t *ui = NULL;
464 ui_wnd_params_t params;
465 ui_window_t *window = NULL;
466 ui_control_t *control = NULL;
467 test_ctl_resp_t resp;
468 pos_event_t event;
469
470 rc = ui_create_disp(NULL, &ui);
471 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
472
473 ui_wnd_params_init(&params);
474 params.caption = "Hello";
475
476 rc = ui_window_create(ui, &params, &window);
477 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
478
479 rc = ui_control_new(&test_ctl_ops, &resp, &control);
480 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
481
482 ui_window_add(window, control);
483
484 event.pos_id = 1;
485 event.type = POS_PRESS;
486 event.btn_num = 2;
487 event.hpos = 3;
488 event.vpos = 4;
489
490 resp.pos = false;
491 resp.claim = ui_claimed;
492
493 ui_window_def_pos(window, &event);
494
495 PCUT_ASSERT_TRUE(resp.pos);
496 PCUT_ASSERT_INT_EQUALS(event.pos_id, resp.pos_event.pos_id);
497 PCUT_ASSERT_INT_EQUALS(event.type, resp.pos_event.type);
498 PCUT_ASSERT_INT_EQUALS(event.btn_num, resp.pos_event.btn_num);
499 PCUT_ASSERT_INT_EQUALS(event.hpos, resp.pos_event.hpos);
500 PCUT_ASSERT_INT_EQUALS(event.vpos, resp.pos_event.vpos);
501
502 /* Need to remove first because we didn't implement the destructor */
503 ui_window_remove(window, control);
[fa01c05]504
505 ui_window_destroy(window);
506 ui_destroy(ui);
507}
508
[62223ec]509/** ui_window_def_unfocus() delivers unfocus event to control in window */
510PCUT_TEST(def_unfocus)
511{
512 errno_t rc;
513 ui_t *ui = NULL;
514 ui_wnd_params_t params;
515 ui_window_t *window = NULL;
516 ui_control_t *control = NULL;
517 test_ctl_resp_t resp;
518
519 rc = ui_create_disp(NULL, &ui);
520 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
521
522 ui_wnd_params_init(&params);
523 params.caption = "Hello";
524
525 rc = ui_window_create(ui, &params, &window);
526 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
527
528 rc = ui_control_new(&test_ctl_ops, &resp, &control);
529 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
530
531 ui_window_add(window, control);
532
533 resp.unfocus = false;
534
[46a47c0]535 ui_window_def_unfocus(window, 42);
[62223ec]536 PCUT_ASSERT_TRUE(resp.unfocus);
[46a47c0]537 PCUT_ASSERT_INT_EQUALS(42, resp.unfocus_nfocus);
[62223ec]538
539 /* Need to remove first because we didn't implement the destructor */
540 ui_window_remove(window, control);
541
542 ui_window_destroy(window);
543 ui_destroy(ui);
544}
545
[06176e1]546/** ui_window_send_minimize() calls minimize callback set via ui_window_set_cb() */
547PCUT_TEST(send_minimize)
548{
549 errno_t rc;
550 ui_t *ui = NULL;
551 ui_wnd_params_t params;
552 ui_window_t *window = NULL;
553 test_cb_resp_t resp;
554
555 rc = ui_create_disp(NULL, &ui);
556 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
557
558 ui_wnd_params_init(&params);
559 params.caption = "Hello";
560
561 rc = ui_window_create(ui, &params, &window);
562 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
563 PCUT_ASSERT_NOT_NULL(window);
564
565 /* Minimize callback with no callbacks set */
566 ui_window_send_minimize(window);
567
568 /* Minimize callback with minimize callback not implemented */
569 ui_window_set_cb(window, &dummy_window_cb, NULL);
570 ui_window_send_minimize(window);
571
572 /* Minimize callback with real callback set */
573 resp.minimize = false;
574 ui_window_set_cb(window, &test_window_cb, &resp);
575 ui_window_send_minimize(window);
576 PCUT_ASSERT_TRUE(resp.minimize);
577
578 ui_window_destroy(window);
579 ui_destroy(ui);
580}
581
[35cffea]582/** ui_window_send_maximize() calls maximize callback set via ui_window_set_cb() */
583PCUT_TEST(send_maximize)
584{
585 errno_t rc;
586 ui_t *ui = NULL;
587 ui_wnd_params_t params;
588 ui_window_t *window = NULL;
589 test_cb_resp_t resp;
590
591 rc = ui_create_disp(NULL, &ui);
592 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
593
594 ui_wnd_params_init(&params);
595 params.caption = "Hello";
596
597 rc = ui_window_create(ui, &params, &window);
598 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
599 PCUT_ASSERT_NOT_NULL(window);
600
601 /* Maximize callback with no callbacks set */
602 ui_window_send_maximize(window);
603
604 /* Maximize callback with maximize callback not implemented */
605 ui_window_set_cb(window, &dummy_window_cb, NULL);
606 ui_window_send_maximize(window);
607
608 /* Maximize callback with real callback set */
609 resp.maximize = false;
610 ui_window_set_cb(window, &test_window_cb, &resp);
611 ui_window_send_maximize(window);
612 PCUT_ASSERT_TRUE(resp.maximize);
613
614 ui_window_destroy(window);
615 ui_destroy(ui);
616}
617
618/** ui_window_send_unmaximize() calls unmaximize callback set via ui_window_set_cb() */
619PCUT_TEST(send_unmaximize)
620{
621 errno_t rc;
622 ui_t *ui = NULL;
623 ui_wnd_params_t params;
624 ui_window_t *window = NULL;
625 test_cb_resp_t resp;
626
627 rc = ui_create_disp(NULL, &ui);
628 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
629
630 ui_wnd_params_init(&params);
631 params.caption = "Hello";
632
633 rc = ui_window_create(ui, &params, &window);
634 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
635 PCUT_ASSERT_NOT_NULL(window);
636
637 /* Unmaximize callback with no callbacks set */
638 ui_window_send_unmaximize(window);
639
640 /* Unmaximize callback with unmaximize callback not implemented */
641 ui_window_set_cb(window, &dummy_window_cb, NULL);
642 ui_window_send_unmaximize(window);
643
644 /* Unmaximize callback with real callback set */
645 resp.unmaximize = false;
646 ui_window_set_cb(window, &test_window_cb, &resp);
647 ui_window_send_unmaximize(window);
648 PCUT_ASSERT_TRUE(resp.unmaximize);
649
650 ui_window_destroy(window);
651 ui_destroy(ui);
652}
653
[fa01c05]654/** ui_window_send_close() calls close callback set via ui_window_set_cb() */
655PCUT_TEST(send_close)
[d284ce9]656{
657 errno_t rc;
658 ui_t *ui = NULL;
659 ui_wnd_params_t params;
660 ui_window_t *window = NULL;
661 test_cb_resp_t resp;
662
663 rc = ui_create_disp(NULL, &ui);
664 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
665
666 ui_wnd_params_init(&params);
667 params.caption = "Hello";
668
669 rc = ui_window_create(ui, &params, &window);
670 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
671 PCUT_ASSERT_NOT_NULL(window);
672
673 /* Close callback with no callbacks set */
[fa01c05]674 ui_window_send_close(window);
[d284ce9]675
676 /* Close callback with close callback not implemented */
677 ui_window_set_cb(window, &dummy_window_cb, NULL);
[fa01c05]678 ui_window_send_close(window);
[d284ce9]679
680 /* Close callback with real callback set */
681 resp.close = false;
682 ui_window_set_cb(window, &test_window_cb, &resp);
[fa01c05]683 ui_window_send_close(window);
[d284ce9]684 PCUT_ASSERT_TRUE(resp.close);
685
686 ui_window_destroy(window);
687 ui_destroy(ui);
688}
689
[fa01c05]690/** ui_window_send_focus() calls focus callback set via ui_window_set_cb() */
691PCUT_TEST(send_focus)
[f03d1308]692{
693 errno_t rc;
694 ui_t *ui = NULL;
695 ui_wnd_params_t params;
696 ui_window_t *window = NULL;
697 test_cb_resp_t resp;
698
699 rc = ui_create_disp(NULL, &ui);
700 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
701
702 ui_wnd_params_init(&params);
703 params.caption = "Hello";
704
705 rc = ui_window_create(ui, &params, &window);
706 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
707 PCUT_ASSERT_NOT_NULL(window);
708
709 /* Focus callback with no callbacks set */
[46a47c0]710 ui_window_send_focus(window, 42);
[f03d1308]711
712 /* Focus callback with focus callback not implemented */
713 ui_window_set_cb(window, &dummy_window_cb, NULL);
[46a47c0]714 ui_window_send_focus(window, 42);
[f03d1308]715
716 /* Focus callback with real callback set */
[fa01c05]717 resp.focus = false;
[f03d1308]718 ui_window_set_cb(window, &test_window_cb, &resp);
[46a47c0]719 ui_window_send_focus(window, 42);
[f03d1308]720 PCUT_ASSERT_TRUE(resp.focus);
[46a47c0]721 PCUT_ASSERT_INT_EQUALS(42, resp.focus_nfocus);
[f03d1308]722
723 ui_window_destroy(window);
724 ui_destroy(ui);
725}
726
[fa01c05]727/** ui_window_send_kbd() calls kbd callback set via ui_window_set_cb() */
728PCUT_TEST(send_kbd)
[f03d1308]729{
730 errno_t rc;
731 ui_t *ui = NULL;
732 ui_wnd_params_t params;
733 ui_window_t *window = NULL;
734 kbd_event_t kbd_event;
735 test_cb_resp_t resp;
736
737 rc = ui_create_disp(NULL, &ui);
738 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
739
740 ui_wnd_params_init(&params);
741 params.caption = "Hello";
742
743 rc = ui_window_create(ui, &params, &window);
744 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
745 PCUT_ASSERT_NOT_NULL(window);
746
[2fe799a]747 kbd_event.type = KEY_PRESS;
[f03d1308]748 kbd_event.key = KC_X;
749 kbd_event.mods = 0;
750 kbd_event.c = 'x';
751
752 /* Kbd callback with no callbacks set */
[fa01c05]753 ui_window_send_kbd(window, &kbd_event);
[f03d1308]754
755 /* Kbd callback with kbd callback not implemented */
756 ui_window_set_cb(window, &dummy_window_cb, NULL);
[fa01c05]757 ui_window_send_kbd(window, &kbd_event);
[f03d1308]758
759 /* Kbd callback with real callback set */
760 resp.kbd = false;
761 ui_window_set_cb(window, &test_window_cb, &resp);
[fa01c05]762 ui_window_send_kbd(window, &kbd_event);
[f03d1308]763 PCUT_ASSERT_TRUE(resp.kbd);
764 PCUT_ASSERT_EQUALS(kbd_event.type, resp.kbd_event.type);
765 PCUT_ASSERT_INT_EQUALS(kbd_event.key, resp.kbd_event.key);
766 PCUT_ASSERT_INT_EQUALS(kbd_event.mods, resp.kbd_event.mods);
767 PCUT_ASSERT_INT_EQUALS(kbd_event.c, resp.kbd_event.c);
768
769 ui_window_destroy(window);
770 ui_destroy(ui);
771}
772
[fa01c05]773/** ui_window_send_paint() calls paint callback set via ui_window_set_cb() */
774PCUT_TEST(send_paint)
775{
776 errno_t rc;
777 ui_t *ui = NULL;
778 ui_wnd_params_t params;
779 ui_window_t *window = NULL;
780 test_cb_resp_t resp;
781
782 rc = ui_create_disp(NULL, &ui);
783 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
784
785 ui_wnd_params_init(&params);
786 params.caption = "Hello";
787
788 rc = ui_window_create(ui, &params, &window);
789 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
790 PCUT_ASSERT_NOT_NULL(window);
791
792 /* Paint callback with no callbacks set */
793 ui_window_send_paint(window);
794
795 /* Paint callback with paint callback not implemented */
796 ui_window_set_cb(window, &dummy_window_cb, NULL);
797 ui_window_send_paint(window);
798
799 /* Paint callback with real callback set */
800 resp.paint = false;
801 resp.rc = EOK;
802 ui_window_set_cb(window, &test_window_cb, &resp);
803 rc = ui_window_send_paint(window);
804 PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
805 PCUT_ASSERT_TRUE(resp.paint);
806
807 ui_window_destroy(window);
808 ui_destroy(ui);
809}
810
811/** ui_window_send_pos() calls pos callback set via ui_window_set_cb() */
812PCUT_TEST(send_pos)
[d284ce9]813{
814 errno_t rc;
815 ui_t *ui = NULL;
816 ui_wnd_params_t params;
817 ui_window_t *window = NULL;
818 pos_event_t pos_event;
819 test_cb_resp_t resp;
820
821 rc = ui_create_disp(NULL, &ui);
822 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
823
824 ui_wnd_params_init(&params);
825 params.caption = "Hello";
826
827 rc = ui_window_create(ui, &params, &window);
828 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
829 PCUT_ASSERT_NOT_NULL(window);
830
831 pos_event.pos_id = 1;
832 pos_event.type = POS_PRESS;
833 pos_event.btn_num = 2;
834 pos_event.hpos = 3;
835 pos_event.vpos = 4;
836
837 /* Pos callback with no callbacks set */
[fa01c05]838 ui_window_send_pos(window, &pos_event);
[d284ce9]839
840 /* Pos callback with pos callback not implemented */
841 ui_window_set_cb(window, &dummy_window_cb, NULL);
[fa01c05]842 ui_window_send_pos(window, &pos_event);
[d284ce9]843
844 /* Pos callback with real callback set */
845 resp.pos = false;
846 ui_window_set_cb(window, &test_window_cb, &resp);
[fa01c05]847 ui_window_send_pos(window, &pos_event);
[d284ce9]848 PCUT_ASSERT_TRUE(resp.pos);
849 PCUT_ASSERT_INT_EQUALS(pos_event.pos_id, resp.pos_event.pos_id);
850 PCUT_ASSERT_EQUALS(pos_event.type, resp.pos_event.type);
851 PCUT_ASSERT_INT_EQUALS(pos_event.btn_num, resp.pos_event.btn_num);
852 PCUT_ASSERT_INT_EQUALS(pos_event.hpos, resp.pos_event.hpos);
853 PCUT_ASSERT_INT_EQUALS(pos_event.vpos, resp.pos_event.vpos);
854
855 ui_window_destroy(window);
856 ui_destroy(ui);
857}
858
[fa01c05]859/** ui_window_send_unfocus() calls unfocus callback set via ui_window_set_cb() */
860PCUT_TEST(send_unfocus)
[f03d1308]861{
862 errno_t rc;
863 ui_t *ui = NULL;
864 ui_wnd_params_t params;
865 ui_window_t *window = NULL;
866 test_cb_resp_t resp;
867
868 rc = ui_create_disp(NULL, &ui);
869 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
870
871 ui_wnd_params_init(&params);
872 params.caption = "Hello";
873
874 rc = ui_window_create(ui, &params, &window);
875 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
876 PCUT_ASSERT_NOT_NULL(window);
877
878 /* Unfocus callback with no callbacks set */
[46a47c0]879 ui_window_send_unfocus(window, 42);
[f03d1308]880
881 /* Unfocus callback with unfocus callback not implemented */
882 ui_window_set_cb(window, &dummy_window_cb, NULL);
[46a47c0]883 ui_window_send_unfocus(window, 42);
[f03d1308]884
885 /* Unfocus callback with real callback set */
886 resp.close = false;
887 ui_window_set_cb(window, &test_window_cb, &resp);
[46a47c0]888 ui_window_send_unfocus(window, 42);
[f03d1308]889 PCUT_ASSERT_TRUE(resp.unfocus);
[46a47c0]890 PCUT_ASSERT_INT_EQUALS(42, resp.unfocus_nfocus);
[f03d1308]891
892 ui_window_destroy(window);
893 ui_destroy(ui);
894}
895
[06176e1]896static void test_window_minimize(ui_window_t *window, void *arg)
897{
898 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
899
900 resp->minimize = true;
901}
902
[35cffea]903static void test_window_maximize(ui_window_t *window, void *arg)
904{
905 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
906
907 resp->maximize = true;
908}
909
910static void test_window_unmaximize(ui_window_t *window, void *arg)
911{
912 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
913
914 resp->unmaximize = true;
915}
916
[d284ce9]917static void test_window_close(ui_window_t *window, void *arg)
918{
919 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
920
921 resp->close = true;
922}
923
[46a47c0]924static void test_window_focus(ui_window_t *window, void *arg, unsigned nfocus)
[f03d1308]925{
926 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
927
928 resp->focus = true;
[46a47c0]929 resp->focus_nfocus = nfocus;
[f03d1308]930}
931
932static void test_window_kbd(ui_window_t *window, void *arg,
933 kbd_event_t *event)
934{
935 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
936
937 resp->kbd = true;
938 resp->kbd_event = *event;
939}
940
[fa01c05]941static errno_t test_window_paint(ui_window_t *window, void *arg)
942{
943 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
944
945 resp->paint = true;
946 return resp->rc;
947}
948
[d284ce9]949static void test_window_pos(ui_window_t *window, void *arg,
950 pos_event_t *event)
951{
952 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
953
954 resp->pos = true;
955 resp->pos_event = *event;
956}
957
[46a47c0]958static void test_window_unfocus(ui_window_t *window, void *arg, unsigned nfocus)
[f03d1308]959{
960 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
961
962 resp->unfocus = true;
[46a47c0]963 resp->unfocus_nfocus = nfocus;
[f03d1308]964}
965
[b71c0fc]966static errno_t test_ctl_paint(void *arg)
967{
968 test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
969
970 resp->paint = true;
971 return resp->rc;
972}
973
974static ui_evclaim_t test_ctl_pos_event(void *arg, pos_event_t *event)
975{
976 test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
977
978 resp->pos = true;
979 resp->pos_event = *event;
980
981 return resp->claim;
982}
983
[46a47c0]984static void test_ctl_unfocus(void *arg, unsigned nfocus)
[62223ec]985{
986 test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
987
988 resp->unfocus = true;
[46a47c0]989 resp->unfocus_nfocus = nfocus;
[62223ec]990}
991
[f7a90df]992PCUT_EXPORT(window);
Note: See TracBrowser for help on using the repository browser.