source: mainline/uspace/lib/ui/test/wdecor.c@ 6828a56

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

Add pos_id information to move request, too

This will become useful momentarily.

  • Property mode set to 100644
File size: 28.1 KB
Line 
1/*
2 * Copyright (c) 2023 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/pbutton.h>
35#include <ui/resource.h>
36#include <ui/wdecor.h>
37#include "../private/wdecor.h"
38
39PCUT_INIT;
40
41PCUT_TEST_SUITE(wdecor);
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_wdecor_minimize(ui_wdecor_t *, void *);
65static void test_wdecor_maximize(ui_wdecor_t *, void *);
66static void test_wdecor_unmaximize(ui_wdecor_t *, void *);
67static void test_wdecor_close(ui_wdecor_t *, void *);
68static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *, sysarg_t);
69static void test_wdecor_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
70 gfx_coord2_t *, sysarg_t);
71static void test_wdecor_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
72
73static ui_wdecor_cb_t test_wdecor_cb = {
74 .minimize = test_wdecor_minimize,
75 .maximize = test_wdecor_maximize,
76 .unmaximize = test_wdecor_unmaximize,
77 .close = test_wdecor_close,
78 .move = test_wdecor_move,
79 .resize = test_wdecor_resize,
80 .set_cursor = test_wdecor_set_cursor
81};
82
83static ui_wdecor_cb_t dummy_wdecor_cb = {
84};
85
86typedef struct {
87 bool bm_created;
88 bool bm_destroyed;
89 gfx_bitmap_params_t bm_params;
90 void *bm_pixels;
91 gfx_rect_t bm_srect;
92 gfx_coord2_t bm_offs;
93 bool bm_rendered;
94 bool bm_got_alloc;
95} test_gc_t;
96
97typedef struct {
98 test_gc_t *tgc;
99 gfx_bitmap_alloc_t alloc;
100 bool myalloc;
101} testgc_bitmap_t;
102
103typedef struct {
104 bool minimize;
105 bool maximize;
106 bool unmaximize;
107 bool close;
108 bool move;
109 gfx_coord2_t pos;
110 sysarg_t pos_id;
111 bool resize;
112 ui_wdecor_rsztype_t rsztype;
113 bool set_cursor;
114 ui_stock_cursor_t cursor;
115} test_cb_resp_t;
116
117/** Create and destroy button */
118PCUT_TEST(create_destroy)
119{
120 ui_wdecor_t *wdecor = NULL;
121 errno_t rc;
122
123 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
124 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
125 PCUT_ASSERT_NOT_NULL(wdecor);
126
127 ui_wdecor_destroy(wdecor);
128}
129
130/** ui_wdecor_destroy() can take NULL argument (no-op) */
131PCUT_TEST(destroy_null)
132{
133 ui_wdecor_destroy(NULL);
134}
135
136/** Set window decoration rectangle sets internal field */
137PCUT_TEST(set_rect)
138{
139 ui_wdecor_t *wdecor;
140 gfx_rect_t rect;
141 errno_t rc;
142
143 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
144 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
145
146 rect.p0.x = 1;
147 rect.p0.y = 2;
148 rect.p1.x = 3;
149 rect.p1.y = 4;
150
151 ui_wdecor_set_rect(wdecor, &rect);
152 PCUT_ASSERT_INT_EQUALS(rect.p0.x, wdecor->rect.p0.x);
153 PCUT_ASSERT_INT_EQUALS(rect.p0.y, wdecor->rect.p0.y);
154 PCUT_ASSERT_INT_EQUALS(rect.p1.x, wdecor->rect.p1.x);
155 PCUT_ASSERT_INT_EQUALS(rect.p1.y, wdecor->rect.p1.y);
156
157 ui_wdecor_destroy(wdecor);
158}
159
160/** Set window decoration active sets internal field */
161PCUT_TEST(set_active)
162{
163 ui_wdecor_t *wdecor;
164 errno_t rc;
165
166 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
167 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
168
169 PCUT_ASSERT_TRUE(wdecor->active);
170
171 ui_wdecor_set_active(wdecor, false);
172 PCUT_ASSERT_FALSE(wdecor->active);
173
174 ui_wdecor_set_active(wdecor, true);
175 PCUT_ASSERT_TRUE(wdecor->active);
176
177 ui_wdecor_destroy(wdecor);
178}
179
180/** Set window decoration maximized sets internal field */
181PCUT_TEST(set_maximized)
182{
183 ui_wdecor_t *wdecor;
184 errno_t rc;
185
186 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
187 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
188
189 PCUT_ASSERT_TRUE(wdecor->active);
190
191 ui_wdecor_set_maximized(wdecor, false);
192 PCUT_ASSERT_FALSE(wdecor->maximized);
193
194 ui_wdecor_set_maximized(wdecor, true);
195 PCUT_ASSERT_TRUE(wdecor->maximized);
196
197 ui_wdecor_destroy(wdecor);
198}
199
200/** Paint button */
201PCUT_TEST(paint)
202{
203 errno_t rc;
204 gfx_context_t *gc = NULL;
205 test_gc_t tgc;
206 ui_resource_t *resource = NULL;
207 ui_wdecor_t *wdecor;
208
209 memset(&tgc, 0, sizeof(tgc));
210 rc = gfx_context_new(&ops, &tgc, &gc);
211 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
212
213 rc = ui_resource_create(gc, false, &resource);
214 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
215 PCUT_ASSERT_NOT_NULL(resource);
216
217 rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor);
218 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
219
220 rc = ui_wdecor_paint(wdecor);
221 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
222
223 ui_wdecor_destroy(wdecor);
224 ui_resource_destroy(resource);
225
226 rc = gfx_context_delete(gc);
227 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
228}
229
230/** Test ui_wdecor_minimize() */
231PCUT_TEST(minimize)
232{
233 errno_t rc;
234 ui_wdecor_t *wdecor;
235 test_cb_resp_t resp;
236
237 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
238 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
239
240 /* Minimize callback with no callbacks set */
241 ui_wdecor_minimize(wdecor);
242
243 /* Minimize callback with minimize callback not implemented */
244 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
245 ui_wdecor_minimize(wdecor);
246
247 /* Minimize callback with real callback set */
248 resp.minimize = false;
249 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
250 ui_wdecor_minimize(wdecor);
251 PCUT_ASSERT_TRUE(resp.minimize);
252
253 ui_wdecor_destroy(wdecor);
254}
255
256/** Test ui_wdecor_maximize() */
257PCUT_TEST(maximize)
258{
259 errno_t rc;
260 ui_wdecor_t *wdecor;
261 test_cb_resp_t resp;
262
263 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
264 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
265
266 /* Maximize callback with no callbacks set */
267 ui_wdecor_maximize(wdecor);
268
269 /* Maxmimize callback with maximize callback not implemented */
270 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
271 ui_wdecor_maximize(wdecor);
272
273 /* Maximize callback with real callback set */
274 resp.maximize = false;
275 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
276 ui_wdecor_maximize(wdecor);
277 PCUT_ASSERT_TRUE(resp.maximize);
278
279 ui_wdecor_destroy(wdecor);
280}
281
282/** Test ui_wdecor_unmaximize() */
283PCUT_TEST(unmaximize)
284{
285 errno_t rc;
286 ui_wdecor_t *wdecor;
287 test_cb_resp_t resp;
288
289 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
290 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
291
292 /* Unmaximize callback with no callbacks set */
293 ui_wdecor_unmaximize(wdecor);
294
295 /* Unmaximize callback with unmaximize callback not implemented */
296 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
297 ui_wdecor_unmaximize(wdecor);
298
299 /* Unmaximize callback with real callback set */
300 resp.unmaximize = false;
301 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
302 ui_wdecor_unmaximize(wdecor);
303 PCUT_ASSERT_TRUE(resp.unmaximize);
304
305 ui_wdecor_destroy(wdecor);
306}
307
308/** Test ui_wdecor_close() */
309PCUT_TEST(close)
310{
311 errno_t rc;
312 ui_wdecor_t *wdecor;
313 test_cb_resp_t resp;
314
315 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
316 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
317
318 /* Close callback with no callbacks set */
319 ui_wdecor_close(wdecor);
320
321 /* Close callback with close callback not implemented */
322 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
323 ui_wdecor_close(wdecor);
324
325 /* Close callback with real callback set */
326 resp.close = false;
327 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
328 ui_wdecor_close(wdecor);
329 PCUT_ASSERT_TRUE(resp.close);
330
331 ui_wdecor_destroy(wdecor);
332}
333
334/** Test ui_wdecor_move() */
335PCUT_TEST(move)
336{
337 errno_t rc;
338 ui_wdecor_t *wdecor;
339 test_cb_resp_t resp;
340 gfx_coord2_t pos;
341 sysarg_t pos_id;
342
343 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
344 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
345
346 pos.x = 3;
347 pos.y = 4;
348 pos_id = 5;
349
350 /* Move callback with no callbacks set */
351 ui_wdecor_move(wdecor, &pos, pos_id);
352
353 /* Move callback with move callback not implemented */
354 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
355 ui_wdecor_move(wdecor, &pos, pos_id);
356
357 /* Move callback with real callback set */
358 resp.move = false;
359 resp.pos.x = 0;
360 resp.pos.y = 0;
361 resp.pos_id = 0;
362 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
363 ui_wdecor_move(wdecor, &pos, pos_id);
364 PCUT_ASSERT_TRUE(resp.move);
365 PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
366 PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
367 PCUT_ASSERT_INT_EQUALS(pos_id, resp.pos_id);
368
369 ui_wdecor_destroy(wdecor);
370}
371
372/** Test ui_wdecor_resize() */
373PCUT_TEST(resize)
374{
375 errno_t rc;
376 ui_wdecor_t *wdecor;
377 test_cb_resp_t resp;
378 ui_wdecor_rsztype_t rsztype;
379 gfx_coord2_t pos;
380 sysarg_t pos_id;
381
382 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
383 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
384
385 rsztype = ui_wr_bottom;
386 pos.x = 3;
387 pos.y = 4;
388 pos_id = 5;
389
390 /* Resize callback with no callbacks set */
391 ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
392
393 /* Resize callback with move callback not implemented */
394 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
395 ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
396
397 /* Resize callback with real callback set */
398 resp.resize = false;
399 resp.rsztype = ui_wr_none;
400 resp.pos.x = 0;
401 resp.pos.y = 0;
402 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
403 ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
404 PCUT_ASSERT_TRUE(resp.resize);
405 PCUT_ASSERT_INT_EQUALS(rsztype, resp.rsztype);
406 PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
407 PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
408 PCUT_ASSERT_INT_EQUALS(pos_id, resp.pos_id);
409
410 ui_wdecor_destroy(wdecor);
411}
412
413/** Test ui_wdecor_set_cursor() */
414PCUT_TEST(set_cursor)
415{
416 errno_t rc;
417 ui_wdecor_t *wdecor;
418 test_cb_resp_t resp;
419 ui_stock_cursor_t cursor;
420
421 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
422 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
423
424 cursor = ui_curs_size_uldr;
425
426 /* Set cursor callback with no callbacks set */
427 ui_wdecor_set_cursor(wdecor, cursor);
428
429 /* Set cursor callback with move callback not implemented */
430 ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
431 ui_wdecor_set_cursor(wdecor, cursor);
432
433 /* Set cursor callback with real callback set */
434 resp.set_cursor = false;
435 resp.cursor = ui_curs_arrow;
436 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
437 ui_wdecor_set_cursor(wdecor, cursor);
438 PCUT_ASSERT_TRUE(resp.set_cursor);
439 PCUT_ASSERT_INT_EQUALS(cursor, resp.cursor);
440
441 ui_wdecor_destroy(wdecor);
442}
443
444/** Clicking the close button generates close callback */
445PCUT_TEST(close_btn_clicked)
446{
447 ui_wdecor_t *wdecor;
448 gfx_rect_t rect;
449 test_cb_resp_t resp;
450 errno_t rc;
451
452 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
453 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
454
455 rect.p0.x = 10;
456 rect.p0.y = 20;
457 rect.p1.x = 100;
458 rect.p1.y = 200;
459
460 ui_wdecor_set_rect(wdecor, &rect);
461
462 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
463
464 resp.close = false;
465
466 ui_pbutton_clicked(wdecor->btn_close);
467 PCUT_ASSERT_TRUE(resp.close);
468
469 ui_wdecor_destroy(wdecor);
470}
471
472/** Button press on title bar generates move callback */
473PCUT_TEST(pos_event_move)
474{
475 errno_t rc;
476 gfx_rect_t rect;
477 pos_event_t event;
478 gfx_context_t *gc = NULL;
479 test_gc_t tgc;
480 test_cb_resp_t resp;
481 ui_resource_t *resource = NULL;
482 ui_wdecor_t *wdecor;
483
484 memset(&tgc, 0, sizeof(tgc));
485 rc = gfx_context_new(&ops, &tgc, &gc);
486 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
487
488 rc = ui_resource_create(gc, false, &resource);
489 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
490 PCUT_ASSERT_NOT_NULL(resource);
491
492 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
493 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
494
495 rect.p0.x = 10;
496 rect.p0.y = 20;
497 rect.p1.x = 100;
498 rect.p1.y = 200;
499
500 ui_wdecor_set_rect(wdecor, &rect);
501
502 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
503
504 resp.move = false;
505 resp.pos.x = 0;
506 resp.pos.y = 0;
507
508 event.type = POS_PRESS;
509 event.hpos = 50;
510 event.vpos = 25;
511 ui_wdecor_pos_event(wdecor, &event);
512
513 PCUT_ASSERT_TRUE(resp.move);
514 PCUT_ASSERT_INT_EQUALS(event.hpos, resp.pos.x);
515 PCUT_ASSERT_INT_EQUALS(event.vpos, resp.pos.y);
516
517 ui_wdecor_destroy(wdecor);
518 ui_resource_destroy(resource);
519
520 rc = gfx_context_delete(gc);
521 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
522}
523
524/** ui_wdecor_get_geom() with ui_wds_none produces the correct geometry */
525PCUT_TEST(get_geom_none)
526{
527 gfx_context_t *gc = NULL;
528 test_gc_t tgc;
529 ui_resource_t *resource = NULL;
530 ui_wdecor_t *wdecor;
531 gfx_rect_t rect;
532 ui_wdecor_geom_t geom;
533 errno_t rc;
534
535 memset(&tgc, 0, sizeof(tgc));
536 rc = gfx_context_new(&ops, &tgc, &gc);
537 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
538
539 rc = ui_resource_create(gc, false, &resource);
540 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
541 PCUT_ASSERT_NOT_NULL(resource);
542
543 rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor);
544 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
545
546 rect.p0.x = 10;
547 rect.p0.y = 20;
548 rect.p1.x = 100;
549 rect.p1.y = 200;
550
551 ui_wdecor_set_rect(wdecor, &rect);
552 ui_wdecor_get_geom(wdecor, &geom);
553
554 PCUT_ASSERT_INT_EQUALS(10, geom.interior_rect.p0.x);
555 PCUT_ASSERT_INT_EQUALS(20, geom.interior_rect.p0.y);
556 PCUT_ASSERT_INT_EQUALS(100, geom.interior_rect.p1.x);
557 PCUT_ASSERT_INT_EQUALS(200, geom.interior_rect.p1.y);
558
559 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.x);
560 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.y);
561 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.x);
562 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.y);
563
564 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x);
565 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y);
566 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.x);
567 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.y);
568
569 PCUT_ASSERT_INT_EQUALS(10, geom.app_area_rect.p0.x);
570 PCUT_ASSERT_INT_EQUALS(20, geom.app_area_rect.p0.y);
571 PCUT_ASSERT_INT_EQUALS(100, geom.app_area_rect.p1.x);
572 PCUT_ASSERT_INT_EQUALS(200, geom.app_area_rect.p1.y);
573
574 ui_wdecor_destroy(wdecor);
575 ui_resource_destroy(resource);
576
577 rc = gfx_context_delete(gc);
578 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
579}
580
581/** ui_wdecor_get_geom() with ui_wds_frame produces the correct geometry */
582PCUT_TEST(get_geom_frame)
583{
584 gfx_context_t *gc = NULL;
585 test_gc_t tgc;
586 ui_resource_t *resource = NULL;
587 ui_wdecor_t *wdecor;
588 gfx_rect_t rect;
589 ui_wdecor_geom_t geom;
590 errno_t rc;
591
592 memset(&tgc, 0, sizeof(tgc));
593 rc = gfx_context_new(&ops, &tgc, &gc);
594 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
595
596 rc = ui_resource_create(gc, false, &resource);
597 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
598 PCUT_ASSERT_NOT_NULL(resource);
599
600 rc = ui_wdecor_create(resource, "Hello", ui_wds_frame, &wdecor);
601 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
602
603 rect.p0.x = 10;
604 rect.p0.y = 20;
605 rect.p1.x = 100;
606 rect.p1.y = 200;
607
608 ui_wdecor_set_rect(wdecor, &rect);
609 ui_wdecor_get_geom(wdecor, &geom);
610
611 PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
612 PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
613 PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
614 PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
615
616 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.x);
617 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p0.y);
618 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.x);
619 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.y);
620
621 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x);
622 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y);
623 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.x);
624 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.y);
625
626 PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
627 PCUT_ASSERT_INT_EQUALS(24, geom.app_area_rect.p0.y);
628 PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
629 PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
630
631 ui_wdecor_destroy(wdecor);
632 ui_resource_destroy(resource);
633
634 rc = gfx_context_delete(gc);
635 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
636}
637
638/** ui_wdecor_get_geom() with ui_wds_frame | ui_wds_titlebar */
639PCUT_TEST(get_geom_frame_titlebar)
640{
641 gfx_context_t *gc = NULL;
642 test_gc_t tgc;
643 ui_resource_t *resource = NULL;
644 ui_wdecor_t *wdecor;
645 gfx_rect_t rect;
646 ui_wdecor_geom_t geom;
647 errno_t rc;
648
649 memset(&tgc, 0, sizeof(tgc));
650 rc = gfx_context_new(&ops, &tgc, &gc);
651 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
652
653 rc = ui_resource_create(gc, false, &resource);
654 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
655 PCUT_ASSERT_NOT_NULL(resource);
656
657 rc = ui_wdecor_create(resource, "Hello", ui_wds_frame | ui_wds_titlebar,
658 &wdecor);
659 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
660
661 rect.p0.x = 10;
662 rect.p0.y = 20;
663 rect.p1.x = 100;
664 rect.p1.y = 200;
665
666 ui_wdecor_set_rect(wdecor, &rect);
667 ui_wdecor_get_geom(wdecor, &geom);
668
669 PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
670 PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
671 PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
672 PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
673
674 PCUT_ASSERT_INT_EQUALS(14, geom.title_bar_rect.p0.x);
675 PCUT_ASSERT_INT_EQUALS(24, geom.title_bar_rect.p0.y);
676 PCUT_ASSERT_INT_EQUALS(96, geom.title_bar_rect.p1.x);
677 PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y);
678
679 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x);
680 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y);
681 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.x);
682 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p1.y);
683
684 PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
685 PCUT_ASSERT_INT_EQUALS(46, geom.app_area_rect.p0.y);
686 PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
687 PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
688
689 ui_wdecor_destroy(wdecor);
690 ui_resource_destroy(resource);
691
692 rc = gfx_context_delete(gc);
693 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
694}
695
696/** ui_wdecor_get_geom() with ui_wds_decorated produces the correct geometry */
697PCUT_TEST(get_geom_decorated)
698{
699 gfx_context_t *gc = NULL;
700 test_gc_t tgc;
701 ui_resource_t *resource = NULL;
702 ui_wdecor_t *wdecor;
703 gfx_rect_t rect;
704 ui_wdecor_geom_t geom;
705 errno_t rc;
706
707 memset(&tgc, 0, sizeof(tgc));
708 rc = gfx_context_new(&ops, &tgc, &gc);
709 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
710
711 rc = ui_resource_create(gc, false, &resource);
712 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
713 PCUT_ASSERT_NOT_NULL(resource);
714
715 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor);
716 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
717
718 rect.p0.x = 10;
719 rect.p0.y = 20;
720 rect.p1.x = 100;
721 rect.p1.y = 200;
722
723 ui_wdecor_set_rect(wdecor, &rect);
724 ui_wdecor_get_geom(wdecor, &geom);
725
726 PCUT_ASSERT_INT_EQUALS(14, geom.interior_rect.p0.x);
727 PCUT_ASSERT_INT_EQUALS(24, geom.interior_rect.p0.y);
728 PCUT_ASSERT_INT_EQUALS(96, geom.interior_rect.p1.x);
729 PCUT_ASSERT_INT_EQUALS(196, geom.interior_rect.p1.y);
730
731 PCUT_ASSERT_INT_EQUALS(14, geom.title_bar_rect.p0.x);
732 PCUT_ASSERT_INT_EQUALS(24, geom.title_bar_rect.p0.y);
733 PCUT_ASSERT_INT_EQUALS(96, geom.title_bar_rect.p1.x);
734 PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y);
735
736 PCUT_ASSERT_INT_EQUALS(75, geom.btn_close_rect.p0.x);
737 PCUT_ASSERT_INT_EQUALS(25, geom.btn_close_rect.p0.y);
738 PCUT_ASSERT_INT_EQUALS(95, geom.btn_close_rect.p1.x);
739 PCUT_ASSERT_INT_EQUALS(45, geom.btn_close_rect.p1.y);
740
741 PCUT_ASSERT_INT_EQUALS(14, geom.app_area_rect.p0.x);
742 PCUT_ASSERT_INT_EQUALS(46, geom.app_area_rect.p0.y);
743 PCUT_ASSERT_INT_EQUALS(96, geom.app_area_rect.p1.x);
744 PCUT_ASSERT_INT_EQUALS(196, geom.app_area_rect.p1.y);
745
746 ui_wdecor_destroy(wdecor);
747 ui_resource_destroy(resource);
748
749 rc = gfx_context_delete(gc);
750 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
751}
752
753/** ui_wdecor_rect_from_app() correctly converts application to window rect */
754PCUT_TEST(rect_from_app)
755{
756 gfx_rect_t arect;
757 gfx_rect_t rect;
758
759 arect.p0.x = 14;
760 arect.p0.y = 46;
761 arect.p1.x = 96;
762 arect.p1.y = 196;
763
764 ui_wdecor_rect_from_app(ui_wds_none, &arect, &rect);
765
766 PCUT_ASSERT_INT_EQUALS(14, rect.p0.x);
767 PCUT_ASSERT_INT_EQUALS(46, rect.p0.y);
768 PCUT_ASSERT_INT_EQUALS(96, rect.p1.x);
769 PCUT_ASSERT_INT_EQUALS(196, rect.p1.y);
770
771 ui_wdecor_rect_from_app(ui_wds_frame, &arect, &rect);
772
773 PCUT_ASSERT_INT_EQUALS(10, rect.p0.x);
774 PCUT_ASSERT_INT_EQUALS(42, rect.p0.y);
775 PCUT_ASSERT_INT_EQUALS(100, rect.p1.x);
776 PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
777
778 ui_wdecor_rect_from_app(ui_wds_decorated, &arect, &rect);
779
780 PCUT_ASSERT_INT_EQUALS(10, rect.p0.x);
781 PCUT_ASSERT_INT_EQUALS(20, rect.p0.y);
782 PCUT_ASSERT_INT_EQUALS(100, rect.p1.x);
783 PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
784
785}
786
787/** Test ui_wdecor_get_rsztype() */
788PCUT_TEST(get_rsztype)
789{
790 ui_wdecor_t *wdecor;
791 gfx_rect_t rect;
792 ui_wdecor_rsztype_t rsztype;
793 gfx_coord2_t pos;
794 errno_t rc;
795
796 rc = ui_wdecor_create(NULL, "Hello", ui_wds_resizable, &wdecor);
797 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
798
799 rect.p0.x = 10;
800 rect.p0.y = 20;
801 rect.p1.x = 100;
802 rect.p1.y = 200;
803
804 ui_wdecor_set_rect(wdecor, &rect);
805
806 /* Outside of the window */
807 pos.x = 0;
808 pos.y = -1;
809 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
810 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
811
812 /* Middle of the window */
813 pos.x = 50;
814 pos.y = 100;
815 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
816 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
817
818 /* Top-left corner, but not on edge */
819 pos.x = 20;
820 pos.y = 30;
821 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
822 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
823
824 /* Top-left corner on top edge */
825 pos.x = 20;
826 pos.y = 20;
827 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
828 PCUT_ASSERT_EQUALS(ui_wr_top_left, rsztype);
829
830 /* Top-left corner on left edge */
831 pos.x = 10;
832 pos.y = 30;
833 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
834 PCUT_ASSERT_EQUALS(ui_wr_top_left, rsztype);
835
836 /* Top-right corner on top edge */
837 pos.x = 90;
838 pos.y = 20;
839 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
840 PCUT_ASSERT_EQUALS(ui_wr_top_right, rsztype);
841
842 /* Top-right corner on right edge */
843 pos.x = 99;
844 pos.y = 30;
845 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
846 PCUT_ASSERT_EQUALS(ui_wr_top_right, rsztype);
847
848 /* Top edge */
849 pos.x = 50;
850 pos.y = 20;
851 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
852 PCUT_ASSERT_EQUALS(ui_wr_top, rsztype);
853
854 /* Bottom edge */
855 pos.x = 50;
856 pos.y = 199;
857 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
858 PCUT_ASSERT_EQUALS(ui_wr_bottom, rsztype);
859
860 /* Left edge */
861 pos.x = 10;
862 pos.y = 100;
863 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
864 PCUT_ASSERT_EQUALS(ui_wr_left, rsztype);
865
866 /* Right edge */
867 pos.x = 99;
868 pos.y = 100;
869 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
870 PCUT_ASSERT_EQUALS(ui_wr_right, rsztype);
871
872 ui_wdecor_destroy(wdecor);
873
874 /* Non-resizable window */
875
876 rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
877 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
878
879 rect.p0.x = 10;
880 rect.p0.y = 20;
881 rect.p1.x = 100;
882 rect.p1.y = 200;
883
884 ui_wdecor_set_rect(wdecor, &rect);
885
886 pos.x = 10;
887 pos.y = 20;
888 rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
889 PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
890
891 ui_wdecor_destroy(wdecor);
892}
893
894/** Test ui_wdecor_cursor_from_rsztype() */
895PCUT_TEST(cursor_from_rsztype)
896{
897 PCUT_ASSERT_EQUALS(ui_curs_arrow,
898 ui_wdecor_cursor_from_rsztype(ui_wr_none));
899 PCUT_ASSERT_EQUALS(ui_curs_size_ud,
900 ui_wdecor_cursor_from_rsztype(ui_wr_top));
901 PCUT_ASSERT_EQUALS(ui_curs_size_ud,
902 ui_wdecor_cursor_from_rsztype(ui_wr_bottom));
903 PCUT_ASSERT_EQUALS(ui_curs_size_lr,
904 ui_wdecor_cursor_from_rsztype(ui_wr_left));
905 PCUT_ASSERT_EQUALS(ui_curs_size_lr,
906 ui_wdecor_cursor_from_rsztype(ui_wr_right));
907 PCUT_ASSERT_EQUALS(ui_curs_size_uldr,
908 ui_wdecor_cursor_from_rsztype(ui_wr_top_left));
909 PCUT_ASSERT_EQUALS(ui_curs_size_uldr,
910 ui_wdecor_cursor_from_rsztype(ui_wr_bottom_right));
911 PCUT_ASSERT_EQUALS(ui_curs_size_urdl,
912 ui_wdecor_cursor_from_rsztype(ui_wr_top_right));
913 PCUT_ASSERT_EQUALS(ui_curs_size_urdl,
914 ui_wdecor_cursor_from_rsztype(ui_wr_bottom_left));
915}
916
917/** Test ui_wdecor_frame_pos_event() */
918PCUT_TEST(frame_pos_event)
919{
920 ui_wdecor_t *wdecor;
921 gfx_rect_t rect;
922 test_cb_resp_t resp;
923 pos_event_t event;
924 errno_t rc;
925
926 rc = ui_wdecor_create(NULL, "Hello", ui_wds_resizable, &wdecor);
927 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
928
929 rect.p0.x = 10;
930 rect.p0.y = 20;
931 rect.p1.x = 100;
932 rect.p1.y = 200;
933
934 ui_wdecor_set_rect(wdecor, &rect);
935 ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
936
937 /* Release on window border should do nothing */
938 resp.resize = false;
939 event.type = POS_RELEASE;
940 event.hpos = 10;
941 event.vpos = 10;
942 ui_wdecor_frame_pos_event(wdecor, &event);
943 PCUT_ASSERT_FALSE(resp.resize);
944
945 /* Press in the middle of the window should do nothing */
946 resp.resize = false;
947 event.type = POS_PRESS;
948 event.hpos = 50;
949 event.vpos = 100;
950 ui_wdecor_frame_pos_event(wdecor, &event);
951 PCUT_ASSERT_FALSE(resp.resize);
952
953 /* Press on window border should cause resize to be called */
954 resp.resize = false;
955 event.type = POS_PRESS;
956 event.hpos = 10;
957 event.vpos = 20;
958 ui_wdecor_frame_pos_event(wdecor, &event);
959 PCUT_ASSERT_TRUE(resp.resize);
960
961 ui_wdecor_destroy(wdecor);
962}
963
964static errno_t testgc_set_clip_rect(void *arg, gfx_rect_t *rect)
965{
966 (void) arg;
967 (void) rect;
968 return EOK;
969}
970
971static errno_t testgc_set_color(void *arg, gfx_color_t *color)
972{
973 (void) arg;
974 (void) color;
975 return EOK;
976}
977
978static errno_t testgc_fill_rect(void *arg, gfx_rect_t *rect)
979{
980 (void) arg;
981 (void) rect;
982 return EOK;
983}
984
985static errno_t testgc_update(void *arg)
986{
987 (void) arg;
988 return EOK;
989}
990
991static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
992 gfx_bitmap_alloc_t *alloc, void **rbm)
993{
994 test_gc_t *tgc = (test_gc_t *) arg;
995 testgc_bitmap_t *tbm;
996
997 tbm = calloc(1, sizeof(testgc_bitmap_t));
998 if (tbm == NULL)
999 return ENOMEM;
1000
1001 if (alloc == NULL) {
1002 tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
1003 sizeof(uint32_t);
1004 tbm->alloc.off0 = 0;
1005 tbm->alloc.pixels = calloc(sizeof(uint32_t),
1006 (params->rect.p1.x - params->rect.p0.x) *
1007 (params->rect.p1.y - params->rect.p0.y));
1008 tbm->myalloc = true;
1009 if (tbm->alloc.pixels == NULL) {
1010 free(tbm);
1011 return ENOMEM;
1012 }
1013 } else {
1014 tbm->alloc = *alloc;
1015 }
1016
1017 tbm->tgc = tgc;
1018 tgc->bm_created = true;
1019 tgc->bm_params = *params;
1020 tgc->bm_pixels = tbm->alloc.pixels;
1021 *rbm = (void *)tbm;
1022 return EOK;
1023}
1024
1025static errno_t testgc_bitmap_destroy(void *bm)
1026{
1027 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
1028 if (tbm->myalloc)
1029 free(tbm->alloc.pixels);
1030 tbm->tgc->bm_destroyed = true;
1031 free(tbm);
1032 return EOK;
1033}
1034
1035static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
1036 gfx_coord2_t *offs)
1037{
1038 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
1039 tbm->tgc->bm_rendered = true;
1040 tbm->tgc->bm_srect = *srect;
1041 tbm->tgc->bm_offs = *offs;
1042 return EOK;
1043}
1044
1045static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
1046{
1047 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
1048 *alloc = tbm->alloc;
1049 tbm->tgc->bm_got_alloc = true;
1050 return EOK;
1051}
1052
1053static void test_wdecor_minimize(ui_wdecor_t *wdecor, void *arg)
1054{
1055 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1056
1057 resp->minimize = true;
1058}
1059
1060static void test_wdecor_maximize(ui_wdecor_t *wdecor, void *arg)
1061{
1062 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1063
1064 resp->maximize = true;
1065}
1066
1067static void test_wdecor_unmaximize(ui_wdecor_t *wdecor, void *arg)
1068{
1069 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1070
1071 resp->unmaximize = true;
1072}
1073
1074static void test_wdecor_close(ui_wdecor_t *wdecor, void *arg)
1075{
1076 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1077
1078 resp->close = true;
1079}
1080
1081static void test_wdecor_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos,
1082 sysarg_t pos_id)
1083{
1084 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1085
1086 resp->move = true;
1087 resp->pos = *pos;
1088 resp->pos_id = pos_id;
1089}
1090
1091static void test_wdecor_resize(ui_wdecor_t *wdecor, void *arg,
1092 ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
1093{
1094 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1095
1096 resp->resize = true;
1097 resp->rsztype = rsztype;
1098 resp->pos = *pos;
1099 resp->pos_id = pos_id;
1100}
1101
1102static void test_wdecor_set_cursor(ui_wdecor_t *wdecor, void *arg,
1103 ui_stock_cursor_t cursor)
1104{
1105 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
1106
1107 resp->set_cursor = true;
1108 resp->cursor = cursor;
1109}
1110
1111PCUT_EXPORT(wdecor);
Note: See TracBrowser for help on using the repository browser.