1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 #include "lv_test_indev.h"
7 
8 static lv_obj_t * active_screen = NULL;
9 static lv_obj_t * slider = NULL;
10 static lv_obj_t * sliderRangeMode = NULL;
11 static lv_obj_t * sliderNormalMode = NULL;
12 static lv_obj_t * sliderSymmetricalMode = NULL;
13 static lv_group_t * g = NULL;
14 
setUp(void)15 void setUp(void)
16 {
17     active_screen = lv_screen_active();
18     slider = lv_slider_create(active_screen);
19     sliderRangeMode = lv_slider_create(active_screen);
20     sliderNormalMode = lv_slider_create(active_screen);
21     sliderSymmetricalMode = lv_slider_create(active_screen);
22 
23     lv_slider_set_mode(sliderRangeMode, LV_SLIDER_MODE_RANGE);
24     lv_slider_set_mode(sliderNormalMode, LV_SLIDER_MODE_NORMAL);
25     lv_slider_set_mode(sliderSymmetricalMode, LV_SLIDER_MODE_SYMMETRICAL);
26 
27     g = lv_group_create();
28     lv_indev_set_group(lv_test_encoder_indev, g);
29 }
30 
tearDown(void)31 void tearDown(void)
32 {
33     lv_obj_clean(active_screen);
34 }
35 
test_textarea_should_have_valid_documented_default_values(void)36 void test_textarea_should_have_valid_documented_default_values(void)
37 {
38     int32_t objw = lv_obj_get_width(slider);
39     int32_t objh = lv_obj_get_height(slider);
40 
41     /* Horizontal slider */
42     TEST_ASSERT_TRUE(objw >= objh);
43     TEST_ASSERT_FALSE(lv_obj_has_flag(slider, LV_OBJ_FLAG_SCROLL_CHAIN));
44     TEST_ASSERT_FALSE(lv_obj_has_flag(slider, LV_OBJ_FLAG_SCROLLABLE));
45 }
46 
test_slider_event_keys_right_and_up_increment_value_by_one(void)47 void test_slider_event_keys_right_and_up_increment_value_by_one(void)
48 {
49     uint32_t key = LV_KEY_RIGHT;
50     lv_slider_set_value(slider, 10, LV_ANIM_OFF);
51     int32_t value = lv_slider_get_value(slider);
52 
53     lv_obj_send_event(slider, LV_EVENT_KEY, (void *) &key);
54 
55     int32_t new_value = lv_slider_get_value(slider);
56     TEST_ASSERT_EQUAL_INT32(value + 1, new_value);
57 
58     key = LV_KEY_UP;
59     lv_obj_send_event(slider, LV_EVENT_KEY, (void *) &key);
60     TEST_ASSERT_EQUAL_INT32(new_value + 1, lv_slider_get_value(slider));
61 }
62 
test_slider_event_keys_left_and_down_decrement_value_by_one(void)63 void test_slider_event_keys_left_and_down_decrement_value_by_one(void)
64 {
65     uint32_t key = LV_KEY_LEFT;
66     lv_slider_set_value(slider, 10, LV_ANIM_OFF);
67     int32_t value = lv_slider_get_value(slider);
68 
69     lv_obj_send_event(slider, LV_EVENT_KEY, (void *) &key);
70 
71     int32_t new_value = lv_slider_get_value(slider);
72     TEST_ASSERT_EQUAL_INT32(value - 1, new_value);
73 
74     key = LV_KEY_DOWN;
75     lv_obj_send_event(slider, LV_EVENT_KEY, (void *) &key);
76     TEST_ASSERT_EQUAL_INT32(new_value - 1, lv_slider_get_value(slider));
77 }
78 
test_slider_event_invalid_key_should_not_change_values(void)79 void test_slider_event_invalid_key_should_not_change_values(void)
80 {
81     uint32_t key = LV_KEY_ENTER;
82     lv_slider_set_value(slider, 10, LV_ANIM_OFF);
83     int32_t value = lv_slider_get_value(slider);
84 
85     lv_obj_send_event(slider, LV_EVENT_KEY, (void *) &key);
86 
87     TEST_ASSERT_EQUAL_INT32(value, lv_slider_get_value(slider));
88 }
89 
test_slider_range_mode_should_leave_edit_mode_if_released(void)90 void test_slider_range_mode_should_leave_edit_mode_if_released(void)
91 {
92     lv_slider_t * ptr = (lv_slider_t *) sliderRangeMode;
93 
94     /* Setup group and encoder indev */
95     lv_group_add_obj(g, sliderNormalMode);
96     lv_group_set_editing(g, true);
97 
98     lv_test_encoder_click();
99 
100     /* Always executed when handling LV_EVENT_RELEASED or
101      * LV_EVENT_PRESS_LOST */
102     TEST_ASSERT_FALSE(ptr->dragging);
103     TEST_ASSERT_NULL(ptr->value_to_set);
104     TEST_ASSERT_EQUAL(0U, ptr->left_knob_focus);
105 
106     /* Group leaved edit mode */
107     TEST_ASSERT_FALSE(lv_group_get_editing(g));
108 }
109 
test_slider_range_mode_should_not_leave_edit_mode_if_released_with_no_left_knob_focus(void)110 void test_slider_range_mode_should_not_leave_edit_mode_if_released_with_no_left_knob_focus(void)
111 {
112     lv_slider_t * ptr = (lv_slider_t *) sliderRangeMode;
113 
114     /* Setup group and encoder indev */
115     lv_group_add_obj(g, sliderRangeMode);
116     lv_group_set_editing(g, true);
117 
118     lv_test_encoder_release();
119     lv_test_indev_wait(50);
120 
121     /* Always executed when handling LV_EVENT_RELEASED or
122      * LV_EVENT_PRESS_LOST */
123     TEST_ASSERT_FALSE(ptr->dragging);
124     TEST_ASSERT_NULL(ptr->value_to_set);
125 
126     TEST_ASSERT(lv_group_get_editing(g));
127 }
128 
test_slider_normal_mode_should_leave_edit_mode_if_released(void)129 void test_slider_normal_mode_should_leave_edit_mode_if_released(void)
130 {
131     lv_slider_t * ptr = (lv_slider_t *) sliderNormalMode;
132     ptr->left_knob_focus = 1;
133 
134     /* Setup group and encoder indev */
135     lv_group_add_obj(g, sliderNormalMode);
136     lv_group_set_editing(g, true);
137 
138     lv_test_encoder_click();
139 
140     /* Always executed when handling LV_EVENT_RELEASED or
141      * LV_EVENT_PRESS_LOST */
142     TEST_ASSERT_FALSE(ptr->dragging);
143     TEST_ASSERT_NULL(ptr->value_to_set);
144     TEST_ASSERT_EQUAL(0U, ptr->left_knob_focus);
145 
146     /* Group leaved edit mode */
147     TEST_ASSERT_FALSE(lv_group_get_editing(g));
148 }
149 
test_ranged_mode_adjust_with_encoder(void)150 void test_ranged_mode_adjust_with_encoder(void)
151 {
152     lv_slider_set_value(sliderRangeMode, 90, LV_ANIM_OFF);
153     lv_slider_set_left_value(sliderRangeMode, 10, LV_ANIM_OFF);
154 
155     /* Setup group and encoder indev */
156     lv_group_add_obj(g, sliderRangeMode);
157     lv_group_set_editing(g, false);
158 
159     /*Go the edit mode*/
160     lv_test_encoder_click();
161 
162     /*Adjust the right knob*/
163     lv_test_encoder_turn(-10);
164     TEST_ASSERT_EQUAL(80, lv_slider_get_value(sliderRangeMode));  /*Updated?*/
165     TEST_ASSERT_EQUAL(10, lv_slider_get_left_value(sliderRangeMode));     /*Maintained?*/
166 
167     /*Focus the left knob*/
168     lv_test_encoder_click();
169 
170     /*Adjust the left knob*/
171     lv_test_encoder_turn(5);
172     TEST_ASSERT_EQUAL(80, lv_slider_get_value(sliderRangeMode));  /*Maintained?*/
173     TEST_ASSERT_EQUAL(15, lv_slider_get_left_value(sliderRangeMode));  /*Updated?*/
174 
175 }
176 
test_normal_mode_slider_hit_test(void)177 void test_normal_mode_slider_hit_test(void)
178 {
179     /* Validate if point 0,0 can click in the slider */
180     lv_point_t point = {
181         .x = 0,
182         .y = 0
183     };
184 
185     lv_hit_test_info_t info = {
186         .res = false,
187         .point = &point
188     };
189 
190     lv_slider_set_value(sliderNormalMode, 100, LV_ANIM_OFF);
191     lv_obj_send_event(sliderNormalMode, LV_EVENT_HIT_TEST, (void *) &info);
192 
193     /* point can click slider */
194     TEST_ASSERT(info.res);
195 }
196 
test_slider_range_event_hit_test(void)197 void test_slider_range_event_hit_test(void)
198 {
199     /* Validate if point 0,0 can click in the slider */
200     lv_point_t point = {
201         .x = 0,
202         .y = 0
203     };
204 
205     lv_hit_test_info_t info = {
206         .res = false,
207         .point = &point
208     };
209     lv_obj_send_event(sliderRangeMode, LV_EVENT_HIT_TEST, (void *) &info);
210 
211     /* point can click slider in the left knob */
212     TEST_ASSERT(info.res);
213 }
214 
test_slider_properties(void)215 void test_slider_properties(void)
216 {
217 #if LV_USE_OBJ_PROPERTY
218     lv_obj_t * obj = lv_slider_create(lv_screen_active());
219     lv_property_t prop = { };
220 
221     prop.id = LV_PROPERTY_SLIDER_RANGE;
222     prop.arg1.num = 10;
223     prop.arg2.num = 100;
224     TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
225     TEST_ASSERT_EQUAL_INT(lv_slider_get_min_value(obj), 10);
226     TEST_ASSERT_EQUAL_INT(lv_slider_get_max_value(obj), 100);
227     TEST_ASSERT_EQUAL_INT(10, lv_obj_get_property(obj, LV_PROPERTY_SLIDER_MIN_VALUE).num);
228     TEST_ASSERT_EQUAL_INT(100, lv_obj_get_property(obj, LV_PROPERTY_SLIDER_MAX_VALUE).num);
229 
230     prop.id = LV_PROPERTY_SLIDER_VALUE;
231     prop.arg1.num = 50;
232     prop.arg2.enable = false;
233     TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
234     TEST_ASSERT_EQUAL_INT(lv_slider_get_value(obj), 50);
235     TEST_ASSERT_EQUAL_INT(50, lv_obj_get_property(obj, LV_PROPERTY_SLIDER_VALUE).num);
236 
237     prop.id = LV_PROPERTY_SLIDER_MODE;
238     prop.num = LV_SLIDER_MODE_RANGE;
239     TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
240     TEST_ASSERT_EQUAL_INT(LV_SLIDER_MODE_RANGE, lv_obj_get_property(obj, LV_PROPERTY_SLIDER_MODE).num);
241 
242     prop.id = LV_PROPERTY_SLIDER_LEFT_VALUE;
243     prop.arg1.num = 40;
244     prop.arg2.enable = false;
245     TEST_ASSERT_TRUE(lv_obj_set_property(obj, &prop) == LV_RESULT_OK);
246     TEST_ASSERT_EQUAL_INT(40, lv_slider_get_left_value(obj));
247     TEST_ASSERT_EQUAL_INT(40, lv_obj_get_property(obj, LV_PROPERTY_SLIDER_LEFT_VALUE).num);
248 
249     prop.id = LV_PROPERTY_SLIDER_IS_DRAGGED;
250     TEST_ASSERT_FALSE(lv_slider_is_dragged(obj));
251     TEST_ASSERT_FALSE(lv_obj_get_property(obj, LV_PROPERTY_SLIDER_IS_DRAGGED).enable);
252 
253     prop.id = LV_PROPERTY_SLIDER_IS_SYMMETRICAL;
254     TEST_ASSERT_FALSE(lv_slider_is_dragged(obj));
255     TEST_ASSERT_FALSE(lv_obj_get_property(obj, LV_PROPERTY_SLIDER_IS_SYMMETRICAL).enable);
256 
257 #endif
258 }
259 
260 
261 #endif
262