source: mainline/uspace/lib/ui/test/menubar.c@ 3c8c580

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

Open menu in separate popup window (WIP)

  • Property mode set to 100644
File size: 7.6 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 <ui/control.h>
35#include <ui/menu.h>
36#include <ui/menubar.h>
37#include <ui/resource.h>
38#include <ui/ui.h>
39#include "../private/dummygc.h"
40#include "../private/menubar.h"
41
42PCUT_INIT;
43
44PCUT_TEST_SUITE(menubar);
45
46/** Create and destroy menu bar */
47PCUT_TEST(create_destroy)
48{
49 ui_menu_bar_t *mbar = NULL;
50 errno_t rc;
51
52 rc = ui_menu_bar_create(NULL, NULL, &mbar);
53 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
54 PCUT_ASSERT_NOT_NULL(mbar);
55
56 ui_menu_bar_destroy(mbar);
57}
58
59/** ui_menu_bar_destroy() can take NULL argument (no-op) */
60PCUT_TEST(destroy_null)
61{
62 ui_menu_bar_destroy(NULL);
63}
64
65/** ui_menu_bar_ctl() returns control that has a working virtual destructor */
66PCUT_TEST(ctl)
67{
68 ui_menu_bar_t *mbar = NULL;
69 ui_control_t *control;
70 errno_t rc;
71
72 rc = ui_menu_bar_create(NULL, NULL, &mbar);
73 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
74 PCUT_ASSERT_NOT_NULL(mbar);
75
76 control = ui_menu_bar_ctl(mbar);
77 PCUT_ASSERT_NOT_NULL(control);
78
79 ui_control_destroy(control);
80}
81
82/** Set menu bar rectangle sets internal field */
83PCUT_TEST(set_rect)
84{
85 errno_t rc;
86 dummy_gc_t *dgc;
87 gfx_context_t *gc;
88 ui_resource_t *resource = NULL;
89 ui_menu_bar_t *mbar = NULL;
90 gfx_rect_t rect;
91
92 rc = dummygc_create(&dgc);
93 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
94
95 gc = dummygc_get_ctx(dgc);
96
97 rc = ui_resource_create(gc, false, &resource);
98 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
99 PCUT_ASSERT_NOT_NULL(resource);
100
101 rc = ui_menu_bar_create(NULL, resource, &mbar);
102 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
103 PCUT_ASSERT_NOT_NULL(mbar);
104
105 rect.p0.x = 1;
106 rect.p0.y = 2;
107 rect.p1.x = 3;
108 rect.p1.y = 4;
109
110 ui_menu_bar_set_rect(mbar, &rect);
111 PCUT_ASSERT_INT_EQUALS(rect.p0.x, mbar->rect.p0.x);
112 PCUT_ASSERT_INT_EQUALS(rect.p0.y, mbar->rect.p0.y);
113 PCUT_ASSERT_INT_EQUALS(rect.p1.x, mbar->rect.p1.x);
114 PCUT_ASSERT_INT_EQUALS(rect.p1.y, mbar->rect.p1.y);
115
116 ui_menu_bar_destroy(mbar);
117 ui_resource_destroy(resource);
118 dummygc_destroy(dgc);
119}
120
121/** Paint menu bar */
122PCUT_TEST(paint)
123{
124 dummy_gc_t *dgc;
125 gfx_context_t *gc;
126 ui_resource_t *resource = NULL;
127 ui_menu_bar_t *mbar = NULL;
128 errno_t rc;
129
130 rc = dummygc_create(&dgc);
131 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
132
133 gc = dummygc_get_ctx(dgc);
134
135 rc = ui_resource_create(gc, false, &resource);
136 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
137 PCUT_ASSERT_NOT_NULL(resource);
138
139 rc = ui_menu_bar_create(NULL, resource, &mbar);
140 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
141 PCUT_ASSERT_NOT_NULL(mbar);
142
143 rc = ui_menu_bar_paint(mbar);
144 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
145
146 ui_menu_bar_destroy(mbar);
147 ui_resource_destroy(resource);
148 dummygc_destroy(dgc);
149}
150
151/** Press event on menu bar entry selects menu */
152PCUT_TEST(pos_event_select)
153{
154 dummy_gc_t *dgc;
155 gfx_context_t *gc;
156 ui_t *ui = NULL;
157 ui_resource_t *resource = NULL;
158 ui_menu_bar_t *mbar = NULL;
159 ui_menu_t *menu = NULL;
160 ui_evclaim_t claimed;
161 pos_event_t event;
162 gfx_rect_t rect;
163 errno_t rc;
164
165 rc = dummygc_create(&dgc);
166 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
167
168 gc = dummygc_get_ctx(dgc);
169
170 rc = ui_create_disp(NULL, &ui);
171 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
172
173 rc = ui_resource_create(gc, false, &resource);
174 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
175 PCUT_ASSERT_NOT_NULL(resource);
176
177 rc = ui_menu_bar_create(ui, resource, &mbar);
178 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
179 PCUT_ASSERT_NOT_NULL(mbar);
180
181 rect.p0.x = 0;
182 rect.p0.y = 0;
183 rect.p1.x = 50;
184 rect.p1.y = 25;
185 ui_menu_bar_set_rect(mbar, &rect);
186
187 rc = ui_menu_create(mbar, "Test", &menu);
188 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
189 PCUT_ASSERT_NOT_NULL(menu);
190
191 event.type = POS_PRESS;
192 event.hpos = 4;
193 event.vpos = 4;
194 claimed = ui_menu_bar_pos_event(mbar, &event);
195 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
196 PCUT_ASSERT_EQUALS(ui_claimed, claimed);
197
198 /* Clicking the menu bar entry should select menu */
199 PCUT_ASSERT_EQUALS(menu, mbar->selected);
200
201 ui_menu_bar_destroy(mbar);
202 ui_resource_destroy(resource);
203 ui_destroy(ui);
204 dummygc_destroy(dgc);
205}
206
207/** Calling ui_menu_bar_select() with the same menu twice deselects it */
208PCUT_TEST(select_same)
209{
210 dummy_gc_t *dgc;
211 gfx_context_t *gc;
212 ui_t *ui = NULL;
213 ui_resource_t *resource = NULL;
214 ui_menu_bar_t *mbar = NULL;
215 ui_menu_t *menu = NULL;
216 gfx_rect_t rect;
217 errno_t rc;
218
219 rc = dummygc_create(&dgc);
220 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
221
222 gc = dummygc_get_ctx(dgc);
223
224 rc = ui_create_disp(NULL, &ui);
225 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
226
227 rc = ui_resource_create(gc, false, &resource);
228 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
229 PCUT_ASSERT_NOT_NULL(resource);
230
231 rc = ui_menu_bar_create(ui, resource, &mbar);
232 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
233 PCUT_ASSERT_NOT_NULL(mbar);
234
235 rc = ui_menu_create(mbar, "Test", &menu);
236 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
237 PCUT_ASSERT_NOT_NULL(menu);
238
239 rect.p0.x = 0;
240 rect.p0.y = 0;
241 rect.p1.x = 0;
242 rect.p1.y = 0;
243 ui_menu_bar_select(mbar, &rect, menu);
244 PCUT_ASSERT_EQUALS(menu, mbar->selected);
245
246 /* Selecting again should unselect the menu */
247 ui_menu_bar_select(mbar, &rect, menu);
248 PCUT_ASSERT_NULL(mbar->selected);
249
250 ui_menu_bar_destroy(mbar);
251 ui_resource_destroy(resource);
252 ui_destroy(ui);
253 dummygc_destroy(dgc);
254}
255
256/** Calling ui_menu_bar_select() with another menu selects it */
257PCUT_TEST(select_different)
258{
259 dummy_gc_t *dgc;
260 gfx_context_t *gc;
261 ui_t *ui = NULL;
262 ui_resource_t *resource = NULL;
263 ui_menu_bar_t *mbar = NULL;
264 ui_menu_t *menu1 = NULL;
265 ui_menu_t *menu2 = NULL;
266 gfx_rect_t rect;
267 errno_t rc;
268
269 rc = dummygc_create(&dgc);
270 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
271
272 gc = dummygc_get_ctx(dgc);
273
274 rc = ui_create_disp(NULL, &ui);
275 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
276
277 rc = ui_resource_create(gc, false, &resource);
278 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
279 PCUT_ASSERT_NOT_NULL(resource);
280
281 rc = ui_menu_bar_create(ui, resource, &mbar);
282 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
283 PCUT_ASSERT_NOT_NULL(mbar);
284
285 rc = ui_menu_create(mbar, "Test 1", &menu1);
286 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
287 PCUT_ASSERT_NOT_NULL(menu1);
288
289 rc = ui_menu_create(mbar, "Test 2", &menu2);
290 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
291 PCUT_ASSERT_NOT_NULL(menu2);
292
293 rect.p0.x = 0;
294 rect.p0.y = 0;
295 rect.p1.x = 0;
296 rect.p1.y = 0;
297 ui_menu_bar_select(mbar, &rect, menu1);
298 PCUT_ASSERT_EQUALS(menu1, mbar->selected);
299
300 /* Selecting different menu should select it */
301 ui_menu_bar_select(mbar, &rect, menu2);
302 PCUT_ASSERT_EQUALS(menu2, mbar->selected);
303
304 ui_menu_bar_destroy(mbar);
305 ui_resource_destroy(resource);
306 ui_destroy(ui);
307 dummygc_destroy(dgc);
308}
309
310PCUT_EXPORT(menubar);
Note: See TracBrowser for help on using the repository browser.