source: mainline/uspace/lib/ui/test/popup.c@ d7f7a4a

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

Replace some license headers with SPDX identifier

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

  • Property mode set to 100644
File size: 7.2 KB
Line 
1/*
2 * SPDX-FileCopyrightText: 2021 Jiri Svoboda
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <gfx/context.h>
8#include <gfx/coord.h>
9#include <gfx/render.h>
10#include <io/kbd_event.h>
11#include <io/pos_event.h>
12#include <mem.h>
13#include <pcut/pcut.h>
14#include <stdbool.h>
15#include <ui/control.h>
16#include <ui/popup.h>
17#include <ui/resource.h>
18#include <ui/ui.h>
19#include <ui/window.h>
20#include "../private/popup.h"
21#include "../private/window.h"
22
23PCUT_INIT;
24
25PCUT_TEST_SUITE(popup);
26
27static void test_popup_close(ui_popup_t *, void *);
28static void test_popup_kbd(ui_popup_t *, void *, kbd_event_t *);
29static errno_t test_popup_paint(ui_popup_t *, void *);
30static void test_popup_pos(ui_popup_t *, void *, pos_event_t *);
31
32static ui_popup_cb_t test_popup_cb = {
33 .close = test_popup_close,
34 .kbd = test_popup_kbd,
35 .paint = test_popup_paint,
36 .pos = test_popup_pos,
37};
38
39static ui_popup_cb_t dummy_popup_cb = {
40};
41
42static errno_t test_ctl_paint(void *);
43static ui_evclaim_t test_ctl_pos_event(void *, pos_event_t *);
44static void test_ctl_unfocus(void *);
45
46static ui_control_ops_t test_ctl_ops = {
47 .paint = test_ctl_paint,
48 .pos_event = test_ctl_pos_event,
49 .unfocus = test_ctl_unfocus
50};
51
52typedef struct {
53 errno_t rc;
54 bool close;
55 bool focus;
56 bool kbd;
57 kbd_event_t kbd_event;
58 bool paint;
59 bool pos;
60 pos_event_t pos_event;
61 bool unfocus;
62} test_cb_resp_t;
63
64typedef struct {
65 errno_t rc;
66 ui_evclaim_t claim;
67 bool paint;
68 bool pos;
69 pos_event_t pos_event;
70 bool unfocus;
71} test_ctl_resp_t;
72
73/** Create and destroy popup window */
74PCUT_TEST(create_destroy)
75{
76 errno_t rc;
77 ui_t *ui = NULL;
78 ui_wnd_params_t wparams;
79 ui_window_t *window = NULL;
80 ui_popup_params_t params;
81 ui_popup_t *popup = NULL;
82
83 rc = ui_create_disp(NULL, &ui);
84 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
85
86 ui_wnd_params_init(&wparams);
87 wparams.caption = "Hello";
88
89 rc = ui_window_create(ui, &wparams, &window);
90 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
91 PCUT_ASSERT_NOT_NULL(window);
92
93 ui_popup_params_init(&params);
94
95 rc = ui_popup_create(ui, window, &params, &popup);
96 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
97 PCUT_ASSERT_NOT_NULL(popup);
98
99 ui_popup_destroy(popup);
100 ui_window_destroy(window);
101 ui_destroy(ui);
102}
103
104/** ui_popup_destroy() can take NULL argument (no-op) */
105PCUT_TEST(destroy_null)
106{
107 ui_popup_destroy(NULL);
108}
109
110/** ui_popup_add()/ui_popup_remove() ... */
111PCUT_TEST(add_remove)
112{
113 errno_t rc;
114 ui_t *ui = NULL;
115 ui_wnd_params_t wparams;
116 ui_window_t *window = NULL;
117 ui_popup_params_t params;
118 ui_popup_t *popup = NULL;
119 ui_control_t *control = NULL;
120 test_ctl_resp_t resp;
121
122 rc = ui_create_disp(NULL, &ui);
123 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
124
125 ui_wnd_params_init(&wparams);
126 wparams.caption = "Hello";
127
128 rc = ui_window_create(ui, &wparams, &window);
129 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
130 PCUT_ASSERT_NOT_NULL(window);
131
132 ui_popup_params_init(&params);
133
134 rc = ui_popup_create(ui, window, &params, &popup);
135 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
136 PCUT_ASSERT_NOT_NULL(popup);
137
138 rc = ui_control_new(&test_ctl_ops, &resp, &control);
139 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
140
141 /* Control not called since it hasn't been added yet */
142 resp.rc = ENOMEM;
143 resp.paint = false;
144 rc = ui_window_def_paint(popup->window);
145 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
146 PCUT_ASSERT_FALSE(resp.paint);
147
148 ui_popup_add(popup, control);
149
150 /* Now paint request should be delivered to control */
151 resp.rc = EOK;
152 resp.paint = false;
153 rc = ui_window_def_paint(popup->window);
154 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
155 PCUT_ASSERT_TRUE(resp.paint);
156
157 ui_popup_remove(popup, control);
158
159 /*
160 * After having removed the control the request should no longer
161 * be delivered to it.
162 */
163 resp.rc = ENOMEM;
164 resp.paint = false;
165 rc = ui_window_def_paint(popup->window);
166 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
167 PCUT_ASSERT_FALSE(resp.paint);
168
169 ui_popup_destroy(popup);
170 ui_window_destroy(window);
171 ui_destroy(ui);
172}
173
174/** ui_popup_get_res/gc() return valid objects */
175PCUT_TEST(get_res_gc)
176{
177 errno_t rc;
178 ui_t *ui = NULL;
179 ui_wnd_params_t wparams;
180 ui_window_t *window = NULL;
181 ui_popup_params_t params;
182 ui_popup_t *popup = NULL;
183 ui_resource_t *res;
184 gfx_context_t *gc;
185
186 rc = ui_create_disp(NULL, &ui);
187 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
188
189 ui_wnd_params_init(&wparams);
190 wparams.caption = "Hello";
191
192 rc = ui_window_create(ui, &wparams, &window);
193 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
194 PCUT_ASSERT_NOT_NULL(window);
195
196 ui_popup_params_init(&params);
197
198 rc = ui_popup_create(ui, window, &params, &popup);
199 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
200 PCUT_ASSERT_NOT_NULL(popup);
201
202 res = ui_popup_get_res(popup);
203 PCUT_ASSERT_NOT_NULL(res);
204
205 gc = ui_popup_get_gc(popup);
206 PCUT_ASSERT_NOT_NULL(gc);
207
208 ui_popup_destroy(popup);
209 ui_window_destroy(window);
210 ui_destroy(ui);
211}
212
213/** Test position event callback set via ui_popup_set_cb() */
214PCUT_TEST(send_pos)
215{
216 errno_t rc;
217 ui_t *ui = NULL;
218 ui_wnd_params_t wparams;
219 ui_window_t *window = NULL;
220 ui_popup_params_t params;
221 ui_popup_t *popup = NULL;
222 pos_event_t pos_event;
223 test_cb_resp_t resp;
224
225 rc = ui_create_disp(NULL, &ui);
226 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
227
228 ui_wnd_params_init(&wparams);
229 wparams.caption = "Hello";
230
231 rc = ui_window_create(ui, &wparams, &window);
232 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
233 PCUT_ASSERT_NOT_NULL(window);
234
235 ui_popup_params_init(&params);
236
237 rc = ui_popup_create(ui, window, &params, &popup);
238 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
239 PCUT_ASSERT_NOT_NULL(popup);
240
241 pos_event.pos_id = 1;
242 pos_event.type = POS_PRESS;
243 pos_event.btn_num = 2;
244 pos_event.hpos = 3;
245 pos_event.vpos = 4;
246
247 /* Pos callback with no callbacks set */
248 ui_window_send_pos(popup->window, &pos_event);
249
250 /* Pos callback with pos callback not implemented */
251 ui_popup_set_cb(popup, &dummy_popup_cb, NULL);
252 ui_window_send_pos(popup->window, &pos_event);
253
254 /* Pos callback with real callback set */
255 resp.pos = false;
256 ui_popup_set_cb(popup, &test_popup_cb, &resp);
257 ui_window_send_pos(popup->window, &pos_event);
258 PCUT_ASSERT_TRUE(resp.pos);
259 PCUT_ASSERT_INT_EQUALS(pos_event.pos_id, resp.pos_event.pos_id);
260 PCUT_ASSERT_EQUALS(pos_event.type, resp.pos_event.type);
261 PCUT_ASSERT_INT_EQUALS(pos_event.btn_num, resp.pos_event.btn_num);
262 PCUT_ASSERT_INT_EQUALS(pos_event.hpos, resp.pos_event.hpos);
263 PCUT_ASSERT_INT_EQUALS(pos_event.vpos, resp.pos_event.vpos);
264
265 ui_popup_destroy(popup);
266 ui_window_destroy(window);
267 ui_destroy(ui);
268}
269
270static void test_popup_close(ui_popup_t *popup, void *arg)
271{
272 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
273
274 resp->close = true;
275}
276
277static void test_popup_kbd(ui_popup_t *popup, void *arg,
278 kbd_event_t *event)
279{
280 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
281
282 resp->kbd = true;
283 resp->kbd_event = *event;
284}
285
286static errno_t test_popup_paint(ui_popup_t *popup, void *arg)
287{
288 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
289
290 resp->paint = true;
291 return resp->rc;
292}
293
294static void test_popup_pos(ui_popup_t *popup, void *arg,
295 pos_event_t *event)
296{
297 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
298
299 resp->pos = true;
300 resp->pos_event = *event;
301}
302
303static errno_t test_ctl_paint(void *arg)
304{
305 test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
306
307 resp->paint = true;
308 return resp->rc;
309}
310
311static ui_evclaim_t test_ctl_pos_event(void *arg, pos_event_t *event)
312{
313 test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
314
315 resp->pos = true;
316 resp->pos_event = *event;
317
318 return resp->claim;
319}
320
321static void test_ctl_unfocus(void *arg)
322{
323 test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
324
325 resp->unfocus = true;
326}
327
328PCUT_EXPORT(popup);
Note: See TracBrowser for help on using the repository browser.