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

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since fd05ea6 was 3d10a2f, checked in by Jiri Svoboda <jiri@…>, 4 years ago

Null display spec for the benefit of unit testing

When testing something that takes a display specification as argument,
it is useful to be able to be able to specify dummy output (so far,
only ui_create_disp() could create a UI with dummy output.

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