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