source: mainline/uspace/lib/ui/test/menudd.c@ 8d1bcd7

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

Handover between system menu and menu bar

We can move between them using Left and Right keys in either closed
or open state. One can now open system menu with F10, Left, Down in
a window with menu bar, or just F10 in a window without menu bar.

  • Property mode set to 100644
File size: 8.9 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 <str.h>
35#include <ui/control.h>
36#include <ui/menudd.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(menudd);
46
47/** Create and destroy menu drop-down */
48PCUT_TEST(create_destroy)
49{
50 ui_t *ui = NULL;
51 ui_window_t *window = NULL;
52 ui_wnd_params_t params;
53 ui_menu_bar_t *mbar = NULL;
54 ui_menu_dd_t *mdd = NULL;
55 ui_menu_t *menu = NULL;
56 errno_t rc;
57
58 rc = ui_create_disp(NULL, &ui);
59 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
60
61 ui_wnd_params_init(&params);
62 params.caption = "Hello";
63
64 rc = ui_window_create(ui, &params, &window);
65 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
66 PCUT_ASSERT_NOT_NULL(window);
67
68 rc = ui_menu_bar_create(ui, window, &mbar);
69 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
70
71 rc = ui_menu_dd_create(mbar, "Test", &mdd, &menu);
72 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
73 PCUT_ASSERT_NOT_NULL(mdd);
74 PCUT_ASSERT_NOT_NULL(menu);
75
76 /*
77 * Normally we don't need to destroy a menu drop-down explicitly,
78 * it will be destroyed along with menu bar, but here we'll test
79 * destroying it explicitly.
80 */
81 ui_menu_dd_destroy(mdd);
82 ui_menu_bar_destroy(mbar);
83 ui_window_destroy(window);
84 ui_destroy(ui);
85}
86
87/** ui_menu_dd_destroy() can take NULL argument (no-op) */
88PCUT_TEST(destroy_null)
89{
90 ui_menu_dd_destroy(NULL);
91}
92
93/** ui_menu_dd_first() / ui_menu_dd_next() iterate over menu drop-downs */
94PCUT_TEST(first_next)
95{
96 ui_t *ui = NULL;
97 ui_window_t *window = NULL;
98 ui_wnd_params_t params;
99 ui_menu_bar_t *mbar = NULL;
100 ui_menu_dd_t *mdd1 = NULL;
101 ui_menu_dd_t *mdd2 = NULL;
102 ui_menu_dd_t *m;
103 errno_t rc;
104
105 rc = ui_create_disp(NULL, &ui);
106 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
107
108 ui_wnd_params_init(&params);
109 params.caption = "Hello";
110
111 rc = ui_window_create(ui, &params, &window);
112 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
113 PCUT_ASSERT_NOT_NULL(window);
114
115 rc = ui_menu_bar_create(ui, window, &mbar);
116 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
117 PCUT_ASSERT_NOT_NULL(mbar);
118
119 rc = ui_menu_dd_create(mbar, "Test 1", &mdd1, NULL);
120 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
121 PCUT_ASSERT_NOT_NULL(mdd1);
122
123 rc = ui_menu_dd_create(mbar, "Test 1", &mdd2, NULL);
124 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
125 PCUT_ASSERT_NOT_NULL(mdd2);
126
127 m = ui_menu_dd_first(mbar);
128 PCUT_ASSERT_EQUALS(mdd1, m);
129
130 m = ui_menu_dd_next(m);
131 PCUT_ASSERT_EQUALS(mdd2, m);
132
133 m = ui_menu_dd_next(m);
134 PCUT_ASSERT_NULL(m);
135
136 ui_menu_bar_destroy(mbar);
137 ui_window_destroy(window);
138 ui_destroy(ui);
139}
140
141/** ui_menu_dd_last() / ui_menu_dd_prev() iterate over menu drop-downs
142 * in reverse.
143 */
144PCUT_TEST(last_prev)
145{
146 ui_t *ui = NULL;
147 ui_window_t *window = NULL;
148 ui_wnd_params_t params;
149 ui_menu_bar_t *mbar = NULL;
150 ui_menu_dd_t *mdd1 = NULL;
151 ui_menu_dd_t *mdd2 = NULL;
152 ui_menu_dd_t *m;
153 errno_t rc;
154
155 rc = ui_create_disp(NULL, &ui);
156 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
157
158 ui_wnd_params_init(&params);
159 params.caption = "Hello";
160
161 rc = ui_window_create(ui, &params, &window);
162 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
163 PCUT_ASSERT_NOT_NULL(window);
164
165 rc = ui_menu_bar_create(ui, window, &mbar);
166 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
167 PCUT_ASSERT_NOT_NULL(mbar);
168
169 rc = ui_menu_dd_create(mbar, "Test 1", &mdd1, NULL);
170 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
171 PCUT_ASSERT_NOT_NULL(mdd1);
172
173 rc = ui_menu_dd_create(mbar, "Test 1", &mdd2, NULL);
174 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
175 PCUT_ASSERT_NOT_NULL(mdd2);
176
177 m = ui_menu_dd_last(mbar);
178 PCUT_ASSERT_EQUALS(mdd2, m);
179
180 m = ui_menu_dd_prev(m);
181 PCUT_ASSERT_EQUALS(mdd1, m);
182
183 m = ui_menu_dd_prev(m);
184 PCUT_ASSERT_NULL(m);
185
186 ui_menu_bar_destroy(mbar);
187 ui_window_destroy(window);
188 ui_destroy(ui);
189}
190
191/** ui_menu_dd_caption() returns the drop down's caption */
192PCUT_TEST(caption)
193{
194 ui_t *ui = NULL;
195 ui_window_t *window = NULL;
196 ui_wnd_params_t params;
197 ui_menu_bar_t *mbar = NULL;
198 ui_menu_dd_t *mdd = NULL;
199 const char *caption;
200 errno_t rc;
201
202 rc = ui_create_disp(NULL, &ui);
203 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
204
205 ui_wnd_params_init(&params);
206 params.caption = "Hello";
207
208 rc = ui_window_create(ui, &params, &window);
209 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
210 PCUT_ASSERT_NOT_NULL(window);
211
212 rc = ui_menu_bar_create(ui, window, &mbar);
213 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
214 PCUT_ASSERT_NOT_NULL(mbar);
215
216 rc = ui_menu_dd_create(mbar, "Test", &mdd, NULL);
217 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
218 PCUT_ASSERT_NOT_NULL(mdd);
219
220 caption = ui_menu_dd_caption(mdd);
221 PCUT_ASSERT_NOT_NULL(caption);
222
223 PCUT_ASSERT_INT_EQUALS(0, str_cmp(caption, "Test"));
224
225 ui_menu_bar_destroy(mbar);
226 ui_window_destroy(window);
227 ui_destroy(ui);
228}
229
230/** ui_menu_dd_get_accel() returns the accelerator character */
231PCUT_TEST(get_accel)
232{
233 ui_t *ui = NULL;
234 ui_window_t *window = NULL;
235 ui_wnd_params_t params;
236 ui_menu_bar_t *mbar = NULL;
237 ui_menu_dd_t *mdd = NULL;
238 char32_t accel;
239 errno_t rc;
240
241 rc = ui_create_disp(NULL, &ui);
242 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
243
244 ui_wnd_params_init(&params);
245 params.caption = "Hello";
246
247 rc = ui_window_create(ui, &params, &window);
248 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
249 PCUT_ASSERT_NOT_NULL(window);
250
251 rc = ui_menu_bar_create(ui, window, &mbar);
252 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
253 PCUT_ASSERT_NOT_NULL(mbar);
254
255 rc = ui_menu_dd_create(mbar, "~T~est", &mdd, NULL);
256 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
257 PCUT_ASSERT_NOT_NULL(mdd);
258
259 accel = ui_menu_dd_get_accel(mdd);
260 printf("accel='%c' (%d)\n", (char)accel, (int)accel);
261 PCUT_ASSERT_EQUALS((char32_t)'t', accel);
262
263 ui_menu_bar_destroy(mbar);
264 ui_window_destroy(window);
265 ui_destroy(ui);
266}
267
268/** Open and close menu drop-down with ui_menu_dd_open() / ui_menu_dd_close() */
269PCUT_TEST(open_close)
270{
271 ui_t *ui = NULL;
272 ui_window_t *window = NULL;
273 ui_wnd_params_t params;
274 ui_menu_bar_t *mbar = NULL;
275 ui_menu_dd_t *mdd = NULL;
276 gfx_rect_t prect;
277 errno_t rc;
278
279 rc = ui_create_disp(NULL, &ui);
280 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
281
282 ui_wnd_params_init(&params);
283 params.caption = "Hello";
284
285 rc = ui_window_create(ui, &params, &window);
286 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
287 PCUT_ASSERT_NOT_NULL(window);
288
289 rc = ui_menu_bar_create(ui, window, &mbar);
290 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
291 PCUT_ASSERT_NOT_NULL(mbar);
292
293 rc = ui_menu_dd_create(mbar, "Test", &mdd, NULL);
294 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
295 PCUT_ASSERT_NOT_NULL(mdd);
296
297 prect.p0.x = 0;
298 prect.p0.y = 0;
299 prect.p1.x = 0;
300 prect.p1.y = 0;
301
302 /* Open and close */
303 rc = ui_menu_dd_open(mdd, &prect, 0);
304 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
305
306 ui_menu_dd_close(mdd);
307
308 ui_menu_bar_destroy(mbar);
309 ui_window_destroy(window);
310 ui_destroy(ui);
311}
312
313/** ui_menu_dd_is_open() correctly returns menu drop-down state */
314PCUT_TEST(is_open)
315{
316 ui_t *ui = NULL;
317 ui_window_t *window = NULL;
318 ui_wnd_params_t params;
319 ui_menu_bar_t *mbar = NULL;
320 ui_menu_dd_t *mdd = NULL;
321 gfx_rect_t prect;
322 bool open;
323 errno_t rc;
324
325 rc = ui_create_disp(NULL, &ui);
326 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
327
328 ui_wnd_params_init(&params);
329 params.caption = "Hello";
330
331 rc = ui_window_create(ui, &params, &window);
332 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
333 PCUT_ASSERT_NOT_NULL(window);
334
335 rc = ui_menu_bar_create(ui, window, &mbar);
336 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
337 PCUT_ASSERT_NOT_NULL(mbar);
338
339 rc = ui_menu_dd_create(mbar, "Test", &mdd, NULL);
340 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
341 PCUT_ASSERT_NOT_NULL(mdd);
342
343 prect.p0.x = 0;
344 prect.p0.y = 0;
345 prect.p1.x = 0;
346 prect.p1.y = 0;
347
348 open = ui_menu_dd_is_open(mdd);
349 PCUT_ASSERT_FALSE(open);
350
351 rc = ui_menu_dd_open(mdd, &prect, 0);
352 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
353
354 open = ui_menu_dd_is_open(mdd);
355 PCUT_ASSERT_TRUE(open);
356
357 ui_menu_dd_close(mdd);
358
359 open = ui_menu_dd_is_open(mdd);
360 PCUT_ASSERT_FALSE(open);
361
362 ui_menu_bar_destroy(mbar);
363 ui_window_destroy(window);
364 ui_destroy(ui);
365}
366
367PCUT_EXPORT(menudd);
Note: See TracBrowser for help on using the repository browser.