source: mainline/uspace/lib/ui/test/menu.c@ c68c18b9

serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c68c18b9 was c68c18b9, checked in by jxsvoboda <5887334+jxsvoboda@…>, 4 years ago

Specify parent window when creating popup

This will be used in conjunction with ui_wnd_popup_params_t.place
(a rectangle relative to the parent window) to determine where on
the screen the popup window should appear.

  • Property mode set to 100644
File size: 8.5 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 <str.h>
35#include <ui/control.h>
36#include <ui/menu.h>
37#include <ui/menubar.h>
38#include <ui/ui.h>
39#include <ui/window.h>
40#include "../private/menu.h"
41#include "../private/menubar.h"
42
43PCUT_INIT;
44
45PCUT_TEST_SUITE(menu);
46
47/** Create and destroy menu */
48PCUT_TEST(create_destroy)
49{
50 ui_menu_bar_t *mbar = NULL;
51 ui_menu_t *menu = NULL;
52 errno_t rc;
53
54 rc = ui_menu_bar_create(NULL, NULL, &mbar);
55 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
56
57 rc = ui_menu_create(mbar, "Test", &menu);
58 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
59 PCUT_ASSERT_NOT_NULL(menu);
60
61 /*
62 * Normally we don't need to destroy a menu explicitly, it will
63 * be destroyed along with menu bar, but here we'll test destroying
64 * it explicitly.
65 */
66 ui_menu_destroy(menu);
67 ui_menu_bar_destroy(mbar);
68}
69
70/** ui_menu_destroy() can take NULL argument (no-op) */
71PCUT_TEST(destroy_null)
72{
73 ui_menu_destroy(NULL);
74}
75
76/** ui_menu_first() / ui_menu_next() iterate over menus */
77PCUT_TEST(first_next)
78{
79 ui_t *ui = NULL;
80 ui_window_t *window = NULL;
81 ui_wnd_params_t params;
82 ui_menu_bar_t *mbar = NULL;
83 ui_menu_t *menu1 = NULL;
84 ui_menu_t *menu2 = NULL;
85 ui_menu_t *m;
86 errno_t rc;
87
88 rc = ui_create_disp(NULL, &ui);
89 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
90
91 ui_wnd_params_init(&params);
92 params.caption = "Hello";
93
94 rc = ui_window_create(ui, &params, &window);
95 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
96 PCUT_ASSERT_NOT_NULL(window);
97
98 rc = ui_menu_bar_create(ui, window, &mbar);
99 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
100 PCUT_ASSERT_NOT_NULL(mbar);
101
102 rc = ui_menu_create(mbar, "Test 1", &menu1);
103 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
104 PCUT_ASSERT_NOT_NULL(menu1);
105
106 rc = ui_menu_create(mbar, "Test 1", &menu2);
107 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
108 PCUT_ASSERT_NOT_NULL(menu2);
109
110 m = ui_menu_first(mbar);
111 PCUT_ASSERT_EQUALS(menu1, m);
112
113 m = ui_menu_next(m);
114 PCUT_ASSERT_EQUALS(menu2, m);
115
116 m = ui_menu_next(m);
117 PCUT_ASSERT_NULL(m);
118
119 ui_menu_bar_destroy(mbar);
120 ui_window_destroy(window);
121 ui_destroy(ui);
122}
123
124/** ui_menu_caption() returns the menu's caption */
125PCUT_TEST(caption)
126{
127 ui_t *ui = NULL;
128 ui_window_t *window = NULL;
129 ui_wnd_params_t params;
130 ui_menu_bar_t *mbar = NULL;
131 ui_menu_t *menu = NULL;
132 const char *caption;
133 errno_t rc;
134
135 rc = ui_create_disp(NULL, &ui);
136 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
137
138 ui_wnd_params_init(&params);
139 params.caption = "Hello";
140
141 rc = ui_window_create(ui, &params, &window);
142 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
143 PCUT_ASSERT_NOT_NULL(window);
144
145 rc = ui_menu_bar_create(ui, window, &mbar);
146 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
147 PCUT_ASSERT_NOT_NULL(mbar);
148
149 rc = ui_menu_create(mbar, "Test", &menu);
150 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
151 PCUT_ASSERT_NOT_NULL(menu);
152
153 caption = ui_menu_caption(menu);
154 PCUT_ASSERT_NOT_NULL(caption);
155
156 PCUT_ASSERT_INT_EQUALS(0, str_cmp(caption, "Test"));
157
158 ui_menu_bar_destroy(mbar);
159 ui_window_destroy(window);
160 ui_destroy(ui);
161}
162
163/** ui_menu_get_rect() returns outer menu rectangle */
164PCUT_TEST(get_rect)
165{
166 ui_t *ui = NULL;
167 ui_window_t *window = NULL;
168 ui_wnd_params_t params;
169 ui_menu_bar_t *mbar = NULL;
170 ui_menu_t *menu = NULL;
171 gfx_coord2_t pos;
172 gfx_rect_t rect;
173 const char *caption;
174 errno_t rc;
175
176 rc = ui_create_disp(NULL, &ui);
177 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
178
179 ui_wnd_params_init(&params);
180 params.caption = "Hello";
181
182 rc = ui_window_create(ui, &params, &window);
183 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
184 PCUT_ASSERT_NOT_NULL(window);
185
186 rc = ui_menu_bar_create(ui, window, &mbar);
187 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
188 PCUT_ASSERT_NOT_NULL(mbar);
189
190 rc = ui_menu_create(mbar, "Test", &menu);
191 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
192 PCUT_ASSERT_NOT_NULL(menu);
193
194 caption = ui_menu_caption(menu);
195 PCUT_ASSERT_NOT_NULL(caption);
196
197 pos.x = 0;
198 pos.y = 0;
199 ui_menu_get_rect(menu, &pos, &rect);
200
201 PCUT_ASSERT_INT_EQUALS(0, rect.p0.x);
202 PCUT_ASSERT_INT_EQUALS(0, rect.p0.y);
203 PCUT_ASSERT_INT_EQUALS(16, rect.p1.x);
204 PCUT_ASSERT_INT_EQUALS(8, rect.p1.y);
205
206 ui_menu_bar_destroy(mbar);
207 ui_window_destroy(window);
208 ui_destroy(ui);
209}
210
211/** Paint menu */
212PCUT_TEST(paint)
213{
214 ui_t *ui = NULL;
215 ui_window_t *window = NULL;
216 ui_wnd_params_t params;
217 ui_menu_bar_t *mbar = NULL;
218 ui_menu_t *menu = NULL;
219 gfx_rect_t prect;
220 gfx_coord2_t pos;
221 errno_t rc;
222
223 rc = ui_create_disp(NULL, &ui);
224 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
225
226 ui_wnd_params_init(&params);
227 params.caption = "Hello";
228
229 rc = ui_window_create(ui, &params, &window);
230 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
231 PCUT_ASSERT_NOT_NULL(window);
232
233 rc = ui_menu_bar_create(ui, window, &mbar);
234 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
235 PCUT_ASSERT_NOT_NULL(mbar);
236
237 rc = ui_menu_create(mbar, "Test", &menu);
238 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
239 PCUT_ASSERT_NOT_NULL(menu);
240
241 prect.p0.x = 0;
242 prect.p0.y = 0;
243 prect.p1.x = 0;
244 prect.p1.y = 0;
245
246 /* Menu needs to be open to be able to paint it */
247 rc = ui_menu_open(menu, &prect);
248 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
249
250 pos.x = 0;
251 pos.y = 0;
252 rc = ui_menu_paint(menu, &pos);
253 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
254
255 ui_menu_bar_destroy(mbar);
256 ui_window_destroy(window);
257 ui_destroy(ui);
258}
259
260/** ui_menu_pos_event() inside menu is claimed */
261PCUT_TEST(pos_event_inside)
262{
263 ui_t *ui = NULL;
264 ui_window_t *window = NULL;
265 ui_wnd_params_t params;
266 ui_menu_bar_t *mbar = NULL;
267 ui_menu_t *menu = NULL;
268 ui_evclaim_t claimed;
269 gfx_coord2_t pos;
270 pos_event_t event;
271 errno_t rc;
272
273 rc = ui_create_disp(NULL, &ui);
274 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
275
276 ui_wnd_params_init(&params);
277 params.caption = "Hello";
278
279 rc = ui_window_create(ui, &params, &window);
280 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
281 PCUT_ASSERT_NOT_NULL(window);
282
283 rc = ui_menu_bar_create(ui, window, &mbar);
284 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
285 PCUT_ASSERT_NOT_NULL(mbar);
286
287 rc = ui_menu_create(mbar, "Test", &menu);
288 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
289 PCUT_ASSERT_NOT_NULL(menu);
290
291 pos.x = 0;
292 pos.y = 0;
293 event.type = POS_PRESS;
294 event.hpos = 0;
295 event.vpos = 0;
296 claimed = ui_menu_pos_event(menu, &pos, &event);
297 PCUT_ASSERT_EQUALS(ui_claimed, claimed);
298
299 ui_menu_bar_destroy(mbar);
300 ui_window_destroy(window);
301 ui_destroy(ui);
302}
303
304/** Computing menu geometry */
305PCUT_TEST(get_geom)
306{
307 ui_t *ui = NULL;
308 ui_window_t *window = NULL;
309 ui_wnd_params_t params;
310 ui_menu_bar_t *mbar = NULL;
311 ui_menu_t *menu = NULL;
312 ui_menu_geom_t geom;
313 gfx_coord2_t pos;
314 errno_t rc;
315
316 rc = ui_create_disp(NULL, &ui);
317 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
318
319 ui_wnd_params_init(&params);
320 params.caption = "Hello";
321
322 rc = ui_window_create(ui, &params, &window);
323 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
324 PCUT_ASSERT_NOT_NULL(window);
325
326 rc = ui_menu_bar_create(ui, window, &mbar);
327 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
328 PCUT_ASSERT_NOT_NULL(mbar);
329
330 rc = ui_menu_create(mbar, "Test", &menu);
331 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
332 PCUT_ASSERT_NOT_NULL(menu);
333
334 pos.x = 0;
335 pos.y = 0;
336 ui_menu_get_geom(menu, &pos, &geom);
337
338 PCUT_ASSERT_INT_EQUALS(0, geom.outer_rect.p0.x);
339 PCUT_ASSERT_INT_EQUALS(0, geom.outer_rect.p0.y);
340 PCUT_ASSERT_INT_EQUALS(16, geom.outer_rect.p1.x);
341 PCUT_ASSERT_INT_EQUALS(8, geom.outer_rect.p1.y);
342 PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p0.x);
343 PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p0.y);
344 PCUT_ASSERT_INT_EQUALS(12, geom.entries_rect.p1.x);
345 PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p1.y);
346
347 ui_menu_bar_destroy(mbar);
348 ui_window_destroy(window);
349 ui_destroy(ui);
350}
351
352PCUT_EXPORT(menu);
Note: See TracBrowser for help on using the repository browser.