source: mainline/uspace/lib/ui/test/rbutton.c@ 8b22d44

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

Radio button text mode

  • Property mode set to 100644
File size: 17.7 KB
Line 
1/*
2 * Copyright (c) 2021 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <gfx/context.h>
30#include <gfx/coord.h>
31#include <mem.h>
32#include <pcut/pcut.h>
33#include <stdbool.h>
34#include <ui/control.h>
35#include <ui/rbutton.h>
36#include <ui/resource.h>
37#include "../private/rbutton.h"
38
39PCUT_INIT;
40
41PCUT_TEST_SUITE(rbutton);
42
43static errno_t testgc_set_clip_rect(void *, gfx_rect_t *);
44static errno_t testgc_set_color(void *, gfx_color_t *);
45static errno_t testgc_fill_rect(void *, gfx_rect_t *);
46static errno_t testgc_update(void *);
47static errno_t testgc_bitmap_create(void *, gfx_bitmap_params_t *,
48 gfx_bitmap_alloc_t *, void **);
49static errno_t testgc_bitmap_destroy(void *);
50static errno_t testgc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
51static errno_t testgc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
52
53static gfx_context_ops_t ops = {
54 .set_clip_rect = testgc_set_clip_rect,
55 .set_color = testgc_set_color,
56 .fill_rect = testgc_fill_rect,
57 .update = testgc_update,
58 .bitmap_create = testgc_bitmap_create,
59 .bitmap_destroy = testgc_bitmap_destroy,
60 .bitmap_render = testgc_bitmap_render,
61 .bitmap_get_alloc = testgc_bitmap_get_alloc
62};
63
64static void test_rbutton_select(ui_rbutton_group_t *, void *, void *);
65
66static ui_rbutton_group_cb_t test_rbutton_group_cb = {
67 .selected = test_rbutton_select
68};
69
70static ui_rbutton_group_cb_t dummy_rbutton_group_cb = {
71};
72
73typedef struct {
74 bool bm_created;
75 bool bm_destroyed;
76 gfx_bitmap_params_t bm_params;
77 void *bm_pixels;
78 gfx_rect_t bm_srect;
79 gfx_coord2_t bm_offs;
80 bool bm_rendered;
81 bool bm_got_alloc;
82} test_gc_t;
83
84typedef struct {
85 test_gc_t *tgc;
86 gfx_bitmap_alloc_t alloc;
87 bool myalloc;
88} testgc_bitmap_t;
89
90typedef struct {
91 bool selected;
92} test_cb_resp_t;
93
94/** Create and destroy radio button */
95PCUT_TEST(create_destroy)
96{
97 ui_rbutton_group_t *group = NULL;
98 ui_rbutton_t *rbutton = NULL;
99 errno_t rc;
100
101 rc = ui_rbutton_group_create(NULL, &group);
102 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
103
104 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
105 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
106 PCUT_ASSERT_NOT_NULL(rbutton);
107
108 ui_rbutton_destroy(rbutton);
109 ui_rbutton_group_destroy(group);
110}
111
112/** ui_rbutton_destroy() can take NULL argument (no-op) */
113PCUT_TEST(destroy_null)
114{
115 ui_rbutton_destroy(NULL);
116}
117
118/** ui_rbutton_ctl() returns control that has a working virtual destructor */
119PCUT_TEST(ctl)
120{
121 ui_rbutton_group_t *group = NULL;
122 ui_rbutton_t *rbutton;
123 ui_control_t *control;
124 errno_t rc;
125
126 rc = ui_rbutton_group_create(NULL, &group);
127 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
128
129 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
130 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
131
132 control = ui_rbutton_ctl(rbutton);
133 PCUT_ASSERT_NOT_NULL(control);
134
135 ui_control_destroy(control);
136 ui_rbutton_group_destroy(group);
137}
138
139/** Set radio button rectangle sets internal field */
140PCUT_TEST(set_rect)
141{
142 ui_rbutton_group_t *group = NULL;
143 ui_rbutton_t *rbutton;
144 gfx_rect_t rect;
145 errno_t rc;
146
147 rc = ui_rbutton_group_create(NULL, &group);
148 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
149
150 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
151 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
152
153 rect.p0.x = 1;
154 rect.p0.y = 2;
155 rect.p1.x = 3;
156 rect.p1.y = 4;
157
158 ui_rbutton_set_rect(rbutton, &rect);
159 PCUT_ASSERT_INT_EQUALS(rect.p0.x, rbutton->rect.p0.x);
160 PCUT_ASSERT_INT_EQUALS(rect.p0.y, rbutton->rect.p0.y);
161 PCUT_ASSERT_INT_EQUALS(rect.p1.x, rbutton->rect.p1.x);
162 PCUT_ASSERT_INT_EQUALS(rect.p1.y, rbutton->rect.p1.y);
163
164 ui_rbutton_destroy(rbutton);
165 ui_rbutton_group_destroy(group);
166}
167
168/** Paint radio button in graphics mode */
169PCUT_TEST(paint_gfx)
170{
171 errno_t rc;
172 gfx_context_t *gc = NULL;
173 test_gc_t tgc;
174 ui_rbutton_group_t *group = NULL;
175 ui_resource_t *resource = NULL;
176 ui_rbutton_t *rbutton;
177
178 memset(&tgc, 0, sizeof(tgc));
179 rc = gfx_context_new(&ops, &tgc, &gc);
180 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
181
182 rc = ui_resource_create(gc, false, &resource);
183 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
184 PCUT_ASSERT_NOT_NULL(resource);
185
186 rc = ui_rbutton_group_create(resource, &group);
187 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
188
189 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
190 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
191
192 rc = ui_rbutton_paint_gfx(rbutton);
193 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
194
195 ui_rbutton_destroy(rbutton);
196 ui_rbutton_group_destroy(group);
197 ui_resource_destroy(resource);
198
199 rc = gfx_context_delete(gc);
200 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
201}
202
203/** Paint radio button in text mode */
204PCUT_TEST(paint_text)
205{
206 errno_t rc;
207 gfx_context_t *gc = NULL;
208 test_gc_t tgc;
209 ui_rbutton_group_t *group = NULL;
210 ui_resource_t *resource = NULL;
211 ui_rbutton_t *rbutton;
212
213 memset(&tgc, 0, sizeof(tgc));
214 rc = gfx_context_new(&ops, &tgc, &gc);
215 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
216
217 rc = ui_resource_create(gc, false, &resource);
218 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
219 PCUT_ASSERT_NOT_NULL(resource);
220
221 rc = ui_rbutton_group_create(resource, &group);
222 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
223
224 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
225 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
226
227 rc = ui_rbutton_paint_text(rbutton);
228 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
229
230 ui_rbutton_destroy(rbutton);
231 ui_rbutton_group_destroy(group);
232 ui_resource_destroy(resource);
233
234 rc = gfx_context_delete(gc);
235 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
236}
237
238/** Test ui_rbutton_selected() */
239PCUT_TEST(selected)
240{
241 errno_t rc;
242 ui_rbutton_group_t *group = NULL;
243 ui_rbutton_t *rbutton;
244 test_cb_resp_t resp;
245
246 rc = ui_rbutton_group_create(NULL, &group);
247 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
248
249 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
250 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
251
252 /* Selected with no callbacks set */
253 ui_rbutton_selected(rbutton);
254
255 /* Selected with callback not implementing selected */
256 ui_rbutton_group_set_cb(group, &dummy_rbutton_group_cb, NULL);
257 ui_rbutton_selected(rbutton);
258
259 /* Selected with real callback set */
260 resp.selected = false;
261 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
262 ui_rbutton_selected(rbutton);
263 PCUT_ASSERT_TRUE(resp.selected);
264
265 ui_rbutton_destroy(rbutton);
266 ui_rbutton_group_destroy(group);
267}
268
269/** Press and release radio button */
270PCUT_TEST(press_release)
271{
272 errno_t rc;
273 gfx_context_t *gc = NULL;
274 test_gc_t tgc;
275 ui_resource_t *resource = NULL;
276 ui_rbutton_group_t *group = NULL;
277 ui_rbutton_t *rbutton1;
278 ui_rbutton_t *rbutton2;
279 test_cb_resp_t resp;
280
281 memset(&tgc, 0, sizeof(tgc));
282 rc = gfx_context_new(&ops, &tgc, &gc);
283 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
284
285 rc = ui_resource_create(gc, false, &resource);
286 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
287 PCUT_ASSERT_NOT_NULL(resource);
288
289 rc = ui_rbutton_group_create(resource, &group);
290 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
291 PCUT_ASSERT_NULL(group->selected);
292
293 rc = ui_rbutton_create(group, "One", NULL, &rbutton1);
294 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
295 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
296
297 rc = ui_rbutton_create(group, "Two", NULL, &rbutton2);
298 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
299 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
300
301 resp.selected = false;
302 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
303
304 PCUT_ASSERT_FALSE(rbutton2->held);
305 PCUT_ASSERT_FALSE(rbutton2->inside);
306
307 ui_rbutton_press(rbutton2);
308 PCUT_ASSERT_TRUE(rbutton2->held);
309 PCUT_ASSERT_TRUE(rbutton2->inside);
310 PCUT_ASSERT_FALSE(resp.selected);
311 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
312
313 ui_rbutton_release(rbutton2);
314 PCUT_ASSERT_FALSE(rbutton2->held);
315 PCUT_ASSERT_TRUE(rbutton2->inside);
316 PCUT_ASSERT_TRUE(resp.selected);
317 PCUT_ASSERT_EQUALS(group->selected, rbutton2);
318
319 ui_rbutton_destroy(rbutton1);
320 ui_rbutton_destroy(rbutton2);
321 ui_rbutton_group_destroy(group);
322 ui_resource_destroy(resource);
323
324 rc = gfx_context_delete(gc);
325 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
326}
327
328/** Press, leave and release radio button */
329PCUT_TEST(press_leave_release)
330{
331 errno_t rc;
332 gfx_context_t *gc = NULL;
333 test_gc_t tgc;
334 ui_resource_t *resource = NULL;
335 ui_rbutton_group_t *group = NULL;
336 ui_rbutton_t *rbutton1;
337 ui_rbutton_t *rbutton2;
338 test_cb_resp_t resp;
339
340 memset(&tgc, 0, sizeof(tgc));
341 rc = gfx_context_new(&ops, &tgc, &gc);
342 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
343
344 rc = ui_resource_create(gc, false, &resource);
345 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
346 PCUT_ASSERT_NOT_NULL(resource);
347
348 rc = ui_rbutton_group_create(resource, &group);
349 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
350 PCUT_ASSERT_NULL(group->selected);
351
352 rc = ui_rbutton_create(group, "One", NULL, &rbutton1);
353 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
354 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
355
356 rc = ui_rbutton_create(group, "Two", NULL, &rbutton2);
357 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
358 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
359
360 resp.selected = false;
361 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
362
363 PCUT_ASSERT_FALSE(rbutton2->held);
364 PCUT_ASSERT_FALSE(rbutton2->inside);
365
366 ui_rbutton_press(rbutton2);
367 PCUT_ASSERT_TRUE(rbutton2->held);
368 PCUT_ASSERT_TRUE(rbutton2->inside);
369 PCUT_ASSERT_FALSE(resp.selected);
370 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
371
372 ui_rbutton_leave(rbutton2);
373 PCUT_ASSERT_TRUE(rbutton2->held);
374 PCUT_ASSERT_FALSE(rbutton2->inside);
375 PCUT_ASSERT_FALSE(resp.selected);
376 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
377
378 ui_rbutton_release(rbutton2);
379 PCUT_ASSERT_FALSE(rbutton2->held);
380 PCUT_ASSERT_FALSE(rbutton2->inside);
381 PCUT_ASSERT_FALSE(resp.selected);
382 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
383
384 ui_rbutton_destroy(rbutton1);
385 ui_rbutton_destroy(rbutton2);
386 ui_rbutton_group_destroy(group);
387 ui_resource_destroy(resource);
388
389 rc = gfx_context_delete(gc);
390 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
391}
392
393/** Press, leave, enter and release radio button */
394PCUT_TEST(press_leave_enter_release)
395{
396 errno_t rc;
397 gfx_context_t *gc = NULL;
398 test_gc_t tgc;
399 ui_resource_t *resource = NULL;
400 ui_rbutton_group_t *group = NULL;
401 ui_rbutton_t *rbutton1;
402 ui_rbutton_t *rbutton2;
403 test_cb_resp_t resp;
404
405 memset(&tgc, 0, sizeof(tgc));
406 rc = gfx_context_new(&ops, &tgc, &gc);
407 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
408
409 rc = ui_resource_create(gc, false, &resource);
410 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
411 PCUT_ASSERT_NOT_NULL(resource);
412
413 rc = ui_rbutton_group_create(resource, &group);
414 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
415 PCUT_ASSERT_NULL(group->selected);
416
417 rc = ui_rbutton_create(group, "One", NULL, &rbutton1);
418 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
419 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
420
421 rc = ui_rbutton_create(group, "Two", NULL, &rbutton2);
422 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
423 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
424
425 resp.selected = false;
426 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
427
428 PCUT_ASSERT_FALSE(rbutton2->held);
429 PCUT_ASSERT_FALSE(rbutton2->inside);
430
431 ui_rbutton_press(rbutton2);
432 PCUT_ASSERT_TRUE(rbutton2->held);
433 PCUT_ASSERT_TRUE(rbutton2->inside);
434 PCUT_ASSERT_FALSE(resp.selected);
435 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
436
437 ui_rbutton_leave(rbutton2);
438 PCUT_ASSERT_TRUE(rbutton2->held);
439 PCUT_ASSERT_FALSE(rbutton2->inside);
440 PCUT_ASSERT_FALSE(resp.selected);
441 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
442
443 ui_rbutton_enter(rbutton2);
444 PCUT_ASSERT_TRUE(rbutton2->held);
445 PCUT_ASSERT_TRUE(rbutton2->inside);
446 PCUT_ASSERT_FALSE(resp.selected);
447 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
448
449 ui_rbutton_release(rbutton2);
450 PCUT_ASSERT_FALSE(rbutton2->held);
451 PCUT_ASSERT_TRUE(rbutton2->inside);
452 PCUT_ASSERT_TRUE(resp.selected);
453 PCUT_ASSERT_EQUALS(group->selected, rbutton2);
454
455 ui_rbutton_destroy(rbutton1);
456 ui_rbutton_destroy(rbutton2);
457 ui_rbutton_group_destroy(group);
458 ui_resource_destroy(resource);
459
460 rc = gfx_context_delete(gc);
461 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
462}
463
464/** ui_pos_event() correctly translates POS_PRESS/POS_RELEASE */
465PCUT_TEST(pos_event_press_release)
466{
467 errno_t rc;
468 gfx_context_t *gc = NULL;
469 test_gc_t tgc;
470 ui_resource_t *resource = NULL;
471 ui_rbutton_group_t *group = NULL;
472 ui_rbutton_t *rbutton;
473 ui_evclaim_t claim;
474 pos_event_t event;
475 gfx_rect_t rect;
476
477 memset(&tgc, 0, sizeof(tgc));
478 rc = gfx_context_new(&ops, &tgc, &gc);
479 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
480
481 rc = ui_resource_create(gc, false, &resource);
482 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
483 PCUT_ASSERT_NOT_NULL(resource);
484
485 rc = ui_rbutton_group_create(resource, &group);
486 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
487
488 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
489 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
490
491 PCUT_ASSERT_FALSE(rbutton->held);
492
493 rect.p0.x = 10;
494 rect.p0.y = 20;
495 rect.p1.x = 30;
496 rect.p1.y = 40;
497 ui_rbutton_set_rect(rbutton, &rect);
498
499 /* Press outside is not claimed and does nothing */
500 event.type = POS_PRESS;
501 event.hpos = 9;
502 event.vpos = 20;
503 claim = ui_rbutton_pos_event(rbutton, &event);
504 PCUT_ASSERT_FALSE(rbutton->held);
505 PCUT_ASSERT_EQUALS(ui_unclaimed, claim);
506
507 /* Press inside is claimed and depresses radio button */
508 event.type = POS_PRESS;
509 event.hpos = 10;
510 event.vpos = 20;
511 claim = ui_rbutton_pos_event(rbutton, &event);
512 PCUT_ASSERT_TRUE(rbutton->held);
513 PCUT_ASSERT_EQUALS(ui_claimed, claim);
514
515 /* Release outside (or anywhere) is claimed and relases radio button */
516 event.type = POS_RELEASE;
517 event.hpos = 9;
518 event.vpos = 20;
519 claim = ui_rbutton_pos_event(rbutton, &event);
520 PCUT_ASSERT_FALSE(rbutton->held);
521 PCUT_ASSERT_EQUALS(ui_claimed, claim);
522
523 ui_rbutton_destroy(rbutton);
524 ui_rbutton_group_destroy(group);
525 ui_resource_destroy(resource);
526
527 rc = gfx_context_delete(gc);
528 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
529}
530
531/** ui_pos_event() correctly translates POS_UPDATE to enter/leave */
532PCUT_TEST(pos_event_enter_leave)
533{
534 errno_t rc;
535 gfx_context_t *gc = NULL;
536 test_gc_t tgc;
537 ui_resource_t *resource = NULL;
538 ui_rbutton_group_t *group = NULL;
539 ui_rbutton_t *rbutton;
540 pos_event_t event;
541 gfx_rect_t rect;
542
543 memset(&tgc, 0, sizeof(tgc));
544 rc = gfx_context_new(&ops, &tgc, &gc);
545 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
546
547 rc = ui_resource_create(gc, false, &resource);
548 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
549 PCUT_ASSERT_NOT_NULL(resource);
550
551 rc = ui_rbutton_group_create(resource, &group);
552 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
553
554 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
555 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
556
557 PCUT_ASSERT_FALSE(rbutton->inside);
558
559 rect.p0.x = 10;
560 rect.p0.y = 20;
561 rect.p1.x = 30;
562 rect.p1.y = 40;
563 ui_rbutton_set_rect(rbutton, &rect);
564
565 /* Moving outside does nothing */
566 event.type = POS_UPDATE;
567 event.hpos = 9;
568 event.vpos = 20;
569 ui_rbutton_pos_event(rbutton, &event);
570 PCUT_ASSERT_FALSE(rbutton->inside);
571
572 /* Moving inside sets inside flag */
573 event.type = POS_UPDATE;
574 event.hpos = 10;
575 event.vpos = 20;
576 ui_rbutton_pos_event(rbutton, &event);
577 PCUT_ASSERT_TRUE(rbutton->inside);
578
579 /* Moving outside clears inside flag */
580 event.type = POS_UPDATE;
581 event.hpos = 9;
582 event.vpos = 20;
583 ui_rbutton_pos_event(rbutton, &event);
584 PCUT_ASSERT_FALSE(rbutton->inside);
585
586 ui_rbutton_destroy(rbutton);
587 ui_rbutton_group_destroy(group);
588 ui_resource_destroy(resource);
589
590 rc = gfx_context_delete(gc);
591 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
592}
593
594static errno_t testgc_set_clip_rect(void *arg, gfx_rect_t *rect)
595{
596 (void) arg;
597 (void) rect;
598 return EOK;
599}
600
601static errno_t testgc_set_color(void *arg, gfx_color_t *color)
602{
603 (void) arg;
604 (void) color;
605 return EOK;
606}
607
608static errno_t testgc_fill_rect(void *arg, gfx_rect_t *rect)
609{
610 (void) arg;
611 (void) rect;
612 return EOK;
613}
614
615static errno_t testgc_update(void *arg)
616{
617 (void) arg;
618 return EOK;
619}
620
621static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
622 gfx_bitmap_alloc_t *alloc, void **rbm)
623{
624 test_gc_t *tgc = (test_gc_t *) arg;
625 testgc_bitmap_t *tbm;
626
627 tbm = calloc(1, sizeof(testgc_bitmap_t));
628 if (tbm == NULL)
629 return ENOMEM;
630
631 if (alloc == NULL) {
632 tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
633 sizeof(uint32_t);
634 tbm->alloc.off0 = 0;
635 tbm->alloc.pixels = calloc(sizeof(uint32_t),
636 (params->rect.p1.x - params->rect.p0.x) *
637 (params->rect.p1.y - params->rect.p0.y));
638 tbm->myalloc = true;
639 if (tbm->alloc.pixels == NULL) {
640 free(tbm);
641 return ENOMEM;
642 }
643 } else {
644 tbm->alloc = *alloc;
645 }
646
647 tbm->tgc = tgc;
648 tgc->bm_created = true;
649 tgc->bm_params = *params;
650 tgc->bm_pixels = tbm->alloc.pixels;
651 *rbm = (void *)tbm;
652 return EOK;
653}
654
655static errno_t testgc_bitmap_destroy(void *bm)
656{
657 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
658 if (tbm->myalloc)
659 free(tbm->alloc.pixels);
660 tbm->tgc->bm_destroyed = true;
661 free(tbm);
662 return EOK;
663}
664
665static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
666 gfx_coord2_t *offs)
667{
668 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
669 tbm->tgc->bm_rendered = true;
670 tbm->tgc->bm_srect = *srect;
671 tbm->tgc->bm_offs = *offs;
672 return EOK;
673}
674
675static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
676{
677 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
678 *alloc = tbm->alloc;
679 tbm->tgc->bm_got_alloc = true;
680 return EOK;
681}
682
683static void test_rbutton_select(ui_rbutton_group_t *group, void *arg,
684 void *barg)
685{
686 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
687
688 resp->selected = true;
689}
690
691PCUT_EXPORT(rbutton);
Note: See TracBrowser for help on using the repository browser.