source: mainline/uspace/lib/ui/test/menudd.c@ 1af103e

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 1af103e was 46bd63c9, checked in by Jiri Svoboda <jiri@…>, 2 years ago

Split drop-down menu into two classes: drop-down and menu

Naming is clearly the hardest problem in computer science.

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