1 #if LV_BUILD_TEST
2 
3 #include "../lvgl.h"
4 #include "../../lvgl_private.h"
5 
6 #include "unity/unity.h"
7 #include "lv_test_helpers.h"
8 
9 static lv_anim_timeline_t * anim_timeline;
10 
11 static uint32_t anim1_start_called;
12 static uint32_t anim2_start_called;
13 static uint32_t anim1_completed_called;
14 static uint32_t anim2_completed_called;
15 
setUp(void)16 void setUp(void)
17 {
18     /* Function run before every test */
19     anim_timeline = NULL;
20 }
21 
tearDown(void)22 void tearDown(void)
23 {
24     /* Function run after every test */
25     if(anim_timeline) lv_anim_timeline_delete(anim_timeline);
26     lv_obj_clean(lv_screen_active());
27 }
28 
test_anim_timeline_progress_1(void)29 void test_anim_timeline_progress_1(void)
30 {
31     lv_obj_t * obj = lv_obj_create(lv_screen_active());
32     lv_obj_set_size(obj, 100, 100);
33     lv_obj_set_pos(obj, 30, 40);
34 
35     lv_anim_t a1;
36     lv_anim_init(&a1);
37     lv_anim_set_exec_cb(&a1, (lv_anim_exec_xcb_t)lv_obj_set_x);
38     lv_anim_set_var(&a1, obj);
39     lv_anim_set_values(&a1, 0, 700);
40     lv_anim_set_duration(&a1, 1000);
41 
42     anim_timeline = lv_anim_timeline_create();
43     TEST_ASSERT_NOT_NULL(anim_timeline);
44 
45     lv_anim_timeline_add(anim_timeline, 0, &a1);
46 
47     lv_anim_timeline_set_progress(anim_timeline, 0);
48     lv_refr_now(NULL);
49     TEST_ASSERT_EQUAL(0, lv_obj_get_x(obj));
50 
51     lv_anim_timeline_set_progress(anim_timeline, 65535);
52     lv_refr_now(NULL);
53     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
54 
55     lv_anim_timeline_set_progress(anim_timeline, 10000);
56     lv_refr_now(NULL);
57     TEST_ASSERT_EQUAL(105, lv_obj_get_x(obj));
58 
59     lv_anim_timeline_set_progress(anim_timeline, 20000);
60     lv_refr_now(NULL);
61     TEST_ASSERT_EQUAL(213, lv_obj_get_x(obj));
62 
63     lv_anim_timeline_set_progress(anim_timeline, 30000);
64     lv_refr_now(NULL);
65     TEST_ASSERT_EQUAL(319, lv_obj_get_x(obj));
66 
67     lv_anim_timeline_set_progress(anim_timeline, 40000);
68     lv_refr_now(NULL);
69     TEST_ASSERT_EQUAL(426, lv_obj_get_x(obj));
70 
71     lv_anim_timeline_set_progress(anim_timeline, 50000);
72     lv_refr_now(NULL);
73     TEST_ASSERT_EQUAL(533, lv_obj_get_x(obj));
74 
75     lv_anim_timeline_set_progress(anim_timeline, 60000);
76     lv_refr_now(NULL);
77     TEST_ASSERT_EQUAL(639, lv_obj_get_x(obj));
78 
79     lv_anim_timeline_set_progress(anim_timeline, 32768);
80     lv_refr_now(NULL);
81     TEST_ASSERT_EQUAL(350, lv_obj_get_x(obj));
82 
83     lv_anim_timeline_set_progress(anim_timeline, 65535);
84     lv_refr_now(NULL);
85     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
86 
87 }
88 
test_anim_timeline_progress_2(void)89 void test_anim_timeline_progress_2(void)
90 {
91     lv_obj_t * obj = lv_obj_create(lv_screen_active());
92     lv_obj_set_size(obj, 100, 100);
93     lv_anim_t a1;
94     lv_anim_init(&a1);
95     lv_anim_set_exec_cb(&a1, (lv_anim_exec_xcb_t)lv_obj_set_x);
96     lv_anim_set_var(&a1, obj);
97     lv_anim_set_values(&a1, 0, 700);
98     lv_anim_set_duration(&a1, 1000);
99 
100     lv_anim_t a2;
101     lv_anim_init(&a2);
102     lv_anim_set_exec_cb(&a2, (lv_anim_exec_xcb_t)lv_obj_set_y);
103     lv_anim_set_var(&a2, obj);
104     lv_anim_set_values(&a2, 0, 300);
105     lv_anim_set_duration(&a2, 1000);
106 
107     /*
108      *   |------X------|
109      *          |------Y------|
110      *   0     500    1000   1500 ms
111      *   0     21845  43690  65535 progress
112      */
113 
114     anim_timeline = lv_anim_timeline_create();
115     lv_anim_timeline_add(anim_timeline, 0, &a1);
116     lv_anim_timeline_add(anim_timeline, 500, &a2);
117 
118     lv_anim_timeline_set_progress(anim_timeline, 0);
119     lv_refr_now(NULL);
120     TEST_ASSERT_EQUAL(0, lv_obj_get_x(obj));
121 
122     lv_anim_timeline_set_progress(anim_timeline, 65535);
123     lv_refr_now(NULL);
124     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
125     TEST_ASSERT_EQUAL(300, lv_obj_get_y(obj));
126 
127     lv_anim_timeline_set_progress(anim_timeline, 10000);
128     lv_refr_now(NULL);
129     TEST_ASSERT_EQUAL(159, lv_obj_get_x(obj));
130     TEST_ASSERT_EQUAL(0, lv_obj_get_y(obj));
131 
132     lv_anim_timeline_set_progress(anim_timeline, 21845);
133     lv_refr_now(NULL);
134     TEST_ASSERT_EQUAL(350, lv_obj_get_x(obj));
135     TEST_ASSERT_EQUAL(0, lv_obj_get_y(obj));
136 
137     lv_anim_timeline_set_progress(anim_timeline, 32768);
138     lv_refr_now(NULL);
139     TEST_ASSERT_EQUAL(525, lv_obj_get_x(obj));
140     TEST_ASSERT_EQUAL(75, lv_obj_get_y(obj));
141 
142     lv_anim_timeline_set_progress(anim_timeline, 43690);
143     lv_refr_now(NULL);
144     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
145     TEST_ASSERT_EQUAL(150, lv_obj_get_y(obj));
146 
147     lv_anim_timeline_set_progress(anim_timeline, 65535);
148     lv_refr_now(NULL);
149     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
150     TEST_ASSERT_EQUAL(300, lv_obj_get_y(obj));
151 }
152 
test_anim_timeline_start(void)153 void test_anim_timeline_start(void)
154 {
155     lv_obj_t * obj = lv_obj_create(lv_screen_active());
156     lv_obj_set_size(obj, 100, 100);
157 
158     lv_obj_set_pos(obj, 70, 70);
159 
160     /*
161      *       |------1------|
162      *                             |-----Y-----|
163      *                                   |--------Z--------|
164      *   0  200           1000   1500   2000  2500        3500    ms
165      *   ?  50            100     200   400               700     value (px)
166      */
167 
168     anim_timeline = lv_anim_timeline_create();
169 
170     lv_anim_t a1;
171     lv_anim_init(&a1);
172     lv_anim_set_exec_cb(&a1, (lv_anim_exec_xcb_t)lv_obj_set_x);
173     lv_anim_set_var(&a1, obj);
174     lv_anim_set_values(&a1, 50, 100);
175     lv_anim_set_duration(&a1, 800);
176     lv_anim_set_early_apply(&a1, false);
177     lv_anim_timeline_add(anim_timeline, 200, &a1);
178 
179     lv_anim_set_values(&a1, 200, 300);
180     lv_anim_set_duration(&a1, 1000);
181     lv_anim_timeline_add(anim_timeline, 1500, &a1);
182 
183     /*Overlap with the previous*/
184     lv_anim_set_values(&a1, 400, 700);
185     lv_anim_set_duration(&a1, 1500);
186     lv_anim_timeline_add(anim_timeline, 2000, &a1);
187 
188     lv_anim_timeline_start(anim_timeline);
189 
190     /*As doesn't start at the beginning keep the original value*/
191     lv_refr_now(NULL);
192     TEST_ASSERT_EQUAL(70, lv_obj_get_x(obj));
193 
194     lv_test_wait(199);
195     TEST_ASSERT_EQUAL(70, lv_obj_get_x(obj));
196 
197     lv_test_wait(1);  /*200*/
198     TEST_ASSERT_EQUAL(50, lv_obj_get_x(obj));
199 
200     lv_test_wait(400);  /*600*/
201     TEST_ASSERT_EQUAL(75, lv_obj_get_x(obj));
202 
203     lv_test_wait(400);  /*1000*/
204     TEST_ASSERT_EQUAL(100, lv_obj_get_x(obj));
205 
206     /*There is a gap*/
207     lv_test_wait(100);  /*1100*/
208     TEST_ASSERT_EQUAL(100, lv_obj_get_x(obj));
209 
210     /*Should change it*/
211     lv_obj_set_x(obj, 10);
212 
213     lv_test_wait(100);  /*1200*/
214     TEST_ASSERT_EQUAL(100, lv_obj_get_x(obj));
215 
216     lv_test_wait(300);  /*1500*/
217     TEST_ASSERT_EQUAL(200, lv_obj_get_x(obj));
218 
219     lv_test_wait(499);  /*1999*/
220     TEST_ASSERT_EQUAL(249, lv_obj_get_x(obj));
221 
222     lv_test_wait(1);    /*2000*/
223     TEST_ASSERT_EQUAL(400, lv_obj_get_x(obj));
224 
225     lv_test_wait(500);    /*2500*/
226     TEST_ASSERT_EQUAL(499, lv_obj_get_x(obj));
227 
228     lv_test_wait(500);    /*3000*/
229     TEST_ASSERT_EQUAL(599, lv_obj_get_x(obj));
230 
231     lv_test_wait(500);    /*3500*/
232     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
233 
234     lv_test_wait(500);    /*3500*/
235     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
236 
237     /*Nothing should change it*/
238     lv_obj_set_x(obj, 20);
239 
240     lv_test_wait(100);    /*3600*/
241     TEST_ASSERT_EQUAL(20, lv_obj_get_x(obj));
242 }
243 
test_anim_timeline_reverse(void)244 void test_anim_timeline_reverse(void)
245 {
246     lv_obj_t * obj = lv_obj_create(lv_screen_active());
247     lv_obj_set_size(obj, 100, 100);
248 
249     lv_obj_set_pos(obj, 70, 70);
250 
251     /* Reverse this:
252      *       |------1------|
253      *                             |-----Y-----|
254      *                                   |--------Z--------|
255      *   0  200           1000   1500   2000  2500        3500    ms
256      *   ?  50            100     200         300         700     value (px)
257      */
258 
259     anim_timeline = lv_anim_timeline_create();
260     lv_anim_timeline_set_reverse(anim_timeline, true);
261 
262     lv_anim_t a1;
263     lv_anim_init(&a1);
264     lv_anim_set_exec_cb(&a1, (lv_anim_exec_xcb_t)lv_obj_set_x);
265     lv_anim_set_var(&a1, obj);
266     lv_anim_set_values(&a1, 50, 100);
267     lv_anim_set_duration(&a1, 800);
268     lv_anim_set_early_apply(&a1, false);
269     lv_anim_timeline_add(anim_timeline, 200, &a1);
270 
271     lv_anim_set_values(&a1, 200, 300);
272     lv_anim_set_duration(&a1, 1000);
273     lv_anim_timeline_add(anim_timeline, 1500, &a1);
274 
275     /*Overlap with the previous*/
276     lv_anim_set_values(&a1, 400, 700);
277     lv_anim_set_duration(&a1, 1500);
278     lv_anim_timeline_add(anim_timeline, 2000, &a1);
279 
280     lv_anim_timeline_set_progress(anim_timeline, LV_ANIM_TIMELINE_PROGRESS_MAX);
281     lv_anim_timeline_start(anim_timeline);    /*0 (3500)*/
282 
283     lv_refr_now(NULL);
284     TEST_ASSERT_EQUAL(700, lv_obj_get_x(obj));
285 
286     lv_test_wait(999);                   /*999 (2501)*/
287     TEST_ASSERT_EQUAL(500, lv_obj_get_x(obj));
288 
289     lv_test_wait(201);                   /*1200 (2300)*/
290     TEST_ASSERT_EQUAL(459, lv_obj_get_x(obj));
291 
292     lv_test_wait(300);                   /*1500 (2000)*/
293     TEST_ASSERT_EQUAL(400, lv_obj_get_x(obj));
294 
295     lv_test_wait(500);                    /*2000 (1500)*/
296     TEST_ASSERT_EQUAL(200, lv_obj_get_x(obj));
297 
298     /*There is a gap*/
299     lv_test_wait(100);                    /*2100 (1400)*/
300     TEST_ASSERT_EQUAL(100, lv_obj_get_x(obj));
301 
302     /*Should change it*/
303     lv_obj_set_x(obj, 10);
304 
305     lv_test_wait(100);                    /*2200 (1300)*/
306     TEST_ASSERT_EQUAL(100, lv_obj_get_x(obj));
307 
308     lv_test_wait(300);                    /*2500 (1000)*/
309     TEST_ASSERT_EQUAL(100, lv_obj_get_x(obj));
310 
311     lv_test_wait(400);                    /*2900 (600)*/
312     TEST_ASSERT_EQUAL(75, lv_obj_get_x(obj));
313 
314     lv_test_wait(400);                    /*3300 (200)*/
315     TEST_ASSERT_EQUAL(50, lv_obj_get_x(obj));
316 
317     /*There is a gap*/
318     lv_test_wait(100);                    /*3400 (100)*/
319     TEST_ASSERT_EQUAL(50, lv_obj_get_x(obj));
320 
321     /*Nothing should change it*/
322     lv_obj_set_x(obj, 20);
323     lv_test_wait(100);
324     TEST_ASSERT_EQUAL(20, lv_obj_get_x(obj));
325 
326     lv_test_wait(1000);
327     TEST_ASSERT_EQUAL(20, lv_obj_get_x(obj));
328 }
329 
test_anim_timeline_repeat(void)330 void test_anim_timeline_repeat(void)
331 {
332     lv_obj_t * obj = lv_obj_create(lv_screen_active());
333     lv_obj_set_size(obj, 100, 100);
334     lv_obj_set_pos(obj, 30, 40);
335 
336     lv_anim_t a1;
337     lv_anim_init(&a1);
338     lv_anim_set_exec_cb(&a1, (lv_anim_exec_xcb_t)lv_obj_set_x);
339     lv_anim_set_var(&a1, obj);
340     lv_anim_set_values(&a1, 0, 1000);
341     lv_anim_set_duration(&a1, 1000);
342 
343     anim_timeline = lv_anim_timeline_create();
344     TEST_ASSERT_NOT_NULL(anim_timeline);
345 
346     lv_anim_timeline_add(anim_timeline, 0, &a1);
347     lv_anim_timeline_set_repeat_count(anim_timeline, 3);
348     lv_anim_timeline_set_repeat_delay(anim_timeline, 1);
349     lv_anim_timeline_start(anim_timeline);
350 
351     lv_refr_now(NULL);
352 
353     TEST_ASSERT_EQUAL(1, lv_anim_timeline_get_repeat_delay(anim_timeline));
354     TEST_ASSERT_EQUAL(1000, lv_anim_timeline_get_playtime(anim_timeline));
355 
356     lv_test_wait(100);
357     TEST_ASSERT_EQUAL(99, lv_obj_get_x(obj));
358 
359     lv_test_wait(500);
360     TEST_ASSERT_EQUAL(599, lv_obj_get_x(obj));
361 
362     lv_test_wait(400);
363     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
364 
365     lv_test_wait(1);
366     TEST_ASSERT_EQUAL(0, lv_obj_get_x(obj));
367 
368     lv_test_wait(500);
369     TEST_ASSERT_EQUAL(500, lv_obj_get_x(obj));
370 
371     lv_test_wait(500);
372     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
373 
374     lv_test_wait(701);
375     TEST_ASSERT_EQUAL(699, lv_obj_get_x(obj));
376 
377     lv_test_wait(1000);
378     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
379 
380     lv_test_wait(1000);
381     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
382 
383 }
384 
385 
test_anim_timeline_delay(void)386 void test_anim_timeline_delay(void)
387 {
388 
389     lv_obj_t * obj = lv_obj_create(lv_screen_active());
390     lv_obj_set_size(obj, 100, 100);
391     lv_obj_set_pos(obj, 30, 40);
392 
393     lv_anim_t a1;
394     lv_anim_init(&a1);
395     lv_anim_set_exec_cb(&a1, (lv_anim_exec_xcb_t)lv_obj_set_x);
396     lv_anim_set_var(&a1, obj);
397     lv_anim_set_values(&a1, 0, 1000);
398     lv_anim_set_duration(&a1, 1000);
399 
400     anim_timeline = lv_anim_timeline_create();
401     TEST_ASSERT_NOT_NULL(anim_timeline);
402 
403     lv_anim_timeline_add(anim_timeline, 0, &a1);
404     lv_anim_timeline_set_repeat_count(anim_timeline, 3);
405     lv_anim_timeline_set_repeat_delay(anim_timeline, 1000);
406     lv_anim_timeline_start(anim_timeline);
407 
408     lv_refr_now(NULL);
409 
410     TEST_ASSERT_EQUAL(1000, lv_anim_timeline_get_repeat_delay(anim_timeline));
411     TEST_ASSERT_EQUAL(1000, lv_anim_timeline_get_playtime(anim_timeline));
412 
413     lv_test_wait(100);
414     TEST_ASSERT_EQUAL(99, lv_obj_get_x(obj));
415 
416     lv_test_wait(500);
417     TEST_ASSERT_EQUAL(599, lv_obj_get_x(obj));
418 
419     lv_test_wait(400);
420     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
421 
422     lv_test_wait(1000);
423     TEST_ASSERT_EQUAL(0, lv_obj_get_x(obj));
424 
425     lv_test_wait(500);
426     TEST_ASSERT_EQUAL(500, lv_obj_get_x(obj));
427 
428     lv_test_wait(500);
429     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
430 
431     lv_test_wait(1700);
432     TEST_ASSERT_EQUAL(699, lv_obj_get_x(obj));
433 
434     lv_test_wait(1000);
435     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
436 
437     lv_test_wait(1000);
438     TEST_ASSERT_EQUAL(1000, lv_obj_get_x(obj));
439 
440 }
441 
anim1_exec_cb(void * var,int32_t v)442 void anim1_exec_cb(void * var, int32_t v)
443 {
444     LV_UNUSED(var);
445     LV_UNUSED(v);
446 }
anim1_start(lv_anim_t * a)447 void anim1_start(lv_anim_t * a)
448 {
449     LV_UNUSED(a);
450     anim1_start_called++;
451 }
anim1_completed(lv_anim_t * a)452 void anim1_completed(lv_anim_t * a)
453 {
454     LV_UNUSED(a);
455     anim1_completed_called++;
456 }
457 
anim2_exec_cb(void * var,int32_t v)458 void anim2_exec_cb(void * var, int32_t v)
459 {
460     LV_UNUSED(var);
461     LV_UNUSED(v);
462 }
anim2_start(lv_anim_t * a)463 void anim2_start(lv_anim_t * a)
464 {
465     LV_UNUSED(a);
466     anim2_start_called++;
467 }
anim2_completed(lv_anim_t * a)468 void anim2_completed(lv_anim_t * a)
469 {
470     LV_UNUSED(a);
471     anim2_completed_called++;
472 }
473 
test_anim_timeline_with_anim_start_cb_and_completed_cb(void)474 void test_anim_timeline_with_anim_start_cb_and_completed_cb(void)
475 {
476     lv_anim_t anim1;
477     lv_anim_t anim2;
478 
479     lv_anim_init(&anim1);
480     lv_anim_set_values(&anim1, 0, 1024);
481     lv_anim_set_duration(&anim1, 300);
482     lv_anim_set_exec_cb(&anim1, anim1_exec_cb);
483     lv_anim_set_start_cb(&anim1, anim1_start);
484     lv_anim_set_completed_cb(&anim1, anim1_completed);
485     anim1_start_called = 0;
486     anim1_completed_called = 0;
487 
488     lv_memcpy(&anim2, &anim1, sizeof(anim1));
489     lv_anim_set_duration(&anim2, 300);
490     lv_anim_set_path_cb(&anim2, lv_anim_path_overshoot);
491     lv_anim_set_exec_cb(&anim2, anim2_exec_cb);
492     lv_anim_set_start_cb(&anim2, anim2_start);
493     lv_anim_set_completed_cb(&anim2, anim2_completed);
494     anim2_start_called = 0;
495     anim2_completed_called = 0;
496 
497     anim_timeline = lv_anim_timeline_create();
498     lv_anim_timeline_add(anim_timeline,   0, &anim1);
499     lv_anim_timeline_add(anim_timeline, 200, &anim2);
500     lv_anim_timeline_set_progress(anim_timeline, 0);
501     lv_anim_timeline_start(anim_timeline);
502 
503     lv_refr_now(NULL);
504 
505     /*                              |----- Reverse ------|
506      *   |-----anim1-----|                 |--anim1 rvs--|
507      *           |----anim2----|    |--anim2 rvs--|
508      *
509      *   0       200   300    500   600    800  900     1100
510      */
511 
512     lv_test_wait(20); /*Wait 20 ms*/
513     TEST_ASSERT_EQUAL(1, anim1_start_called);
514     TEST_ASSERT_EQUAL(0, anim1_completed_called);
515     TEST_ASSERT_EQUAL(0, anim2_start_called);
516     TEST_ASSERT_EQUAL(0, anim2_completed_called);
517 
518     lv_test_wait(200); /*Now we are at 220ms */
519     TEST_ASSERT_EQUAL(1, anim1_start_called);
520     TEST_ASSERT_EQUAL(0, anim1_completed_called);
521     TEST_ASSERT_EQUAL(1, anim2_start_called);
522     TEST_ASSERT_EQUAL(0, anim2_completed_called);
523 
524     lv_test_wait(100); /*Now we are at 320ms */
525     TEST_ASSERT_EQUAL(1, anim1_start_called);
526     TEST_ASSERT_EQUAL(1, anim1_completed_called);
527     TEST_ASSERT_EQUAL(1, anim2_start_called);
528     TEST_ASSERT_EQUAL(0, anim2_completed_called);
529 
530     lv_test_wait(200); /*Now we are at 520ms */
531     TEST_ASSERT_EQUAL(1, anim1_start_called);
532     TEST_ASSERT_EQUAL(1, anim1_completed_called);
533     TEST_ASSERT_EQUAL(1, anim2_start_called);
534     TEST_ASSERT_EQUAL(1, anim2_completed_called);
535 
536     lv_test_wait(80); /*Now we are at 600ms */
537     anim1_start_called = 0;
538     anim1_completed_called = 0;
539     anim2_start_called = 0;
540     anim2_completed_called = 0;
541 
542     lv_anim_timeline_set_reverse(anim_timeline, true);
543     lv_anim_timeline_set_progress(anim_timeline, LV_ANIM_TIMELINE_PROGRESS_MAX);
544     lv_anim_timeline_start(anim_timeline);
545 
546     lv_test_wait(20); /*Now we are at 620ms */
547     TEST_ASSERT_EQUAL(0, anim1_start_called);
548     TEST_ASSERT_EQUAL(0, anim1_completed_called);
549     TEST_ASSERT_EQUAL(1, anim2_start_called);
550     TEST_ASSERT_EQUAL(0, anim2_completed_called);
551 
552     lv_test_wait(200); /*Now we are at 820ms */
553     TEST_ASSERT_EQUAL(1, anim1_start_called);
554     TEST_ASSERT_EQUAL(0, anim1_completed_called);
555     TEST_ASSERT_EQUAL(1, anim2_start_called);
556     TEST_ASSERT_EQUAL(0, anim2_completed_called);
557 
558     lv_test_wait(100); /*Now we are at 920ms */
559     TEST_ASSERT_EQUAL(1, anim1_start_called);
560     TEST_ASSERT_EQUAL(0, anim1_completed_called);
561     TEST_ASSERT_EQUAL(1, anim2_start_called);
562     TEST_ASSERT_EQUAL(1, anim2_completed_called);
563 
564     lv_test_wait(200); /*Now we are at 1120ms */
565     TEST_ASSERT_EQUAL(1, anim1_start_called);
566     TEST_ASSERT_EQUAL(1, anim1_completed_called);
567     TEST_ASSERT_EQUAL(1, anim2_start_called);
568     TEST_ASSERT_EQUAL(1, anim2_completed_called);
569 }
570 
test_anim_timeline_without_exec_cb_but_anim_start_cb_and_completed_cb(void)571 void test_anim_timeline_without_exec_cb_but_anim_start_cb_and_completed_cb(void)
572 {
573     lv_anim_t anim1;
574 
575     lv_anim_init(&anim1);
576     lv_anim_set_values(&anim1, 0, 1024);
577     lv_anim_set_duration(&anim1, 300);
578     lv_anim_set_exec_cb(&anim1, anim1_exec_cb);
579     lv_anim_set_start_cb(&anim1, anim1_start);
580     lv_anim_set_completed_cb(&anim1, anim1_completed);
581     anim1_start_called = 0;
582     anim1_completed_called = 0;
583 
584     anim_timeline = lv_anim_timeline_create();
585     lv_anim_timeline_add(anim_timeline, 200, &anim1);
586     lv_anim_timeline_set_progress(anim_timeline, 0);
587     lv_anim_timeline_start(anim_timeline);
588 
589     lv_refr_now(NULL);
590 
591     /*
592      *           |----anim1----|
593      *
594      *   0       200   300    500
595      */
596 
597     lv_test_wait(20); /*Wait 20 ms*/
598     TEST_ASSERT_EQUAL(0, anim1_start_called);
599     TEST_ASSERT_EQUAL(0, anim1_completed_called);
600 
601     lv_test_wait(200); /*Now we are at 220ms */
602     TEST_ASSERT_EQUAL(1, anim1_start_called);
603     TEST_ASSERT_EQUAL(0, anim1_completed_called);
604 
605     lv_test_wait(300); /*Now we are at 520ms */
606     TEST_ASSERT_EQUAL(1, anim1_start_called);
607     TEST_ASSERT_EQUAL(1, anim1_completed_called);
608 }
609 
610 #endif
611