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

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

Scrollbar needs custom button decorations

Push button now allows setting a 'custom decoration' which means
instead of painting the button text a callback function is invoked
to paint the decoration.

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