source: mainline/uspace/lib/ui/test/scrollbar.c@ cd1e3fc0

Last change on this file since cd1e3fc0 was d7f7a4a, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 4 years ago

Replace some license headers with SPDX identifier

Headers are replaced using tools/transorm-copyright.sh only
when it can be matched verbatim with the license header used
throughout most of the codebase.

  • Property mode set to 100644
File size: 29.2 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2022 Jiri Svoboda
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <gfx/context.h>
8#include <gfx/coord.h>
9#include <mem.h>
10#include <pcut/pcut.h>
11#include <stdbool.h>
12#include <ui/control.h>
13#include <ui/scrollbar.h>
14#include <ui/resource.h>
15#include <ui/ui.h>
16#include <ui/window.h>
17#include "../private/pbutton.h"
18#include "../private/scrollbar.h"
19
20PCUT_INIT;
21
22PCUT_TEST_SUITE(scrollbar);
23
24static void test_scrollbar_up(ui_scrollbar_t *, void *);
25static void test_scrollbar_down(ui_scrollbar_t *, void *);
26static void test_scrollbar_page_up(ui_scrollbar_t *, void *);
27static void test_scrollbar_page_down(ui_scrollbar_t *, void *);
28static void test_scrollbar_moved(ui_scrollbar_t *, void *, gfx_coord_t);
29
30static ui_scrollbar_cb_t test_scrollbar_cb = {
31 .up = test_scrollbar_up,
32 .down = test_scrollbar_down,
33 .page_up = test_scrollbar_page_up,
34 .page_down = test_scrollbar_page_down,
35 .moved = test_scrollbar_moved
36};
37
38static ui_scrollbar_cb_t dummy_scrollbar_cb = {
39};
40
41typedef struct {
42 bool up;
43 bool down;
44 bool page_up;
45 bool page_down;
46 bool moved;
47 gfx_coord_t pos;
48} test_cb_resp_t;
49
50/** Create and destroy scrollbar */
51PCUT_TEST(create_destroy)
52{
53 ui_t *ui = NULL;
54 ui_window_t *window = NULL;
55 ui_wnd_params_t params;
56 ui_scrollbar_t *scrollbar = NULL;
57 errno_t rc;
58
59 rc = ui_create_disp(NULL, &ui);
60 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
61
62 ui_wnd_params_init(&params);
63 params.caption = "Hello";
64
65 rc = ui_window_create(ui, &params, &window);
66 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
67 PCUT_ASSERT_NOT_NULL(window);
68
69 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
70 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
71 PCUT_ASSERT_NOT_NULL(scrollbar);
72
73 ui_scrollbar_destroy(scrollbar);
74 ui_window_destroy(window);
75 ui_destroy(ui);
76}
77
78/** ui_scrollbar_destroy() can take NULL argument (no-op) */
79PCUT_TEST(destroy_null)
80{
81 ui_scrollbar_destroy(NULL);
82}
83
84/** ui_scrollbar_ctl() returns control that has a working virtual destructor */
85PCUT_TEST(ctl)
86{
87 ui_t *ui = NULL;
88 ui_window_t *window = NULL;
89 ui_wnd_params_t params;
90 ui_scrollbar_t *scrollbar = NULL;
91 ui_control_t *control;
92 errno_t rc;
93
94 rc = ui_create_disp(NULL, &ui);
95 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
96
97 ui_wnd_params_init(&params);
98 params.caption = "Hello";
99
100 rc = ui_window_create(ui, &params, &window);
101 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
102 PCUT_ASSERT_NOT_NULL(window);
103
104 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
105 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
106 PCUT_ASSERT_NOT_NULL(scrollbar);
107
108 control = ui_scrollbar_ctl(scrollbar);
109 PCUT_ASSERT_NOT_NULL(control);
110
111 ui_control_destroy(control);
112 ui_window_destroy(window);
113 ui_destroy(ui);
114}
115
116/** Set scrollbar rectangle sets internal field */
117PCUT_TEST(set_rect)
118{
119 ui_t *ui = NULL;
120 ui_window_t *window = NULL;
121 ui_wnd_params_t params;
122 ui_scrollbar_t *scrollbar = NULL;
123 gfx_rect_t rect;
124 errno_t rc;
125
126 rc = ui_create_disp(NULL, &ui);
127 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
128
129 ui_wnd_params_init(&params);
130 params.caption = "Hello";
131
132 rc = ui_window_create(ui, &params, &window);
133 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
134 PCUT_ASSERT_NOT_NULL(window);
135
136 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
137 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
138 PCUT_ASSERT_NOT_NULL(scrollbar);
139
140 rect.p0.x = 1;
141 rect.p0.y = 2;
142 rect.p1.x = 3;
143 rect.p1.y = 4;
144
145 ui_scrollbar_set_rect(scrollbar, &rect);
146 PCUT_ASSERT_INT_EQUALS(rect.p0.x, scrollbar->rect.p0.x);
147 PCUT_ASSERT_INT_EQUALS(rect.p0.y, scrollbar->rect.p0.y);
148 PCUT_ASSERT_INT_EQUALS(rect.p1.x, scrollbar->rect.p1.x);
149 PCUT_ASSERT_INT_EQUALS(rect.p1.y, scrollbar->rect.p1.y);
150
151 ui_scrollbar_destroy(scrollbar);
152 ui_window_destroy(window);
153 ui_destroy(ui);
154}
155
156/** Paint scrollbar in graphics mode */
157PCUT_TEST(paint_gfx)
158{
159 ui_t *ui = NULL;
160 ui_window_t *window = NULL;
161 ui_wnd_params_t params;
162 ui_scrollbar_t *scrollbar;
163 errno_t rc;
164
165 rc = ui_create_disp(NULL, &ui);
166 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
167
168 ui_wnd_params_init(&params);
169 params.caption = "Hello";
170
171 rc = ui_window_create(ui, &params, &window);
172 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
173 PCUT_ASSERT_NOT_NULL(window);
174
175 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
176 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
177
178 rc = ui_scrollbar_paint_gfx(scrollbar);
179 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
180
181 ui_scrollbar_destroy(scrollbar);
182 ui_window_destroy(window);
183 ui_destroy(ui);
184}
185
186/** Paint scrollbar in text mode */
187PCUT_TEST(paint_text_horiz)
188{
189 ui_t *ui = NULL;
190 ui_window_t *window = NULL;
191 ui_wnd_params_t params;
192 ui_scrollbar_t *scrollbar;
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_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
207 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
208
209 rect.p0.x = 1;
210 rect.p0.y = 1;
211 rect.p1.x = 10;
212 rect.p1.y = 2;
213 ui_scrollbar_set_rect(scrollbar, &rect);
214
215 rc = ui_scrollbar_paint_text(scrollbar);
216 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
217
218 ui_scrollbar_destroy(scrollbar);
219 ui_window_destroy(window);
220 ui_destroy(ui);
221}
222
223/** ui_scrollbar_get_geom() returns scrollbar geometry */
224PCUT_TEST(get_geom)
225{
226 ui_t *ui = NULL;
227 ui_window_t *window = NULL;
228 ui_wnd_params_t params;
229 ui_scrollbar_t *scrollbar;
230 ui_scrollbar_geom_t geom;
231 gfx_rect_t rect;
232 errno_t rc;
233
234 rc = ui_create_disp(NULL, &ui);
235 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
236
237 ui_wnd_params_init(&params);
238 params.caption = "Hello";
239
240 rc = ui_window_create(ui, &params, &window);
241 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
242 PCUT_ASSERT_NOT_NULL(window);
243
244 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
245 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
246
247 rect.p0.x = 10;
248 rect.p0.y = 10;
249 rect.p1.x = 100;
250 rect.p1.y = 30;
251 ui_scrollbar_set_rect(scrollbar, &rect);
252
253 ui_scrollbar_get_geom(scrollbar, &geom);
254 PCUT_ASSERT_INT_EQUALS(11, geom.up_btn_rect.p0.x);
255 PCUT_ASSERT_INT_EQUALS(11, geom.up_btn_rect.p0.y);
256 PCUT_ASSERT_INT_EQUALS(99, geom.down_btn_rect.p1.x);
257 PCUT_ASSERT_INT_EQUALS(29, geom.down_btn_rect.p1.y);
258
259 ui_scrollbar_destroy(scrollbar);
260 ui_window_destroy(window);
261 ui_destroy(ui);
262}
263
264/** ui_scrollbar_through_length() gives correct scrollbar through length */
265PCUT_TEST(through_length)
266{
267 ui_t *ui = NULL;
268 ui_window_t *window = NULL;
269 ui_wnd_params_t params;
270 ui_scrollbar_t *scrollbar;
271 gfx_coord_t length;
272 gfx_rect_t rect;
273 errno_t rc;
274
275 rc = ui_create_disp(NULL, &ui);
276 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
277
278 ui_wnd_params_init(&params);
279 params.caption = "Hello";
280
281 rc = ui_window_create(ui, &params, &window);
282 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
283 PCUT_ASSERT_NOT_NULL(window);
284
285 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
286 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
287
288 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
289
290 rect.p0.x = 10;
291 rect.p0.y = 20;
292 rect.p1.x = 110;
293 rect.p1.y = 120;
294 ui_scrollbar_set_rect(scrollbar, &rect);
295
296 length = ui_scrollbar_through_length(scrollbar);
297
298 /* Total length minus buttons */
299 PCUT_ASSERT_INT_EQUALS(110 - 10 - 2 * 21, length);
300
301 ui_scrollbar_destroy(scrollbar);
302 ui_window_destroy(window);
303 ui_destroy(ui);
304}
305
306/** ui_scrollbar_move_length() gives correct scrollbar move length */
307PCUT_TEST(move_length)
308{
309 ui_t *ui = NULL;
310 ui_window_t *window = NULL;
311 ui_wnd_params_t params;
312 ui_scrollbar_t *scrollbar;
313 gfx_coord_t length;
314 gfx_rect_t rect;
315 errno_t rc;
316
317 rc = ui_create_disp(NULL, &ui);
318 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
319
320 ui_wnd_params_init(&params);
321 params.caption = "Hello";
322
323 rc = ui_window_create(ui, &params, &window);
324 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
325 PCUT_ASSERT_NOT_NULL(window);
326
327 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
328 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
329
330 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
331
332 rect.p0.x = 10;
333 rect.p0.y = 20;
334 rect.p1.x = 110;
335 rect.p1.y = 120;
336 ui_scrollbar_set_rect(scrollbar, &rect);
337
338 length = ui_scrollbar_move_length(scrollbar);
339
340 /* Total length minus buttons minus default thumb length */
341 PCUT_ASSERT_INT_EQUALS(110 - 10 - 2 * 21 - 21, length);
342
343 ui_scrollbar_destroy(scrollbar);
344 ui_window_destroy(window);
345 ui_destroy(ui);
346}
347
348/** ui_scrollbar_get_pos() returns scrollbar position */
349PCUT_TEST(get_pos)
350{
351 ui_t *ui = NULL;
352 ui_window_t *window = NULL;
353 ui_wnd_params_t params;
354 ui_scrollbar_t *scrollbar;
355 gfx_coord_t pos;
356 gfx_rect_t rect;
357 errno_t rc;
358
359 rc = ui_create_disp(NULL, &ui);
360 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
361
362 ui_wnd_params_init(&params);
363 params.caption = "Hello";
364
365 rc = ui_window_create(ui, &params, &window);
366 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
367 PCUT_ASSERT_NOT_NULL(window);
368
369 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
370 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
371
372 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
373
374 rect.p0.x = 10;
375 rect.p0.y = 20;
376 rect.p1.x = 110;
377 rect.p1.y = 120;
378 ui_scrollbar_set_rect(scrollbar, &rect);
379
380 scrollbar->pos = 42;
381 pos = ui_scrollbar_get_pos(scrollbar);
382 PCUT_ASSERT_INT_EQUALS(42, pos);
383
384 ui_scrollbar_destroy(scrollbar);
385 ui_window_destroy(window);
386 ui_destroy(ui);
387}
388
389/** ui_scrollbar_set_thumb_length() sets thumb length */
390PCUT_TEST(set_thumb_length)
391{
392 ui_t *ui = NULL;
393 ui_window_t *window = NULL;
394 ui_wnd_params_t params;
395 ui_scrollbar_t *scrollbar;
396 gfx_rect_t rect;
397 errno_t rc;
398
399 rc = ui_create_disp(NULL, &ui);
400 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
401
402 ui_wnd_params_init(&params);
403 params.caption = "Hello";
404
405 rc = ui_window_create(ui, &params, &window);
406 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
407 PCUT_ASSERT_NOT_NULL(window);
408
409 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
410 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
411
412 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
413
414 rect.p0.x = 10;
415 rect.p0.y = 20;
416 rect.p1.x = 110;
417 rect.p1.y = 120;
418 ui_scrollbar_set_rect(scrollbar, &rect);
419
420 ui_scrollbar_set_thumb_length(scrollbar, 42);
421 PCUT_ASSERT_INT_EQUALS(42, scrollbar->thumb_len);
422
423 ui_scrollbar_destroy(scrollbar);
424 ui_window_destroy(window);
425 ui_destroy(ui);
426}
427
428/** ui_scrollbar_set_pos() sets thumb position */
429PCUT_TEST(set_pos)
430{
431 ui_t *ui = NULL;
432 ui_window_t *window = NULL;
433 ui_wnd_params_t params;
434 ui_scrollbar_t *scrollbar;
435 gfx_coord_t pos;
436 gfx_rect_t rect;
437 errno_t rc;
438
439 rc = ui_create_disp(NULL, &ui);
440 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
441
442 ui_wnd_params_init(&params);
443 params.caption = "Hello";
444
445 rc = ui_window_create(ui, &params, &window);
446 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
447 PCUT_ASSERT_NOT_NULL(window);
448
449 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
450 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
451
452 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
453
454 rect.p0.x = 10;
455 rect.p0.y = 20;
456 rect.p1.x = 110;
457 rect.p1.y = 120;
458 ui_scrollbar_set_rect(scrollbar, &rect);
459
460 ui_scrollbar_set_pos(scrollbar, -1);
461 pos = ui_scrollbar_get_pos(scrollbar);
462 /* The value is clipped to the minimum possible position (0) */
463 PCUT_ASSERT_INT_EQUALS(0, pos);
464
465 ui_scrollbar_set_pos(scrollbar, 12);
466 pos = ui_scrollbar_get_pos(scrollbar);
467 /* The value is set to the requested value */
468 PCUT_ASSERT_INT_EQUALS(12, pos);
469
470 ui_scrollbar_set_pos(scrollbar, 42);
471 pos = ui_scrollbar_get_pos(scrollbar);
472 /* The value is clipped to the maximum possible position (37) */
473 PCUT_ASSERT_INT_EQUALS(37, pos);
474
475 ui_scrollbar_destroy(scrollbar);
476 ui_window_destroy(window);
477 ui_destroy(ui);
478}
479
480/** Press and release scrollbar thumb */
481PCUT_TEST(thumb_press_release)
482{
483 ui_t *ui = NULL;
484 ui_window_t *window = NULL;
485 ui_wnd_params_t params;
486 gfx_coord2_t pos;
487 gfx_rect_t rect;
488 ui_scrollbar_t *scrollbar;
489 test_cb_resp_t resp;
490 errno_t rc;
491
492 rc = ui_create_disp(NULL, &ui);
493 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
494
495 ui_wnd_params_init(&params);
496 params.caption = "Hello";
497
498 rc = ui_window_create(ui, &params, &window);
499 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
500 PCUT_ASSERT_NOT_NULL(window);
501
502 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
503 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
504
505 rect.p0.x = 10;
506 rect.p0.y = 20;
507 rect.p1.x = 110;
508 rect.p1.y = 120;
509 ui_scrollbar_set_rect(scrollbar, &rect);
510
511 resp.moved = false;
512 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
513
514 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
515
516 pos.x = 11;
517 pos.y = 22;
518
519 ui_scrollbar_thumb_press(scrollbar, &pos);
520 PCUT_ASSERT_TRUE(scrollbar->thumb_held);
521 PCUT_ASSERT_FALSE(resp.moved);
522
523 pos.x = 21;
524 pos.y = 32;
525
526 ui_scrollbar_release(scrollbar, &pos);
527 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
528 PCUT_ASSERT_TRUE(resp.moved);
529 PCUT_ASSERT_INT_EQUALS(10, scrollbar->pos);
530
531 ui_scrollbar_destroy(scrollbar);
532 ui_window_destroy(window);
533 ui_destroy(ui);
534}
535
536/** Press, update and release scrollbar */
537PCUT_TEST(thumb_press_update_release)
538{
539 ui_t *ui = NULL;
540 ui_window_t *window = NULL;
541 ui_wnd_params_t params;
542 gfx_coord2_t pos;
543 gfx_rect_t rect;
544 ui_scrollbar_t *scrollbar;
545 test_cb_resp_t resp;
546 errno_t rc;
547
548 rc = ui_create_disp(NULL, &ui);
549 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
550
551 ui_wnd_params_init(&params);
552 params.caption = "Hello";
553
554 rc = ui_window_create(ui, &params, &window);
555 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
556 PCUT_ASSERT_NOT_NULL(window);
557
558 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
559 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
560
561 rect.p0.x = 10;
562 rect.p0.y = 20;
563 rect.p1.x = 110;
564 rect.p1.y = 120;
565 ui_scrollbar_set_rect(scrollbar, &rect);
566
567 resp.moved = false;
568 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
569
570 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
571
572 pos.x = 11;
573 pos.y = 22;
574
575 ui_scrollbar_thumb_press(scrollbar, &pos);
576 PCUT_ASSERT_TRUE(scrollbar->thumb_held);
577 PCUT_ASSERT_FALSE(resp.moved);
578
579 pos.x = 21;
580 pos.y = 32;
581
582 ui_scrollbar_update(scrollbar, &pos);
583 PCUT_ASSERT_TRUE(scrollbar->thumb_held);
584 PCUT_ASSERT_TRUE(resp.moved);
585 PCUT_ASSERT_INT_EQUALS(10, scrollbar->pos);
586
587 pos.x = 31;
588 pos.y = 42;
589
590 ui_scrollbar_release(scrollbar, &pos);
591 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
592 PCUT_ASSERT_TRUE(resp.moved);
593 PCUT_ASSERT_INT_EQUALS(20, scrollbar->pos);
594
595 ui_scrollbar_destroy(scrollbar);
596 ui_window_destroy(window);
597 ui_destroy(ui);
598}
599
600/** Press and release up through */
601PCUT_TEST(up_through_press_release)
602{
603 ui_t *ui = NULL;
604 ui_window_t *window = NULL;
605 ui_wnd_params_t params;
606 gfx_coord2_t pos;
607 gfx_rect_t rect;
608 ui_scrollbar_t *scrollbar;
609 test_cb_resp_t resp;
610 errno_t rc;
611
612 rc = ui_create_disp(NULL, &ui);
613 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
614
615 ui_wnd_params_init(&params);
616 params.caption = "Hello";
617
618 rc = ui_window_create(ui, &params, &window);
619 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
620 PCUT_ASSERT_NOT_NULL(window);
621
622 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
623 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
624
625 rect.p0.x = 10;
626 rect.p0.y = 20;
627 rect.p1.x = 110;
628 rect.p1.y = 120;
629 ui_scrollbar_set_rect(scrollbar, &rect);
630
631 resp.page_up = false;
632 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
633
634 PCUT_ASSERT_FALSE(scrollbar->up_through_held);
635
636 ui_scrollbar_up_through_press(scrollbar);
637 PCUT_ASSERT_TRUE(scrollbar->up_through_held);
638 PCUT_ASSERT_TRUE(resp.page_up);
639
640 /* Position does not matter here */
641 pos.x = 11;
642 pos.y = 22;
643
644 ui_scrollbar_release(scrollbar, &pos);
645 PCUT_ASSERT_FALSE(scrollbar->up_through_held);
646
647 ui_scrollbar_destroy(scrollbar);
648 ui_window_destroy(window);
649 ui_destroy(ui);
650}
651
652/** Press and release down through */
653PCUT_TEST(down_through_press_release)
654{
655 ui_t *ui = NULL;
656 ui_window_t *window = NULL;
657 ui_wnd_params_t params;
658 gfx_coord2_t pos;
659 gfx_rect_t rect;
660 ui_scrollbar_t *scrollbar;
661 test_cb_resp_t resp;
662 errno_t rc;
663
664 rc = ui_create_disp(NULL, &ui);
665 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
666
667 ui_wnd_params_init(&params);
668 params.caption = "Hello";
669
670 rc = ui_window_create(ui, &params, &window);
671 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
672 PCUT_ASSERT_NOT_NULL(window);
673
674 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
675 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
676
677 rect.p0.x = 10;
678 rect.p0.y = 20;
679 rect.p1.x = 110;
680 rect.p1.y = 120;
681 ui_scrollbar_set_rect(scrollbar, &rect);
682
683 resp.page_down = false;
684 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
685
686 PCUT_ASSERT_FALSE(scrollbar->down_through_held);
687
688 ui_scrollbar_down_through_press(scrollbar);
689 PCUT_ASSERT_TRUE(scrollbar->down_through_held);
690 PCUT_ASSERT_TRUE(resp.page_down);
691
692 /* Position does not matter here */
693 pos.x = 11;
694 pos.y = 22;
695
696 ui_scrollbar_release(scrollbar, &pos);
697 PCUT_ASSERT_FALSE(scrollbar->down_through_held);
698
699 ui_scrollbar_destroy(scrollbar);
700 ui_window_destroy(window);
701 ui_destroy(ui);
702}
703
704/** Updating state of throughs when cursor or thumb moves */
705PCUT_TEST(throughs_update)
706{
707 ui_t *ui = NULL;
708 ui_window_t *window = NULL;
709 ui_wnd_params_t params;
710 gfx_coord2_t pos;
711 gfx_rect_t rect;
712 ui_scrollbar_t *scrollbar;
713 errno_t rc;
714
715 rc = ui_create_disp(NULL, &ui);
716 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
717
718 ui_wnd_params_init(&params);
719 params.caption = "Hello";
720
721 rc = ui_window_create(ui, &params, &window);
722 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
723 PCUT_ASSERT_NOT_NULL(window);
724
725 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
726 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
727
728 rect.p0.x = 10;
729 rect.p0.y = 20;
730 rect.p1.x = 110;
731 rect.p1.y = 120;
732 ui_scrollbar_set_rect(scrollbar, &rect);
733
734 PCUT_ASSERT_FALSE(scrollbar->down_through_inside);
735
736 pos.x = 60;
737 pos.y = 22;
738
739 ui_scrollbar_throughs_update(scrollbar, &pos);
740 PCUT_ASSERT_TRUE(scrollbar->down_through_inside);
741
742 ui_scrollbar_destroy(scrollbar);
743 ui_window_destroy(window);
744 ui_destroy(ui);
745}
746
747/** ui_scrollbar_up() delivers up event */
748PCUT_TEST(up)
749{
750 ui_t *ui = NULL;
751 ui_window_t *window = NULL;
752 ui_wnd_params_t params;
753 ui_scrollbar_t *scrollbar;
754 test_cb_resp_t resp;
755 errno_t rc;
756
757 rc = ui_create_disp(NULL, &ui);
758 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
759
760 ui_wnd_params_init(&params);
761 params.caption = "Hello";
762
763 rc = ui_window_create(ui, &params, &window);
764 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
765 PCUT_ASSERT_NOT_NULL(window);
766
767 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
768 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
769
770 /* Up with no callbacks set */
771 ui_scrollbar_up(scrollbar);
772
773 /* Up with callback not implementing up */
774 ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
775 ui_scrollbar_up(scrollbar);
776
777 /* Up with real callback set */
778 resp.up = false;
779 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
780 ui_scrollbar_up(scrollbar);
781 PCUT_ASSERT_TRUE(resp.up);
782
783 ui_scrollbar_destroy(scrollbar);
784 ui_window_destroy(window);
785 ui_destroy(ui);
786}
787
788/** ui_scrollbar_down() delivers down event */
789PCUT_TEST(down)
790{
791 ui_t *ui = NULL;
792 ui_window_t *window = NULL;
793 ui_wnd_params_t params;
794 ui_scrollbar_t *scrollbar;
795 test_cb_resp_t resp;
796 errno_t rc;
797
798 rc = ui_create_disp(NULL, &ui);
799 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
800
801 ui_wnd_params_init(&params);
802 params.caption = "Hello";
803
804 rc = ui_window_create(ui, &params, &window);
805 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
806 PCUT_ASSERT_NOT_NULL(window);
807
808 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
809 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
810
811 /* Down with no callbacks set */
812 ui_scrollbar_down(scrollbar);
813
814 /* Down with callback not implementing down */
815 ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
816 ui_scrollbar_down(scrollbar);
817
818 /* Down with real callback set */
819 resp.down = false;
820 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
821 ui_scrollbar_down(scrollbar);
822 PCUT_ASSERT_TRUE(resp.down);
823
824 ui_scrollbar_destroy(scrollbar);
825 ui_window_destroy(window);
826 ui_destroy(ui);
827}
828
829/** ui_scrollbar_page_up() delivers page up event */
830PCUT_TEST(page_up)
831{
832 ui_t *ui = NULL;
833 ui_window_t *window = NULL;
834 ui_wnd_params_t params;
835 ui_scrollbar_t *scrollbar;
836 test_cb_resp_t resp;
837 errno_t rc;
838
839 rc = ui_create_disp(NULL, &ui);
840 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
841
842 ui_wnd_params_init(&params);
843 params.caption = "Hello";
844
845 rc = ui_window_create(ui, &params, &window);
846 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
847 PCUT_ASSERT_NOT_NULL(window);
848
849 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
850 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
851
852 /* Page up with no callbacks set */
853 ui_scrollbar_page_up(scrollbar);
854
855 /* Pge up with callback not implementing page up */
856 ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
857 ui_scrollbar_page_up(scrollbar);
858
859 /* Page up with real callback set */
860 resp.page_up = false;
861 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
862 ui_scrollbar_page_up(scrollbar);
863 PCUT_ASSERT_TRUE(resp.page_up);
864
865 ui_scrollbar_destroy(scrollbar);
866 ui_window_destroy(window);
867 ui_destroy(ui);
868}
869
870/** ui_scrollbar_page_down() delivers page down event */
871PCUT_TEST(page_down)
872{
873 ui_t *ui = NULL;
874 ui_window_t *window = NULL;
875 ui_wnd_params_t params;
876 ui_scrollbar_t *scrollbar;
877 test_cb_resp_t resp;
878 errno_t rc;
879
880 rc = ui_create_disp(NULL, &ui);
881 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
882
883 ui_wnd_params_init(&params);
884 params.caption = "Hello";
885
886 rc = ui_window_create(ui, &params, &window);
887 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
888 PCUT_ASSERT_NOT_NULL(window);
889
890 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
891 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
892
893 /* Page down with no callbacks set */
894 ui_scrollbar_page_down(scrollbar);
895
896 /* Page down with callback not implementing page down */
897 ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
898 ui_scrollbar_page_down(scrollbar);
899
900 /* Page down with real callback set */
901 resp.page_down = false;
902 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
903 ui_scrollbar_page_down(scrollbar);
904 PCUT_ASSERT_TRUE(resp.page_down);
905
906 ui_scrollbar_destroy(scrollbar);
907 ui_window_destroy(window);
908 ui_destroy(ui);
909}
910
911/** ui_scrollbar_moved() delivers moved event */
912PCUT_TEST(moved)
913{
914 ui_t *ui = NULL;
915 ui_window_t *window = NULL;
916 ui_wnd_params_t params;
917 ui_scrollbar_t *scrollbar;
918 test_cb_resp_t resp;
919 errno_t rc;
920
921 rc = ui_create_disp(NULL, &ui);
922 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
923
924 ui_wnd_params_init(&params);
925 params.caption = "Hello";
926
927 rc = ui_window_create(ui, &params, &window);
928 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
929 PCUT_ASSERT_NOT_NULL(window);
930
931 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
932 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
933
934 /* Moved with no callbacks set */
935 ui_scrollbar_moved(scrollbar, 42);
936
937 /* Moved with callback not implementing moved */
938 ui_scrollbar_set_cb(scrollbar, &dummy_scrollbar_cb, NULL);
939 ui_scrollbar_moved(scrollbar, 42);
940
941 /* Moved with real callback set */
942 resp.moved = false;
943 resp.pos = 0;
944 ui_scrollbar_set_cb(scrollbar, &test_scrollbar_cb, &resp);
945 ui_scrollbar_moved(scrollbar, 42);
946 PCUT_ASSERT_TRUE(resp.moved);
947 PCUT_ASSERT_INT_EQUALS(42, resp.pos);
948
949 ui_scrollbar_destroy(scrollbar);
950 ui_window_destroy(window);
951 ui_destroy(ui);
952}
953
954/** ui_scrollbar_pos_event() detects thumb press/release */
955PCUT_TEST(pos_event_press_release_thumb)
956{
957 ui_t *ui = NULL;
958 ui_window_t *window = NULL;
959 ui_wnd_params_t params;
960 ui_scrollbar_t *scrollbar;
961 ui_evclaim_t claim;
962 pos_event_t event;
963 gfx_rect_t rect;
964 errno_t rc;
965
966 rc = ui_create_disp(NULL, &ui);
967 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
968
969 ui_wnd_params_init(&params);
970 params.caption = "Hello";
971
972 rc = ui_window_create(ui, &params, &window);
973 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
974 PCUT_ASSERT_NOT_NULL(window);
975
976 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
977 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
978
979 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
980
981 rect.p0.x = 20;
982 rect.p0.y = 10;
983 rect.p1.x = 100;
984 rect.p1.y = 30;
985 ui_scrollbar_set_rect(scrollbar, &rect);
986
987 /* Press outside is not claimed and does nothing */
988 event.type = POS_PRESS;
989 event.hpos = 1;
990 event.vpos = 2;
991 claim = ui_scrollbar_pos_event(scrollbar, &event);
992 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
993 PCUT_ASSERT_EQUALS(ui_unclaimed, claim);
994
995 /* Press inside thumb is claimed and depresses it */
996 event.type = POS_PRESS;
997 event.hpos = 50;
998 event.vpos = 20;
999 claim = ui_scrollbar_pos_event(scrollbar, &event);
1000 PCUT_ASSERT_TRUE(scrollbar->thumb_held);
1001 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1002
1003 /* Release outside (or anywhere) is claimed and relases thumb */
1004 event.type = POS_RELEASE;
1005 event.hpos = 41;
1006 event.vpos = 32;
1007 claim = ui_scrollbar_pos_event(scrollbar, &event);
1008 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
1009 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1010
1011 ui_scrollbar_destroy(scrollbar);
1012 ui_window_destroy(window);
1013 ui_destroy(ui);
1014}
1015
1016/** ui_scrollbar_pos_event() detects up button press/release */
1017PCUT_TEST(pos_event_press_release_up_btn)
1018{
1019 ui_t *ui = NULL;
1020 ui_window_t *window = NULL;
1021 ui_wnd_params_t params;
1022 ui_scrollbar_t *scrollbar;
1023 ui_evclaim_t claim;
1024 pos_event_t event;
1025 gfx_rect_t rect;
1026 errno_t rc;
1027
1028 rc = ui_create_disp(NULL, &ui);
1029 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1030
1031 ui_wnd_params_init(&params);
1032 params.caption = "Hello";
1033
1034 rc = ui_window_create(ui, &params, &window);
1035 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1036 PCUT_ASSERT_NOT_NULL(window);
1037
1038 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
1039 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1040
1041 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
1042
1043 rect.p0.x = 20;
1044 rect.p0.y = 10;
1045 rect.p1.x = 100;
1046 rect.p1.y = 30;
1047 ui_scrollbar_set_rect(scrollbar, &rect);
1048
1049 /* Press inside up button is claimed and depresses it */
1050 event.type = POS_PRESS;
1051 event.hpos = 30;
1052 event.vpos = 20;
1053 claim = ui_scrollbar_pos_event(scrollbar, &event);
1054 PCUT_ASSERT_TRUE(scrollbar->up_btn->held);
1055 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1056
1057 ui_scrollbar_destroy(scrollbar);
1058 ui_window_destroy(window);
1059 ui_destroy(ui);
1060}
1061
1062/** ui_scrollbar_pos_event() detects up through press/release */
1063PCUT_TEST(pos_event_press_release_up_through)
1064{
1065 ui_t *ui = NULL;
1066 ui_window_t *window = NULL;
1067 ui_wnd_params_t params;
1068 ui_scrollbar_t *scrollbar;
1069 ui_evclaim_t claim;
1070 pos_event_t event;
1071 gfx_rect_t rect;
1072 errno_t rc;
1073
1074 rc = ui_create_disp(NULL, &ui);
1075 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1076
1077 ui_wnd_params_init(&params);
1078 params.caption = "Hello";
1079
1080 rc = ui_window_create(ui, &params, &window);
1081 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1082 PCUT_ASSERT_NOT_NULL(window);
1083
1084 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
1085 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1086
1087 PCUT_ASSERT_FALSE(scrollbar->up_through_held);
1088
1089 rect.p0.x = 20;
1090 rect.p0.y = 10;
1091 rect.p1.x = 100;
1092 rect.p1.y = 30;
1093 ui_scrollbar_set_rect(scrollbar, &rect);
1094
1095 /* Need to move thumb so that up through can be accessed */
1096 ui_scrollbar_set_pos(scrollbar, 42);
1097
1098 /* Press inside up through is claimed and depresses it */
1099 event.type = POS_PRESS;
1100 event.hpos = 50;
1101 event.vpos = 20;
1102 claim = ui_scrollbar_pos_event(scrollbar, &event);
1103 PCUT_ASSERT_TRUE(scrollbar->up_through_held);
1104 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1105
1106 /* Release outside (or anywhere) is claimed and relases up through */
1107 event.type = POS_RELEASE;
1108 event.hpos = 41;
1109 event.vpos = 32;
1110 claim = ui_scrollbar_pos_event(scrollbar, &event);
1111 PCUT_ASSERT_FALSE(scrollbar->up_through_held);
1112 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1113
1114 ui_scrollbar_destroy(scrollbar);
1115 ui_window_destroy(window);
1116 ui_destroy(ui);
1117}
1118
1119/** ui_scrollbar_pos_event() detects down through press/release */
1120PCUT_TEST(pos_event_press_release_down_through)
1121{
1122 ui_t *ui = NULL;
1123 ui_window_t *window = NULL;
1124 ui_wnd_params_t params;
1125 ui_scrollbar_t *scrollbar;
1126 ui_evclaim_t claim;
1127 pos_event_t event;
1128 gfx_rect_t rect;
1129 errno_t rc;
1130
1131 rc = ui_create_disp(NULL, &ui);
1132 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1133
1134 ui_wnd_params_init(&params);
1135 params.caption = "Hello";
1136
1137 rc = ui_window_create(ui, &params, &window);
1138 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1139 PCUT_ASSERT_NOT_NULL(window);
1140
1141 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
1142 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1143
1144 PCUT_ASSERT_FALSE(scrollbar->up_through_held);
1145
1146 rect.p0.x = 20;
1147 rect.p0.y = 10;
1148 rect.p1.x = 100;
1149 rect.p1.y = 30;
1150 ui_scrollbar_set_rect(scrollbar, &rect);
1151
1152 /* Press inside down through is claimed and depresses it */
1153 event.type = POS_PRESS;
1154 event.hpos = 70;
1155 event.vpos = 20;
1156 claim = ui_scrollbar_pos_event(scrollbar, &event);
1157 PCUT_ASSERT_TRUE(scrollbar->down_through_held);
1158 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1159
1160 /* Release outside (or anywhere) is claimed and relases up through */
1161 event.type = POS_RELEASE;
1162 event.hpos = 41;
1163 event.vpos = 32;
1164 claim = ui_scrollbar_pos_event(scrollbar, &event);
1165 PCUT_ASSERT_FALSE(scrollbar->down_through_held);
1166 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1167
1168 ui_scrollbar_destroy(scrollbar);
1169 ui_window_destroy(window);
1170 ui_destroy(ui);
1171}
1172
1173/** ui_scrollbar_pos_event() detects down button press/release */
1174PCUT_TEST(pos_event_press_relese_down_btn)
1175{
1176 ui_t *ui = NULL;
1177 ui_window_t *window = NULL;
1178 ui_wnd_params_t params;
1179 ui_scrollbar_t *scrollbar;
1180 ui_evclaim_t claim;
1181 pos_event_t event;
1182 gfx_rect_t rect;
1183 errno_t rc;
1184
1185 rc = ui_create_disp(NULL, &ui);
1186 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1187
1188 ui_wnd_params_init(&params);
1189 params.caption = "Hello";
1190
1191 rc = ui_window_create(ui, &params, &window);
1192 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1193 PCUT_ASSERT_NOT_NULL(window);
1194
1195 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &scrollbar);
1196 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
1197
1198 PCUT_ASSERT_FALSE(scrollbar->thumb_held);
1199
1200 rect.p0.x = 20;
1201 rect.p0.y = 10;
1202 rect.p1.x = 100;
1203 rect.p1.y = 30;
1204 ui_scrollbar_set_rect(scrollbar, &rect);
1205
1206 /* Press inside down button is claimed and depresses it */
1207 event.type = POS_PRESS;
1208 event.hpos = 90;
1209 event.vpos = 20;
1210 claim = ui_scrollbar_pos_event(scrollbar, &event);
1211 PCUT_ASSERT_TRUE(scrollbar->down_btn->held);
1212 PCUT_ASSERT_EQUALS(ui_claimed, claim);
1213
1214 ui_scrollbar_destroy(scrollbar);
1215 ui_window_destroy(window);
1216 ui_destroy(ui);
1217}
1218
1219static void test_scrollbar_up(ui_scrollbar_t *scrollbar, void *arg)
1220{
1221 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1222
1223 resp->up = true;
1224}
1225
1226static void test_scrollbar_down(ui_scrollbar_t *scrollbar, void *arg)
1227{
1228 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1229
1230 resp->down = true;
1231}
1232
1233static void test_scrollbar_page_up(ui_scrollbar_t *scrollbar, void *arg)
1234{
1235 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1236
1237 resp->page_up = true;
1238}
1239
1240static void test_scrollbar_page_down(ui_scrollbar_t *scrollbar, void *arg)
1241{
1242 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1243
1244 resp->page_down = true;
1245}
1246
1247static void test_scrollbar_moved(ui_scrollbar_t *scrollbar, void *arg, gfx_coord_t pos)
1248{
1249 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1250
1251 resp->moved = true;
1252 resp->pos = pos;
1253}
1254
1255PCUT_EXPORT(scrollbar);
Note: See TracBrowser for help on using the repository browser.