1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 #include "lv_test_indev.h"
5 #include "unity/unity.h"
6 
7 static lv_obj_t * active_screen = NULL;
8 static lv_obj_t * btnm;
9 static bool event_triggered = false;
10 lv_event_code_t exp_evt_code;
11 
setUp(void)12 void setUp(void)
13 {
14     active_screen = lv_screen_active();
15     btnm = lv_buttonmatrix_create(active_screen);
16     TEST_ASSERT_NOT_NULL(btnm);
17     event_triggered = false;
18     exp_evt_code = 0;
19 }
20 
tearDown(void)21 void tearDown(void)
22 {
23     lv_obj_clean(active_screen);
24 }
25 
test_button_matrix_creation(void)26 void test_button_matrix_creation(void)
27 {
28     const char * const * map;
29 
30     /* Verify the default map. */
31     map = lv_buttonmatrix_get_map(btnm);
32     TEST_ASSERT_EQUAL_STRING(map[0], "Btn1");
33     TEST_ASSERT_EQUAL_STRING(map[1], "Btn2");
34     TEST_ASSERT_EQUAL_STRING(map[2], "Btn3");
35     TEST_ASSERT_EQUAL_STRING(map[3], "\n");
36     TEST_ASSERT_EQUAL_STRING(map[4], "Btn4");
37     TEST_ASSERT_EQUAL_STRING(map[5], "Btn5");
38 }
39 
test_button_matrix_set_map_works(void)40 void test_button_matrix_set_map_works(void)
41 {
42     const char * const * ret_map;
43     static const char * exp_map[] = {"A", "B", "\n", "C", "D", ""};
44 
45     lv_buttonmatrix_set_map(btnm, exp_map);
46     /* Verify if the map was set correctly. */
47     ret_map = lv_buttonmatrix_get_map(btnm);
48     TEST_ASSERT_EQUAL_STRING(exp_map[0], ret_map[0]);
49     TEST_ASSERT_EQUAL_STRING(exp_map[1], ret_map[1]);
50     TEST_ASSERT_EQUAL_STRING(exp_map[2], ret_map[2]);
51     TEST_ASSERT_EQUAL_STRING(exp_map[3], ret_map[3]);
52     TEST_ASSERT_EQUAL_STRING(exp_map[4], ret_map[4]);
53     TEST_ASSERT_EQUAL_STRING(exp_map[5], ret_map[5]);
54 
55     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/btnm_1.png");
56 }
57 
test_button_matrix_render_2(void)58 void test_button_matrix_render_2(void)
59 {
60     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
61     lv_buttonmatrix_set_map(btnm, btn_map);
62     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
63     lv_buttonmatrix_set_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_CHECKED);
64     lv_buttonmatrix_set_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKED);
65     lv_obj_set_pos(btnm, 10, 10);
66 
67     static const char * btn_map2[] = {"A", "\n", "B", "\n", "C", "\n", "D", ""};
68     btnm = lv_buttonmatrix_create(active_screen);
69     TEST_ASSERT_NOT_NULL(btnm);
70     lv_obj_set_width(btnm, 150);
71     lv_obj_set_height(btnm, 250);
72     lv_buttonmatrix_set_map(btnm, btn_map2);
73     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
74     lv_buttonmatrix_set_one_checked(btnm, true);
75     lv_buttonmatrix_set_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED);
76     lv_buttonmatrix_set_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_CHECKED);
77     lv_obj_set_pos(btnm, 10, 160);
78 
79     static const char * btn_map3[] = {"A", "B", "C", "\n", "D", "E", "F", ""};
80     btnm = lv_buttonmatrix_create(active_screen);
81     TEST_ASSERT_NOT_NULL(btnm);
82     lv_buttonmatrix_set_map(btnm, btn_map3);
83     lv_obj_set_width(btnm, 400);
84     lv_buttonmatrix_set_button_width(btnm, 0, 3);
85     lv_buttonmatrix_set_button_width(btnm, 1, 2);
86     lv_buttonmatrix_set_button_width(btnm, 2, 1);
87     lv_buttonmatrix_set_button_width(btnm, 3, 1);
88     lv_buttonmatrix_set_button_width(btnm, 4, 2);
89     lv_buttonmatrix_set_button_width(btnm, 5, 3);
90     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
91     lv_buttonmatrix_set_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED);
92     lv_buttonmatrix_set_button_ctrl(btnm, 4, LV_BUTTONMATRIX_CTRL_CHECKED);
93     lv_obj_set_pos(btnm, 300, 10);
94 
95     static const char * btn_map4[] = {"A", "B", "C", "D", "E", "F", "G", "\n",
96                                       "G", "F", "E", "D", "C", "B", "A", ""
97                                      };
98     btnm = lv_buttonmatrix_create(active_screen);
99     lv_buttonmatrix_set_map(btnm, btn_map4);
100     lv_obj_set_width(btnm, 600);
101     lv_obj_set_height(btnm, 150);
102     lv_buttonmatrix_set_button_width(btnm, 0, 1);
103     lv_buttonmatrix_set_button_width(btnm, 1, 2);
104     lv_buttonmatrix_set_button_width(btnm, 2, 3);
105     lv_buttonmatrix_set_button_width(btnm, 3, 4);
106     lv_buttonmatrix_set_button_width(btnm, 4, 5);
107     lv_buttonmatrix_set_button_width(btnm, 5, 6);
108     lv_buttonmatrix_set_button_width(btnm, 6, 7);
109 
110     lv_buttonmatrix_set_button_width(btnm, 7, 7);
111     lv_buttonmatrix_set_button_width(btnm, 8, 6);
112     lv_buttonmatrix_set_button_width(btnm, 9, 5);
113     lv_buttonmatrix_set_button_width(btnm, 10, 4);
114     lv_buttonmatrix_set_button_width(btnm, 11, 3);
115     lv_buttonmatrix_set_button_width(btnm, 12, 2);
116     lv_buttonmatrix_set_button_width(btnm, 13, 1);
117 
118     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
119     lv_buttonmatrix_set_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED);
120     lv_buttonmatrix_set_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKED);
121     lv_buttonmatrix_set_button_ctrl(btnm, 5, LV_BUTTONMATRIX_CTRL_CHECKED);
122     lv_buttonmatrix_set_button_ctrl(btnm, 7, LV_BUTTONMATRIX_CTRL_CHECKED);
123     lv_buttonmatrix_set_button_ctrl(btnm, 9, LV_BUTTONMATRIX_CTRL_CHECKED);
124     lv_buttonmatrix_set_button_ctrl(btnm, 11, LV_BUTTONMATRIX_CTRL_CHECKED);
125     lv_obj_set_pos(btnm, 180, 160);
126 
127     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/btnm_2.png");
128 }
129 
test_button_matrix_set_ctrl_map_works(void)130 void test_button_matrix_set_ctrl_map_works(void)
131 {
132     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
133     lv_buttonmatrix_set_map(btnm, btn_map);
134 
135     lv_buttonmatrix_ctrl_t ctrl_map[4];
136     ctrl_map[0] = 1 | LV_BUTTONMATRIX_CTRL_DISABLED;
137     ctrl_map[1] = 1 | LV_BUTTONMATRIX_CTRL_CHECKABLE | LV_BUTTONMATRIX_CTRL_CHECKED;
138     ctrl_map[2] = 1 | LV_BUTTONMATRIX_CTRL_HIDDEN;
139     ctrl_map[3] = 1 | LV_BUTTONMATRIX_CTRL_CHECKABLE;
140     lv_buttonmatrix_set_ctrl_map(btnm, ctrl_map);
141 
142     /* Verify if the ctrl map was set correctly. */
143     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_DISABLED));
144     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 1,
145                                                      LV_BUTTONMATRIX_CTRL_CHECKABLE | LV_BUTTONMATRIX_CTRL_CHECKED));
146     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_HIDDEN));
147     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKABLE));
148 
149     /* Also checking randomly that no other flags are set. */
150     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_CHECKABLE));
151     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_DISABLED));
152     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKED));
153     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 4, LV_BUTTONMATRIX_CTRL_HIDDEN));
154 }
155 
test_button_matrix_set_button_ctrl_works(void)156 void test_button_matrix_set_button_ctrl_works(void)
157 {
158     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
159     lv_buttonmatrix_set_map(btnm, btn_map);
160 
161     /* Set btn control map using individual APIs. */
162     lv_buttonmatrix_set_button_ctrl(btnm, 0, 1 | LV_BUTTONMATRIX_CTRL_DISABLED);
163     lv_buttonmatrix_set_button_ctrl(btnm, 1, 1 | LV_BUTTONMATRIX_CTRL_CHECKABLE | LV_BUTTONMATRIX_CTRL_CHECKED);
164     lv_buttonmatrix_set_button_ctrl(btnm, 2, 1 | LV_BUTTONMATRIX_CTRL_HIDDEN);
165     lv_buttonmatrix_set_button_ctrl(btnm, 3, 1 | LV_BUTTONMATRIX_CTRL_CHECKABLE);
166 
167     /* Verify if the ctrl map was set correctly. */
168     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_DISABLED));
169     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 1,
170                                                      LV_BUTTONMATRIX_CTRL_CHECKABLE | LV_BUTTONMATRIX_CTRL_CHECKED));
171     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_HIDDEN));
172     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKABLE));
173 
174     /* Also checking randomly that no other flags are set. */
175     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_CHECKABLE));
176     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_DISABLED));
177     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKED));
178     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 4, LV_BUTTONMATRIX_CTRL_HIDDEN));
179 }
180 
test_button_matrix_clear_button_ctrl_works(void)181 void test_button_matrix_clear_button_ctrl_works(void)
182 {
183     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
184     lv_buttonmatrix_set_map(btnm, btn_map);
185 
186     /* Set btn control map using individual APIs. */
187     lv_buttonmatrix_set_button_ctrl(btnm, 0, 1 | LV_BUTTONMATRIX_CTRL_DISABLED);
188     lv_buttonmatrix_set_button_ctrl(btnm, 1, 1 | LV_BUTTONMATRIX_CTRL_CHECKABLE | LV_BUTTONMATRIX_CTRL_CHECKED);
189     lv_buttonmatrix_set_button_ctrl(btnm, 2, 1 | LV_BUTTONMATRIX_CTRL_HIDDEN);
190     lv_buttonmatrix_set_button_ctrl(btnm, 3, 1 | LV_BUTTONMATRIX_CTRL_CHECKABLE);
191 
192     lv_buttonmatrix_clear_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_DISABLED);
193     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_DISABLED));
194     lv_buttonmatrix_clear_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED);
195     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED));
196     lv_buttonmatrix_clear_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_HIDDEN);
197     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_HIDDEN));
198     lv_buttonmatrix_clear_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKABLE);
199     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKABLE));
200 }
201 
test_button_matrix_set_selected_button_works(void)202 void test_button_matrix_set_selected_button_works(void)
203 {
204     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
205     lv_buttonmatrix_set_map(btnm, btn_map);
206 
207     lv_buttonmatrix_set_selected_button(btnm, 2);
208     TEST_ASSERT_EQUAL_UINT16(2, lv_buttonmatrix_get_selected_button(btnm));
209 
210     lv_buttonmatrix_set_selected_button(btnm, 0);
211     TEST_ASSERT_EQUAL_UINT16(0, lv_buttonmatrix_get_selected_button(btnm));
212 
213     lv_buttonmatrix_set_selected_button(btnm, 3);
214     TEST_ASSERT_EQUAL_UINT16(3, lv_buttonmatrix_get_selected_button(btnm));
215 
216     lv_buttonmatrix_set_selected_button(btnm, 1);
217     TEST_ASSERT_EQUAL_UINT16(1, lv_buttonmatrix_get_selected_button(btnm));
218 }
219 
test_button_matrix_set_button_ctrl_all_works(void)220 void test_button_matrix_set_button_ctrl_all_works(void)
221 {
222     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
223     lv_buttonmatrix_set_map(btnm, btn_map);
224 
225     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_HIDDEN);
226 
227     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_HIDDEN));
228     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_HIDDEN));
229     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_HIDDEN));
230     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_HIDDEN));
231 }
232 
test_button_matrix_clear_button_ctrl_all_works(void)233 void test_button_matrix_clear_button_ctrl_all_works(void)
234 {
235     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
236     lv_buttonmatrix_set_map(btnm, btn_map);
237 
238     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_HIDDEN);
239     lv_buttonmatrix_clear_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_HIDDEN);
240 
241     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_HIDDEN));
242     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_HIDDEN));
243     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_HIDDEN));
244     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_HIDDEN));
245 }
246 
test_button_matrix_set_button_width_works(void)247 void test_button_matrix_set_button_width_works(void)
248 {
249     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
250     lv_buttonmatrix_set_map(btnm, btn_map);
251 
252     lv_buttonmatrix_set_button_width(btnm, 1, 3);
253     lv_buttonmatrix_set_button_width(btnm, 2, 2);
254 
255     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 1, 3));
256     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 2, 2));
257 }
258 
test_button_matrix_set_one_checked_works(void)259 void test_button_matrix_set_one_checked_works(void)
260 {
261     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
262     lv_buttonmatrix_set_map(btnm, btn_map);
263 
264     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
265     lv_buttonmatrix_set_one_checked(btnm, true);
266 
267     lv_buttonmatrix_set_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_CHECKED);
268     lv_buttonmatrix_set_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED);
269     lv_buttonmatrix_set_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_CHECKED);
270     lv_buttonmatrix_set_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKED);
271 
272     TEST_ASSERT_TRUE(lv_buttonmatrix_get_one_checked(btnm));
273 
274     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_CHECKED));
275     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 1, LV_BUTTONMATRIX_CTRL_CHECKED));
276     TEST_ASSERT_FALSE(lv_buttonmatrix_has_button_ctrl(btnm, 2, LV_BUTTONMATRIX_CTRL_CHECKED));
277     TEST_ASSERT_TRUE(lv_buttonmatrix_has_button_ctrl(btnm, 3, LV_BUTTONMATRIX_CTRL_CHECKED));
278 }
279 
test_button_matrix_get_button_text_works(void)280 void test_button_matrix_get_button_text_works(void)
281 {
282     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
283     lv_buttonmatrix_set_map(btnm, btn_map);
284 
285     TEST_ASSERT_EQUAL_STRING("A", lv_buttonmatrix_get_button_text(btnm, 0));
286     TEST_ASSERT_EQUAL_STRING("B", lv_buttonmatrix_get_button_text(btnm, 1));
287     TEST_ASSERT_EQUAL_STRING("C", lv_buttonmatrix_get_button_text(btnm, 2));
288     TEST_ASSERT_EQUAL_STRING("D", lv_buttonmatrix_get_button_text(btnm, 3));
289 }
290 
291 /* Common event handler for all the consecutive test cases. */
event_handler(lv_event_t * e)292 static void event_handler(lv_event_t * e)
293 {
294     lv_event_code_t code = lv_event_get_code(e);
295     if(code == exp_evt_code) {
296         event_triggered = true;
297     }
298 }
299 
test_button_matrix_pressed_event_works(void)300 void test_button_matrix_pressed_event_works(void)
301 {
302     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
303     lv_buttonmatrix_set_map(btnm, btn_map);
304     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_PRESSED, NULL);
305     /* Set expected event code before the event is raised. */
306     exp_evt_code = LV_EVENT_PRESSED;
307     /* Click button index 0. */
308     lv_test_mouse_click_at(10, 10);
309     TEST_ASSERT_TRUE(event_triggered);
310 }
311 
test_button_matrix_release_event_works(void)312 void test_button_matrix_release_event_works(void)
313 {
314     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
315     lv_buttonmatrix_set_map(btnm, btn_map);
316     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
317     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_RELEASED, NULL);
318     /* Set expected event code before the event is raised. */
319     exp_evt_code = LV_EVENT_RELEASED;
320 
321     /* Click button index 0. */
322     lv_test_mouse_click_at(65, 35);
323     TEST_ASSERT_TRUE(event_triggered);
324     event_triggered = false;
325     /* This will increase test coverage by unchecking the
326      same button. */
327     lv_buttonmatrix_set_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_POPOVER);
328     /* Click button index 0. */
329     lv_test_mouse_click_at(65, 35);
330     TEST_ASSERT_TRUE(event_triggered);
331 }
332 
test_button_matrix_key_event_works(void)333 void test_button_matrix_key_event_works(void)
334 {
335     uint32_t keyCode;
336     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
337     lv_buttonmatrix_set_map(btnm, btn_map);
338     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
339     lv_obj_update_layout(btnm);         /*The force calculating the button areas*/
340     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_KEY, NULL);
341     /* Set expected event code before the event is raised. */
342     exp_evt_code = LV_EVENT_KEY;
343 
344     lv_buttonmatrix_t * btnmObj = (lv_buttonmatrix_t *)btnm;
345     /* Select the first button. */
346     lv_buttonmatrix_set_selected_button(btnm, 0);
347     keyCode = LV_KEY_RIGHT;
348     lv_obj_send_event(btnm, LV_EVENT_KEY, &keyCode);
349     TEST_ASSERT_TRUE(event_triggered);
350     uint16_t btnId = lv_buttonmatrix_get_selected_button(btnm);
351     TEST_ASSERT_EQUAL_INT(1, btnId);
352 
353     event_triggered = false;
354     keyCode = LV_KEY_LEFT;
355     lv_obj_send_event(btnm, LV_EVENT_KEY, &keyCode);
356     TEST_ASSERT_TRUE(event_triggered);
357     btnId = lv_buttonmatrix_get_selected_button(btnm);
358     TEST_ASSERT_EQUAL_INT(0, btnId);
359 
360     event_triggered = false;
361     keyCode = LV_KEY_DOWN;
362     lv_obj_send_event(btnm, LV_EVENT_KEY, &keyCode);
363     TEST_ASSERT_TRUE(event_triggered);
364     btnId = lv_buttonmatrix_get_selected_button(btnm);
365     TEST_ASSERT_EQUAL_INT(2, btnId);
366 
367     event_triggered = false;
368     keyCode = LV_KEY_UP;
369     lv_obj_send_event(btnm, LV_EVENT_KEY, &keyCode);
370     TEST_ASSERT_TRUE(event_triggered);
371     btnId = lv_buttonmatrix_get_selected_button(btnm);
372     TEST_ASSERT_EQUAL_INT(0, btnId);
373 
374     /* Added this code to increase code coverage. */
375     btnmObj->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE;
376     lv_buttonmatrix_set_button_ctrl(btnm, 0, LV_BUTTONMATRIX_CTRL_HIDDEN);
377     keyCode = LV_KEY_DOWN;
378     lv_obj_send_event(btnm, LV_EVENT_KEY, &keyCode);
379     TEST_ASSERT_TRUE(event_triggered);
380     event_triggered = false;
381 }
382 
test_button_matrix_pressing_event_works(void)383 void test_button_matrix_pressing_event_works(void)
384 {
385     lv_buttonmatrix_t * btnmObj = (lv_buttonmatrix_t *)btnm;
386     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
387     lv_buttonmatrix_set_map(btnm, btn_map);
388     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
389     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_PRESSING, NULL);
390     /* Set expected event code before the event is raised. */
391     exp_evt_code = LV_EVENT_PRESSING;
392     /* Select a button before raising a simulated event.
393      * This is done to increase code coverage. */
394     btnmObj->btn_id_sel = 3;
395     /* Send a dummy lv_indev_t object as param to avoid crashing during build. */
396     lv_obj_send_event(btnm, LV_EVENT_PRESSING, lv_test_mouse_indev);
397     TEST_ASSERT_TRUE(event_triggered);
398 }
399 
test_button_matrix_long_press_repeat_event_works(void)400 void test_button_matrix_long_press_repeat_event_works(void)
401 {
402     lv_buttonmatrix_t * btnmObj = (lv_buttonmatrix_t *)btnm;
403     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
404 
405     lv_buttonmatrix_set_map(btnm, btn_map);
406     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
407     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_LONG_PRESSED_REPEAT, NULL);
408     /* Set expected event code before the event is raised. */
409     exp_evt_code = LV_EVENT_LONG_PRESSED_REPEAT;
410     /* Select a button before raising a simulated event.
411      * This is done to increase code coverage. */
412     btnmObj->btn_id_sel = 0;
413     lv_obj_send_event(btnm, LV_EVENT_LONG_PRESSED_REPEAT, NULL);
414     TEST_ASSERT_TRUE(event_triggered);
415 }
416 
test_button_matrix_press_lost_event_works(void)417 void test_button_matrix_press_lost_event_works(void)
418 {
419     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
420 
421     lv_buttonmatrix_set_map(btnm, btn_map);
422     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
423     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_PRESS_LOST, NULL);
424     /* Set expected event code before the event is raised. */
425     exp_evt_code = LV_EVENT_PRESS_LOST;
426     lv_obj_send_event(btnm, LV_EVENT_PRESS_LOST, NULL);
427     TEST_ASSERT_TRUE(event_triggered);
428 }
429 
test_button_matrix_defocused_event_works(void)430 void test_button_matrix_defocused_event_works(void)
431 {
432     lv_buttonmatrix_t * btnmObj = (lv_buttonmatrix_t *)btnm;
433     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
434 
435     lv_buttonmatrix_set_map(btnm, btn_map);
436     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
437     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_DEFOCUSED, NULL);
438     /* Set expected event code before the event is raised. */
439     exp_evt_code = LV_EVENT_DEFOCUSED;
440     /* Select a button before raising a simulated event.
441      * This is done to increase code coverage. */
442     btnmObj->btn_id_sel = 0;
443     lv_obj_send_event(btnm, LV_EVENT_DEFOCUSED, NULL);
444     TEST_ASSERT_TRUE(event_triggered);
445 }
446 
test_button_matrix_focused_event_works(void)447 void test_button_matrix_focused_event_works(void)
448 {
449     static const char * btn_map[] = {"A", "B", "\n", "C", "D", ""};
450 
451     lv_buttonmatrix_set_map(btnm, btn_map);
452     lv_buttonmatrix_set_button_ctrl_all(btnm, LV_BUTTONMATRIX_CTRL_CHECKABLE);
453     lv_obj_add_event_cb(btnm, event_handler, LV_EVENT_FOCUSED, NULL);
454     /* Set expected event code before the event is raised. */
455     exp_evt_code = LV_EVENT_FOCUSED;
456     lv_obj_send_event(btnm, LV_EVENT_FOCUSED, NULL);
457     TEST_ASSERT_TRUE(event_triggered);
458 }
459 
460 #endif
461