1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 
7 #include "lv_test_helpers.h"
8 #include "lv_test_indev.h"
9 
10 #define SWITCHES_CNT    10
11 
12 uint8_t value_changed_event_cnt = 0;
13 lv_obj_t * scr = NULL;
14 lv_obj_t * sw = NULL;
15 
setUp(void)16 void setUp(void)
17 {
18     /* Function run before every test */
19     scr = lv_screen_active();
20     sw = lv_switch_create(scr);
21 }
22 
tearDown(void)23 void tearDown(void)
24 {
25     /* Function run after every test */
26     value_changed_event_cnt = 0;
27 }
28 
mouse_click_on_switch(void)29 static void mouse_click_on_switch(void)
30 {
31     lv_test_mouse_click_at(sw->coords.x1, sw->coords.y1);
32 }
33 
event_handler(lv_event_t * e)34 static void event_handler(lv_event_t * e)
35 {
36     lv_event_code_t event = lv_event_get_code(e);
37 
38     if(LV_EVENT_VALUE_CHANGED == event) {
39         value_changed_event_cnt++;
40     }
41 
42 }
43 
test_switch_should_have_default_state_after_being_created(void)44 void test_switch_should_have_default_state_after_being_created(void)
45 {
46     lv_state_t state = lv_obj_get_state(sw);
47     TEST_ASSERT_EQUAL(state, LV_STATE_DEFAULT);
48 }
49 
test_switch_should_not_leak_memory_after_deletion(void)50 void test_switch_should_not_leak_memory_after_deletion(void)
51 {
52     size_t idx = 0;
53     size_t initial_available_memory = 0;
54     lv_obj_t * switches[SWITCHES_CNT] = {NULL};
55 
56     initial_available_memory = lv_test_get_free_mem();
57 
58     for(idx = 0; idx < SWITCHES_CNT; idx++) {
59         switches[idx] = lv_switch_create(scr);
60     }
61 
62     for(idx = 0; idx < SWITCHES_CNT; idx++) {
63         lv_obj_delete(switches[idx]);
64     }
65 
66     LV_UNUSED(initial_available_memory);
67     LV_HEAP_CHECK(TEST_ASSERT_MEM_LEAK_LESS_THAN(initial_available_memory, 24));
68 }
69 
test_switch_animation(void)70 void test_switch_animation(void)
71 {
72     lv_switch_t * anim_sw = (lv_switch_t *) sw;
73     int32_t initial_anim_state = anim_sw->anim_state;
74 
75     /* Trigger animation */
76     mouse_click_on_switch();
77     /* Wait some time  */
78     lv_test_indev_wait(50);
79 
80     int32_t checked_anim_state = anim_sw->anim_state;
81     TEST_ASSERT_GREATER_THAN(initial_anim_state, checked_anim_state);
82     TEST_ASSERT(lv_obj_has_state(sw, LV_STATE_CHECKED));
83 
84     mouse_click_on_switch();
85     lv_test_indev_wait(50);
86 
87     TEST_ASSERT_LESS_THAN(checked_anim_state, anim_sw->anim_state);
88     TEST_ASSERT_FALSE(lv_obj_has_state(sw, LV_STATE_CHECKED));
89 }
90 
test_switch_should_not_have_extra_draw_size_at_creation(void)91 void test_switch_should_not_have_extra_draw_size_at_creation(void)
92 {
93     int32_t extra_size = lv_obj_get_ext_draw_size(sw);
94 
95     TEST_ASSERT_EQUAL(0, extra_size);
96 }
97 
test_switch_should_update_extra_draw_size_after_editing_padding(void)98 void test_switch_should_update_extra_draw_size_after_editing_padding(void)
99 {
100     int32_t pad = 6;
101     int32_t actual = 0;
102     int32_t expected = pad + LV_SWITCH_KNOB_EXT_AREA_CORRECTION;
103 
104     static lv_style_t style_knob;
105     lv_style_init(&style_knob);
106     lv_style_set_pad_all(&style_knob, pad);
107 
108     lv_obj_remove_style_all(sw);
109     lv_obj_add_style(sw, &style_knob, LV_PART_KNOB);
110     lv_obj_center(sw);
111 
112     /* Get extra draw size */
113     actual = lv_obj_get_ext_draw_size(sw);
114 
115     TEST_ASSERT_EQUAL(expected, actual);
116 }
117 
118 /* See #2330 for context */
test_switch_should_trigger_value_changed_event_only_once(void)119 void test_switch_should_trigger_value_changed_event_only_once(void)
120 {
121     lv_obj_add_event_cb(sw, event_handler, LV_EVENT_ALL, NULL);
122     mouse_click_on_switch();
123 
124     TEST_ASSERT_EQUAL(1, value_changed_event_cnt);
125 }
126 
127 /* See #2785 for context */
test_switch_should_state_change_when_event_bubbling_is_enabled(void)128 void test_switch_should_state_change_when_event_bubbling_is_enabled(void)
129 {
130     lv_obj_add_flag(sw, LV_OBJ_FLAG_EVENT_BUBBLE);
131     mouse_click_on_switch();
132 
133     TEST_ASSERT(lv_obj_has_state(sw, LV_STATE_CHECKED));
134 }
135 
136 
test_screeshots(void)137 void test_screeshots(void)
138 {
139     lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_COLUMN);
140     lv_obj_set_flex_align(lv_screen_active(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
141     lv_obj_clean(scr);
142 
143     sw = lv_switch_create(lv_screen_active());
144 
145     sw = lv_switch_create(lv_screen_active());
146     lv_obj_add_state(sw, LV_STATE_CHECKED);
147 
148     sw = lv_switch_create(lv_screen_active());
149 
150     sw = lv_switch_create(lv_screen_active());
151     lv_obj_add_state(sw, LV_STATE_CHECKED | LV_STATE_DISABLED);
152 
153     sw = lv_switch_create(lv_screen_active());
154     lv_switch_set_orientation(sw, LV_SWITCH_ORIENTATION_VERTICAL);
155     lv_obj_set_size(sw, 50, 100);
156 
157     sw = lv_switch_create(lv_screen_active());
158     lv_switch_set_orientation(sw, LV_SWITCH_ORIENTATION_VERTICAL);
159     lv_obj_add_state(sw, LV_STATE_CHECKED);
160     lv_obj_set_size(sw, 50, 100);
161 
162     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/switch_1.png");
163 }
164 
165 #endif
166