1 #if LV_BUILD_TEST == 1
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 #include "lv_test_indev.h"
7 
setUp(void)8 void setUp(void)
9 {
10     /* Function run before every test */
11 }
12 
tearDown(void)13 void tearDown(void)
14 {
15     /* Function run after every test */
16     lv_obj_clean(lv_screen_active());
17 }
18 
19 static int32_t prev_v;
20 static int32_t current_v;
21 
observer_int(lv_observer_t * observer,lv_subject_t * subject)22 static void observer_int(lv_observer_t * observer, lv_subject_t * subject)
23 {
24     LV_UNUSED(observer);
25     prev_v = lv_subject_get_previous_int(subject);
26     current_v = lv_subject_get_int(subject);
27 }
28 
test_observer_add_remove(void)29 void test_observer_add_remove(void)
30 {
31     static lv_subject_t subject;
32     lv_subject_init_int(&subject, 5);
33 
34     lv_observer_t * observer = lv_subject_add_observer(&subject, observer_int, NULL);
35 
36     current_v = 0;
37     lv_subject_set_int(&subject, 10);
38     TEST_ASSERT_EQUAL(10, lv_subject_get_int(&subject));
39     TEST_ASSERT_EQUAL(10, current_v);
40 
41     lv_observer_remove(observer);
42     lv_subject_set_int(&subject, 15);
43     TEST_ASSERT_EQUAL(15, lv_subject_get_int(&subject));
44     TEST_ASSERT_EQUAL(10, current_v);   /*The observer cb is not called*/
45 
46     static lv_subject_t uninitialized_subject;
47     observer = lv_subject_add_observer(&uninitialized_subject, observer_int, NULL);
48     TEST_ASSERT_EQUAL_PTR(NULL, observer);   /*The observer must be NULL*/
49 }
50 
test_observer_int(void)51 void test_observer_int(void)
52 {
53     static lv_subject_t subject;
54     lv_subject_init_int(&subject, 5);
55     TEST_ASSERT_EQUAL(5, lv_subject_get_int(&subject));
56     TEST_ASSERT_EQUAL(5, lv_subject_get_previous_int(&subject));
57 
58     lv_subject_set_int(&subject, 10);
59     TEST_ASSERT_EQUAL(10, lv_subject_get_int(&subject));
60     TEST_ASSERT_EQUAL(5, lv_subject_get_previous_int(&subject));
61 
62     lv_subject_set_int(&subject, 15);
63     TEST_ASSERT_EQUAL(15, lv_subject_get_int(&subject));
64     TEST_ASSERT_EQUAL(10, lv_subject_get_previous_int(&subject));
65 
66     /*Ignore incorrect types*/
67     lv_subject_set_pointer(&subject, NULL);
68     TEST_ASSERT_EQUAL(15, lv_subject_get_int(&subject));
69     TEST_ASSERT_EQUAL(10, lv_subject_get_previous_int(&subject));
70 
71     lv_subject_set_color(&subject, lv_color_black());
72     TEST_ASSERT_EQUAL(15, lv_subject_get_int(&subject));
73     TEST_ASSERT_EQUAL(10, lv_subject_get_previous_int(&subject));
74 
75     lv_subject_copy_string(&subject, "hello");
76     TEST_ASSERT_EQUAL(15, lv_subject_get_int(&subject));
77     TEST_ASSERT_EQUAL(10, lv_subject_get_previous_int(&subject));
78 }
79 
test_observer_string(void)80 void test_observer_string(void)
81 {
82     char buf_current[32];
83     char buf_previous[32];
84     lv_subject_t subject;
85     lv_subject_init_string(&subject, buf_current, buf_previous, sizeof(buf_current), "hello");
86     TEST_ASSERT_EQUAL_STRING("hello", lv_subject_get_string(&subject));
87     TEST_ASSERT_EQUAL_STRING("hello", lv_subject_get_previous_string(&subject));
88 
89     lv_subject_copy_string(&subject, "my name is John");
90     TEST_ASSERT_EQUAL_STRING("my name is John", lv_subject_get_string(&subject));
91     TEST_ASSERT_EQUAL_STRING("hello", lv_subject_get_previous_string(&subject));
92 
93     lv_subject_copy_string(&subject, "how are you?");
94     TEST_ASSERT_EQUAL_STRING("how are you?", lv_subject_get_string(&subject));
95     TEST_ASSERT_EQUAL_STRING("my name is John", lv_subject_get_previous_string(&subject));
96 
97     lv_subject_snprintf(&subject, "I ate %d pizzas", 10);
98     TEST_ASSERT_EQUAL_STRING("I ate 10 pizzas", lv_subject_get_string(&subject));
99     TEST_ASSERT_EQUAL_STRING("how are you?", lv_subject_get_previous_string(&subject));
100 
101     lv_subject_snprintf(&subject, "%d: %s", 1, "Coding is fun !");
102     TEST_ASSERT_EQUAL_STRING("1: Coding is fun !", lv_subject_get_string(&subject));
103     TEST_ASSERT_EQUAL_STRING("I ate 10 pizzas", lv_subject_get_previous_string(&subject));
104 
105 
106 
107     /*Clip long text*/
108     lv_subject_copy_string(&subject, "text to be clipped to 32 chars.this should be clipped");
109     TEST_ASSERT_EQUAL_STRING("text to be clipped to 32 chars.", lv_subject_get_string(&subject));
110     TEST_ASSERT_EQUAL_STRING("1: Coding is fun !", lv_subject_get_previous_string(&subject));
111 
112     /*Check if the previous string is clipped correctly*/
113     lv_subject_copy_string(&subject, "a");
114     TEST_ASSERT_EQUAL_STRING("a", lv_subject_get_string(&subject));
115     TEST_ASSERT_EQUAL_STRING("text to be clipped to 32 chars.", lv_subject_get_previous_string(&subject));
116 
117     /*Ignore incorrect types*/
118     lv_subject_set_pointer(&subject, NULL);
119     TEST_ASSERT_EQUAL_STRING("a", lv_subject_get_string(&subject));
120     TEST_ASSERT_EQUAL_STRING("text to be clipped to 32 chars.", lv_subject_get_previous_string(&subject));
121 
122     lv_subject_set_color(&subject, lv_color_black());
123     TEST_ASSERT_EQUAL_STRING("a", lv_subject_get_string(&subject));
124     TEST_ASSERT_EQUAL_STRING("text to be clipped to 32 chars.", lv_subject_get_previous_string(&subject));
125 
126     lv_subject_set_int(&subject, 10);
127     TEST_ASSERT_EQUAL_STRING("a", lv_subject_get_string(&subject));
128     TEST_ASSERT_EQUAL_STRING("text to be clipped to 32 chars.", lv_subject_get_previous_string(&subject));
129 }
130 
test_observer_pointer(void)131 void test_observer_pointer(void)
132 {
133     static int32_t a[3] = {0};
134     static lv_subject_t subject;
135 
136     lv_subject_init_pointer(&subject, &a[0]);
137     TEST_ASSERT_EQUAL_PTR(&a[0], lv_subject_get_pointer(&subject));
138     TEST_ASSERT_EQUAL_PTR(&a[0], lv_subject_get_previous_pointer(&subject));
139 
140     lv_subject_set_pointer(&subject, &a[1]);
141     TEST_ASSERT_EQUAL_PTR(&a[1], lv_subject_get_pointer(&subject));
142     TEST_ASSERT_EQUAL_PTR(&a[0], lv_subject_get_previous_pointer(&subject));
143 
144     lv_subject_set_pointer(&subject, &a[2]);
145     TEST_ASSERT_EQUAL_PTR(&a[2], lv_subject_get_pointer(&subject));
146     TEST_ASSERT_EQUAL_PTR(&a[1], lv_subject_get_previous_pointer(&subject));
147 
148     /*Ignore incorrect types*/
149     lv_subject_set_int(&subject, 10);
150     TEST_ASSERT_EQUAL_PTR(&a[2], lv_subject_get_pointer(&subject));
151     TEST_ASSERT_EQUAL_PTR(&a[1], lv_subject_get_previous_pointer(&subject));
152 
153     lv_subject_set_color(&subject, lv_color_black());
154     TEST_ASSERT_EQUAL_PTR(&a[2], lv_subject_get_pointer(&subject));
155     TEST_ASSERT_EQUAL_PTR(&a[1], lv_subject_get_previous_pointer(&subject));
156 
157     lv_subject_copy_string(&subject, "hello");
158     TEST_ASSERT_EQUAL_PTR(&a[2], lv_subject_get_pointer(&subject));
159     TEST_ASSERT_EQUAL_PTR(&a[1], lv_subject_get_previous_pointer(&subject));
160 }
161 
test_observer_color(void)162 void test_observer_color(void)
163 {
164     static lv_subject_t subject;
165 
166     lv_subject_init_color(&subject, lv_color_hex3(0x123));
167     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x123), lv_subject_get_color(&subject));
168     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x123), lv_subject_get_previous_color(&subject));
169 
170     lv_subject_set_color(&subject, lv_color_hex3(0x456));
171     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x456), lv_subject_get_color(&subject));
172     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x123), lv_subject_get_previous_color(&subject));
173 
174     lv_subject_set_color(&subject, lv_color_hex3(0xabc));
175     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0xabc), lv_subject_get_color(&subject));
176     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x456), lv_subject_get_previous_color(&subject));
177 
178     /*Ignore incorrect types*/
179     lv_subject_set_pointer(&subject, NULL);
180     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0xabc), lv_subject_get_color(&subject));
181     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x456), lv_subject_get_previous_color(&subject));
182 
183     lv_subject_set_int(&subject, 10);
184     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0xabc), lv_subject_get_color(&subject));
185     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x456), lv_subject_get_previous_color(&subject));
186 
187     lv_subject_copy_string(&subject, "hello");
188     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0xabc), lv_subject_get_color(&subject));
189     TEST_ASSERT_EQUAL_COLOR(lv_color_hex3(0x456), lv_subject_get_previous_color(&subject));
190 }
191 
192 static int32_t group_observer_called;
193 
group_observer_cb(lv_observer_t * observer,lv_subject_t * subject)194 static void group_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
195 {
196     LV_UNUSED(observer);
197     LV_UNUSED(subject);
198     group_observer_called++;
199 }
200 
test_observer_group(void)201 void test_observer_group(void)
202 {
203     static lv_subject_t subject_main;
204     static lv_subject_t subject_sub1;
205     static lv_subject_t subject_sub2;
206     static lv_subject_t * subject_list[2] = {&subject_sub1, &subject_sub2};
207 
208     lv_subject_init_int(&subject_sub1, 1);
209     lv_subject_init_int(&subject_sub2, 2);
210 
211     lv_subject_init_group(&subject_main, subject_list, 2);
212     TEST_ASSERT_EQUAL_PTR(&subject_sub1, lv_subject_get_group_element(&subject_main, 0));
213     TEST_ASSERT_EQUAL_PTR(&subject_sub2, lv_subject_get_group_element(&subject_main, 1));
214     TEST_ASSERT_EQUAL_PTR(NULL, lv_subject_get_group_element(&subject_main, 2));
215     TEST_ASSERT_EQUAL_PTR(NULL, lv_subject_get_group_element(&subject_main, 1000));
216 
217     group_observer_called = 0;
218     lv_subject_add_observer(&subject_main, group_observer_cb, NULL);
219     TEST_ASSERT_EQUAL(1, group_observer_called);
220 
221     lv_subject_set_int(&subject_sub1, 10);
222     TEST_ASSERT_EQUAL(2, group_observer_called);
223 
224     lv_subject_set_int(&subject_sub2, 20);
225     TEST_ASSERT_EQUAL(3, group_observer_called);
226 }
227 
test_observer_obj_flag(void)228 void test_observer_obj_flag(void)
229 {
230     lv_obj_t * obj = lv_obj_create(lv_screen_active());
231 
232     /*Can bind only to int*/
233     static lv_subject_t subject_wrong;
234     lv_subject_init_pointer(&subject_wrong, NULL);
235     lv_observer_t * observer = lv_obj_bind_state_if_eq(obj, &subject_wrong, LV_STATE_CHECKED, 5);
236     TEST_ASSERT_EQUAL_PTR(NULL, observer);
237 
238     static lv_subject_t subject;
239     lv_subject_init_int(&subject, 1);
240 
241     lv_obj_bind_flag_if_eq(obj, &subject, LV_OBJ_FLAG_HIDDEN, 5);
242     /*Should be applied immediately*/
243     TEST_ASSERT_EQUAL(false, lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN));
244 
245     lv_obj_bind_flag_if_not_eq(obj, &subject, LV_OBJ_FLAG_CHECKABLE, 10);
246     /*Should be applied immediately*/
247     TEST_ASSERT_EQUAL(false, lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN));
248     TEST_ASSERT_EQUAL(true, lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE));
249 
250     lv_subject_set_int(&subject, 5);
251     TEST_ASSERT_EQUAL(true, lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN));
252     TEST_ASSERT_EQUAL(true, lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE));
253 
254     lv_subject_set_int(&subject, 10);
255     TEST_ASSERT_EQUAL(false, lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN));
256     TEST_ASSERT_EQUAL(false, lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE));
257 }
258 
test_observer_obj_state(void)259 void test_observer_obj_state(void)
260 {
261     lv_obj_t * obj = lv_obj_create(lv_screen_active());
262 
263     /*Can bind only to int*/
264     static lv_subject_t subject_wrong;
265     lv_subject_init_pointer(&subject_wrong, NULL);
266     lv_observer_t * observer = lv_obj_bind_state_if_eq(obj, &subject_wrong, LV_STATE_CHECKED, 5);
267     TEST_ASSERT_EQUAL_PTR(NULL, observer);
268 
269     static lv_subject_t subject;
270     lv_subject_init_int(&subject, 1);
271 
272     lv_obj_bind_state_if_eq(obj, &subject, LV_STATE_CHECKED, 5);
273     /*Should be applied immediately*/
274     TEST_ASSERT_EQUAL(false, lv_obj_has_state(obj, LV_STATE_CHECKED));
275 
276     lv_obj_bind_state_if_not_eq(obj, &subject, LV_STATE_DISABLED, 10);
277     /*Should be applied immediately*/
278     TEST_ASSERT_EQUAL(false, lv_obj_has_state(obj, LV_STATE_CHECKED));
279     TEST_ASSERT_EQUAL(true, lv_obj_has_state(obj, LV_STATE_DISABLED));
280 
281     lv_subject_set_int(&subject, 5);
282     TEST_ASSERT_EQUAL(true, lv_obj_has_state(obj, LV_STATE_CHECKED));
283     TEST_ASSERT_EQUAL(true, lv_obj_has_state(obj, LV_STATE_DISABLED));
284 
285     lv_subject_set_int(&subject, 10);
286     TEST_ASSERT_EQUAL(false, lv_obj_has_state(obj, LV_STATE_CHECKED));
287     TEST_ASSERT_EQUAL(false, lv_obj_has_state(obj, LV_STATE_DISABLED));
288 }
289 
test_observer_button_checked(void)290 void test_observer_button_checked(void)
291 {
292     lv_obj_t * obj = lv_button_create(lv_screen_active());
293     lv_obj_set_size(obj, 100, 100);
294     lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE);
295     lv_obj_update_layout(obj);
296 
297     /*Can bind only to int*/
298     static lv_subject_t subject_wrong;
299     lv_subject_init_pointer(&subject_wrong, NULL);
300     lv_observer_t * observer = lv_obj_bind_checked(obj, &subject_wrong);
301     TEST_ASSERT_EQUAL_PTR(NULL, observer);
302 
303     static lv_subject_t subject;
304     lv_subject_init_int(&subject, 1);
305     lv_obj_bind_checked(obj, &subject);
306 
307     TEST_ASSERT_EQUAL(true, lv_obj_has_state(obj, LV_STATE_CHECKED));
308 
309     lv_subject_set_int(&subject, 0);
310     TEST_ASSERT_EQUAL(false, lv_obj_has_state(obj, LV_STATE_CHECKED));
311 
312     lv_test_mouse_click_at(10, 10);
313     TEST_ASSERT_EQUAL(true, lv_obj_has_state(obj, LV_STATE_CHECKED));
314     TEST_ASSERT_EQUAL(1, lv_subject_get_int(&subject));
315 }
316 
test_observer_label_text_normal(void)317 void test_observer_label_text_normal(void)
318 {
319     lv_obj_t * obj = lv_label_create(lv_screen_active());
320 
321     lv_observer_t * observer;
322 
323     /*Cannot bind color*/
324     static lv_subject_t subject_color;
325     lv_subject_init_color(&subject_color, lv_color_black());
326     observer = lv_label_bind_text(obj, &subject_color, NULL);
327     TEST_ASSERT_EQUAL_PTR(NULL, observer);
328 
329     /*Cannot bind int*/
330     static lv_subject_t subject_int;
331     lv_subject_init_int(&subject_int, 0);
332     observer = lv_label_bind_text(obj, &subject_int, NULL);
333     TEST_ASSERT_EQUAL_PTR(NULL, observer);
334 
335     /*Bind to string*/
336     static char buf[32];
337     static lv_subject_t subject_string;
338     lv_subject_init_string(&subject_string, buf, NULL, 32, "hello");
339     lv_label_bind_text(obj, &subject_string, NULL);
340     TEST_ASSERT_EQUAL_STRING("hello", lv_label_get_text(obj));
341 
342     lv_subject_copy_string(&subject_string, "world");
343     TEST_ASSERT_EQUAL_STRING("world", lv_label_get_text(obj));
344 
345     /*Remove the label from the subject*/
346     lv_obj_remove_from_subject(obj, &subject_string);
347     lv_subject_copy_string(&subject_string, "nothing");
348     TEST_ASSERT_EQUAL_STRING("world", lv_label_get_text(obj));
349 
350     /*Bind to pointer*/
351     static lv_subject_t subject_pointer;
352     lv_subject_init_pointer(&subject_pointer, "HELLO");
353     lv_label_bind_text(obj, &subject_pointer, NULL);
354     TEST_ASSERT_EQUAL_STRING("HELLO", lv_label_get_text(obj));
355 
356     lv_subject_set_pointer(&subject_pointer, "WORLD");
357     TEST_ASSERT_EQUAL_STRING("WORLD", lv_label_get_text(obj));
358 
359     /*Remove the label from the subject*/
360     lv_obj_remove_from_subject(obj, &subject_pointer);
361     lv_subject_copy_string(&subject_pointer, "NOTHING");
362     TEST_ASSERT_EQUAL_STRING("WORLD", lv_label_get_text(obj));
363 }
364 
test_observer_label_text_formatted(void)365 void test_observer_label_text_formatted(void)
366 {
367     lv_obj_t * obj = lv_label_create(lv_screen_active());
368 
369     lv_observer_t * observer;
370 
371     /*Cannot bind color*/
372     static lv_subject_t subject_color;
373     lv_subject_init_color(&subject_color, lv_color_black());
374     observer = lv_label_bind_text(obj, &subject_color, NULL);
375     TEST_ASSERT_EQUAL_PTR(NULL, observer);
376 
377     /*Bind to int*/
378     static lv_subject_t subject_int;
379     lv_subject_init_int(&subject_int, 10);
380     lv_label_bind_text(obj, &subject_int, "value: %d");
381     TEST_ASSERT_EQUAL_STRING("value: 10", lv_label_get_text(obj));
382 
383     lv_subject_set_int(&subject_int, -20);
384     TEST_ASSERT_EQUAL_STRING("value: -20", lv_label_get_text(obj));
385 
386     /*Remove the label from the subject*/
387     lv_obj_remove_from_subject(obj, &subject_int);
388     lv_subject_set_int(&subject_int, 100);
389     TEST_ASSERT_EQUAL_STRING("value: -20", lv_label_get_text(obj));
390 
391     /*Bind to string*/
392     static char buf[32];
393     static lv_subject_t subject_string;
394     lv_subject_init_string(&subject_string, buf, NULL, 32, "hello");
395     lv_label_bind_text(obj, &subject_string, "text: %s");
396     TEST_ASSERT_EQUAL_STRING("text: hello", lv_label_get_text(obj));
397 
398     lv_subject_copy_string(&subject_string, "world");
399     TEST_ASSERT_EQUAL_STRING("text: world", lv_label_get_text(obj));
400 
401     /*Remove the label from the subject*/
402     lv_obj_remove_from_subject(obj, &subject_string);
403     lv_subject_copy_string(&subject_string, "nothing");
404     TEST_ASSERT_EQUAL_STRING("text: world", lv_label_get_text(obj));
405 
406     /*Bind to pointer*/
407     static lv_subject_t subject_pointer;
408     lv_subject_init_pointer(&subject_pointer, "HELLO");
409     lv_label_bind_text(obj, &subject_pointer, "pointer: %s");
410     TEST_ASSERT_EQUAL_STRING("pointer: HELLO", lv_label_get_text(obj));
411 
412     lv_subject_set_pointer(&subject_pointer, "WORLD");
413     TEST_ASSERT_EQUAL_STRING("pointer: WORLD", lv_label_get_text(obj));
414 
415     /*Remove the label from the subject*/
416     lv_obj_remove_from_subject(obj, &subject_pointer);
417     lv_subject_copy_string(&subject_pointer, "NOTHING");
418     TEST_ASSERT_EQUAL_STRING("pointer: WORLD", lv_label_get_text(obj));
419 }
420 
test_observer_arc_value(void)421 void test_observer_arc_value(void)
422 {
423     lv_obj_t * obj = lv_arc_create(lv_screen_active());
424 
425     static lv_subject_t subject;
426     lv_subject_init_int(&subject, 30);
427     lv_arc_bind_value(obj, &subject);
428 
429     TEST_ASSERT_EQUAL(30, lv_arc_get_value(obj));
430 
431     lv_subject_set_int(&subject, 40);
432     TEST_ASSERT_EQUAL(40, lv_arc_get_value(obj));
433 
434     lv_obj_update_layout(obj);
435     lv_test_mouse_release();
436     lv_test_indev_wait(100);
437 
438     lv_test_mouse_move_to(65, 10);
439     lv_test_mouse_press();
440     lv_test_indev_wait(100);
441     lv_test_mouse_release();
442 
443     TEST_ASSERT_EQUAL(50, lv_arc_get_value(obj));
444     TEST_ASSERT_EQUAL(50, lv_subject_get_int(&subject));
445 }
446 
test_observer_slider_value(void)447 void test_observer_slider_value(void)
448 {
449     lv_obj_t * obj = lv_slider_create(lv_screen_active());
450 
451     static lv_subject_t subject;
452     lv_subject_init_int(&subject, 30);
453     lv_slider_bind_value(obj, &subject);
454 
455     TEST_ASSERT_EQUAL(30, lv_slider_get_value(obj));
456 
457     lv_subject_set_int(&subject, 40);
458     TEST_ASSERT_EQUAL(40, lv_slider_get_value(obj));
459 
460     lv_obj_update_layout(obj);
461     lv_test_mouse_release();
462     lv_test_indev_wait(100);
463 
464     lv_test_mouse_move_to(65, 10);
465     lv_test_mouse_press();
466     lv_test_indev_wait(100);
467 
468     lv_test_mouse_move_to(75, 10);
469     lv_test_mouse_press();
470     lv_test_indev_wait(100);
471     lv_test_mouse_release();
472 
473     TEST_ASSERT_EQUAL(29, lv_slider_get_value(obj));
474     TEST_ASSERT_EQUAL(29, lv_subject_get_int(&subject));
475 }
476 
test_observer_roller_value(void)477 void test_observer_roller_value(void)
478 {
479     lv_obj_t * obj = lv_roller_create(lv_screen_active());
480 
481     static lv_subject_t subject;
482     lv_subject_init_int(&subject, 1);
483     lv_roller_bind_value(obj, &subject);
484 
485     TEST_ASSERT_EQUAL(1, lv_roller_get_selected(obj));
486 
487     lv_subject_set_int(&subject, 2);
488     TEST_ASSERT_EQUAL(2, lv_roller_get_selected(obj));
489 
490     lv_obj_update_layout(obj);
491     lv_test_mouse_click_at(30, 10);
492 
493     TEST_ASSERT_EQUAL(1, lv_roller_get_selected(obj));
494     TEST_ASSERT_EQUAL(1, lv_subject_get_int(&subject));
495 }
496 
test_observer_dropdown_value(void)497 void test_observer_dropdown_value(void)
498 {
499     lv_obj_t * obj = lv_dropdown_create(lv_screen_active());
500 
501     static lv_subject_t subject;
502     lv_subject_init_int(&subject, 1);
503     lv_dropdown_bind_value(obj, &subject);
504 
505     TEST_ASSERT_EQUAL(1, lv_dropdown_get_selected(obj));
506 
507     lv_subject_set_int(&subject, 2);
508     TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(obj));
509 
510     lv_obj_update_layout(obj);
511     lv_test_mouse_click_at(30, 10);
512     lv_test_mouse_click_at(30, 60);
513 
514     TEST_ASSERT_EQUAL(0, lv_dropdown_get_selected(obj));
515     TEST_ASSERT_EQUAL(0, lv_subject_get_int(&subject));
516 }
517 
test_observer_deinit(void)518 void test_observer_deinit(void)
519 {
520     static lv_subject_t subject;
521 
522     uint32_t mem = lv_test_get_free_mem();
523     uint32_t i;
524     for(i = 0; i < 64; i++) {
525         lv_obj_t * obj1 = lv_slider_create(lv_screen_active());
526         lv_obj_t * obj2 = lv_slider_create(lv_screen_active());
527 
528         lv_subject_init_int(&subject, 30);
529         lv_slider_bind_value(obj1, &subject);
530         lv_slider_bind_value(obj2, &subject);
531         lv_subject_add_observer(&subject, observer_int, NULL);
532         lv_obj_delete(obj1);
533         lv_subject_deinit(&subject);
534         lv_obj_delete(obj2);
535     }
536 
537     TEST_ASSERT_MEM_LEAK_LESS_THAN(mem, 32);
538 }
539 
540 #endif
541