1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 #include <string.h>
7 
8 static const char * long_text =
9     "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras malesuada ultrices magna in rutrum.";
10 static const char * long_text_multiline =
11     "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit.\nCras malesuada ultrices magna in rutrum.\n";
12 static const char * empty_text = "";
13 
14 static lv_obj_t * active_screen = NULL;
15 static lv_obj_t * label;
16 static lv_obj_t * long_label;
17 static lv_obj_t * long_label_multiline;
18 static lv_obj_t * empty_label;
19 
setUp(void)20 void setUp(void)
21 {
22     active_screen = lv_screen_active();
23     label = lv_label_create(active_screen);
24     long_label = lv_label_create(active_screen);
25     long_label_multiline = lv_label_create(active_screen);
26     empty_label = lv_label_create(active_screen);
27 
28     lv_label_set_text(long_label, long_text);
29     lv_label_set_text(long_label_multiline, long_text_multiline);
30     lv_label_set_text(empty_label, empty_text);
31 }
32 
tearDown(void)33 void tearDown(void)
34 {
35     lv_obj_clean(lv_screen_active());
36 }
37 
test_label_creation(void)38 void test_label_creation(void)
39 {
40     TEST_ASSERT_EQUAL_STRING(lv_label_get_text(label), LV_LABEL_DEFAULT_TEXT);
41     TEST_ASSERT_EQUAL(lv_label_get_long_mode(label), LV_LABEL_LONG_MODE_WRAP);
42 }
43 
test_label_set_text(void)44 void test_label_set_text(void)
45 {
46     const char * new_text = "Hello world";
47 
48     /* Refresh with the current text. */
49     lv_label_set_text(label, NULL);
50     TEST_ASSERT_EQUAL_STRING(lv_label_get_text(label), LV_LABEL_DEFAULT_TEXT);
51 
52     /* '\0' terminated character string to set new text. */
53     lv_label_set_text(label, new_text);
54     TEST_ASSERT_EQUAL_STRING(lv_label_get_text(label), new_text);
55 }
56 
test_label_get_letter_pos_align_left(void)57 void test_label_get_letter_pos_align_left(void)
58 {
59     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME);
60     lv_point_t first_letter_point;
61     lv_point_t last_letter_point;
62     const lv_point_t expected_first_letter_point = {
63         .x = 0,
64         .y = 0
65     };
66     const lv_point_t expected_last_letter_point = {
67         .x = 29,
68         .y = 0
69     };
70 
71     const uint32_t first_letter_idx = 0;
72     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label_multiline)) - 1; /* char index starts at 0 */
73 
74     lv_label_get_letter_pos(label, first_letter_idx, &first_letter_point);
75 
76     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
77     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
78 
79     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
80 
81     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
82     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
83 }
84 
test_label_get_letter_pos_align_left_on_empty_text(void)85 void test_label_get_letter_pos_align_left_on_empty_text(void)
86 {
87     lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME);
88     lv_point_t first_letter_point;
89     lv_point_t last_letter_point;
90     const lv_point_t expected_first_letter_point = {
91         .x = 0,
92         .y = 0
93     };
94     const lv_point_t expected_last_letter_point = {
95         .x = 0,
96         .y = 0
97     };
98 
99     const uint32_t first_letter_idx = 0;
100     const uint32_t last_letter_idx = strlen(lv_label_get_text(empty_label)) - 1;
101 
102     lv_label_get_letter_pos(empty_label, first_letter_idx, &first_letter_point);
103 
104     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
105     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
106 
107     lv_label_get_letter_pos(empty_label, last_letter_idx, &last_letter_point);
108 
109     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
110     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
111 }
112 
test_label_long_text_multiline_get_letter_pos_align_left(void)113 void test_label_long_text_multiline_get_letter_pos_align_left(void)
114 {
115     lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME);
116     lv_point_t first_letter_point;
117     lv_point_t last_letter_point;
118     lv_point_t last_letter_after_new_line_point;
119     const lv_point_t expected_first_letter_point = {
120         .x = 0,
121         .y = 0
122     };
123     const lv_point_t expected_last_letter_point = {
124         .x = 305,
125         .y = 32
126     };
127     const lv_point_t expected_last_letter_after_new_line_point = {
128         .x = 0,
129         .y = 48
130     };
131 
132     const uint32_t first_letter_idx = 0;
133     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label_multiline)) - 1; /* char index starts at 0 */
134     const uint32_t last_letter_after_new_line = strlen(lv_label_get_text(long_label_multiline));
135 
136     lv_label_get_letter_pos(long_label_multiline, first_letter_idx, &first_letter_point);
137 
138     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
139     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
140 
141     lv_label_get_letter_pos(long_label_multiline, last_letter_idx, &last_letter_point);
142 
143     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
144     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
145 
146     lv_label_get_letter_pos(long_label_multiline, last_letter_after_new_line, &last_letter_after_new_line_point);
147 
148     TEST_ASSERT_EQUAL(expected_last_letter_after_new_line_point.x, last_letter_after_new_line_point.x);
149     TEST_ASSERT_EQUAL(expected_last_letter_after_new_line_point.y, last_letter_after_new_line_point.y);
150 }
151 
test_label_long_text_get_letter_pos_align_left(void)152 void test_label_long_text_get_letter_pos_align_left(void)
153 {
154     lv_label_set_long_mode(long_label, LV_LABEL_LONG_MODE_WRAP);
155     lv_obj_set_width(long_label, 150);
156     lv_obj_set_height(long_label, 500);
157     lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME);
158 
159     lv_point_t first_letter_point;
160     lv_point_t last_letter_point;
161     const lv_point_t expected_first_letter_point = {
162         .x = 0,
163         .y = 0
164     };
165     const lv_point_t expected_last_letter_point = {
166         .x = 0,
167         .y = 1536
168     };
169 
170     const uint32_t first_letter_idx = 0;
171     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label)) - 1; /* char index starts at 0 */
172 
173     lv_label_get_letter_pos(long_label, first_letter_idx, &first_letter_point);
174 
175     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
176     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
177 
178     lv_label_get_letter_pos(long_label, last_letter_idx, &last_letter_point);
179 
180     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
181     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
182 }
183 
test_label_get_letter_pos_align_right(void)184 void test_label_get_letter_pos_align_right(void)
185 {
186     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME);
187     lv_point_t first_letter_point;
188     lv_point_t last_letter_point;
189     const lv_point_t expected_first_letter_point = {
190         .x = -29,
191         .y = 0
192     };
193     const lv_point_t expected_last_letter_point = {
194         .x = 0,
195         .y = 0
196     };
197 
198     const uint32_t first_letter_idx = 0;
199     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label_multiline)) - 1; /* char index starts at 0 */
200 
201     lv_label_get_letter_pos(label, first_letter_idx, &first_letter_point);
202 
203     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
204     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
205 
206     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
207 
208     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
209     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
210 }
211 
test_label_get_letter_pos_align_right_on_empty_text(void)212 void test_label_get_letter_pos_align_right_on_empty_text(void)
213 {
214     lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME);
215     lv_point_t first_letter_point;
216     lv_point_t last_letter_point;
217     const lv_point_t expected_first_letter_point = {
218         .x = 0,
219         .y = 0
220     };
221     const lv_point_t expected_last_letter_point = {
222         .x = 0,
223         .y = 0
224     };
225 
226     const uint32_t first_letter_idx = 0;
227     const uint32_t last_letter_idx = strlen(lv_label_get_text(empty_label)) - 1;
228 
229     lv_label_get_letter_pos(empty_label, first_letter_idx, &first_letter_point);
230 
231     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
232     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
233 
234     lv_label_get_letter_pos(empty_label, last_letter_idx, &last_letter_point);
235 
236     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
237     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
238 }
239 
test_label_long_text_multiline_get_letter_pos_align_right(void)240 void test_label_long_text_multiline_get_letter_pos_align_right(void)
241 {
242     lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME);
243     lv_point_t first_letter_point;
244     lv_point_t last_letter_point;
245     lv_point_t last_letter_after_new_line_point;
246     const lv_point_t expected_first_letter_point = {
247         .x = -205,
248         .y = 0
249     };
250     const lv_point_t expected_last_letter_point = {
251         .x = 0,
252         .y = 32
253     };
254     const lv_point_t expected_last_letter_after_new_line_point = {
255         .x = 0,
256         .y = 48
257     };
258 
259     const uint32_t first_letter_idx = 0;
260     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label_multiline)) - 1; /* char index starts at 0 */
261     const uint32_t last_letter_after_new_line = strlen(lv_label_get_text(long_label_multiline));
262 
263     lv_label_get_letter_pos(long_label_multiline, first_letter_idx, &first_letter_point);
264 
265     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
266     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
267 
268     lv_label_get_letter_pos(long_label_multiline, last_letter_idx, &last_letter_point);
269 
270     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
271     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
272 
273     lv_label_get_letter_pos(long_label_multiline, last_letter_after_new_line, &last_letter_after_new_line_point);
274 
275     TEST_ASSERT_EQUAL(expected_last_letter_after_new_line_point.x, last_letter_after_new_line_point.x);
276     TEST_ASSERT_EQUAL(expected_last_letter_after_new_line_point.y, last_letter_after_new_line_point.y);
277 }
278 
test_label_long_text_get_letter_pos_align_right(void)279 void test_label_long_text_get_letter_pos_align_right(void)
280 {
281     lv_label_set_long_mode(long_label, LV_LABEL_LONG_MODE_WRAP);
282     lv_obj_set_width(long_label, 150);
283     lv_obj_set_height(long_label, 500);
284     lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME);
285 
286     lv_point_t first_letter_point;
287     lv_point_t last_letter_point;
288     const lv_point_t expected_first_letter_point = {
289         .x = -8,
290         .y = 0
291     };
292     const lv_point_t expected_last_letter_point = {
293         .x = -3,
294         .y = 1536
295     };
296 
297     const uint32_t first_letter_idx = 0;
298     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label)) - 1; /* char index starts at 0 */
299 
300     lv_label_get_letter_pos(long_label, first_letter_idx, &first_letter_point);
301 
302     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
303     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
304 
305     lv_label_get_letter_pos(long_label, last_letter_idx, &last_letter_point);
306 
307     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
308     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
309 }
310 
test_label_get_letter_pos_align_center(void)311 void test_label_get_letter_pos_align_center(void)
312 {
313     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME);
314     lv_point_t first_letter_point;
315     lv_point_t last_letter_point;
316     const lv_point_t expected_first_letter_point = {
317         .x = -14,
318         .y = 0
319     };
320     const lv_point_t expected_last_letter_point = {
321         .x = 15,
322         .y = 0
323     };
324 
325     const uint32_t first_letter_idx = 0;
326     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label_multiline)) - 1; /* char index starts at 0 */
327 
328     lv_label_get_letter_pos(label, first_letter_idx, &first_letter_point);
329 
330     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
331     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
332 
333     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
334 
335     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
336     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
337 }
338 
test_label_get_letter_pos_align_center_on_empty_text(void)339 void test_label_get_letter_pos_align_center_on_empty_text(void)
340 {
341     lv_obj_set_style_text_align(empty_label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME);
342     lv_point_t first_letter_point;
343     lv_point_t last_letter_point;
344     const lv_point_t expected_first_letter_point = {
345         .x = 0,
346         .y = 0
347     };
348     const lv_point_t expected_last_letter_point = {
349         .x = 0,
350         .y = 0
351     };
352 
353     const uint32_t first_letter_idx = 0;
354     const uint32_t last_letter_idx = strlen(lv_label_get_text(empty_label)) - 1;
355 
356     lv_label_get_letter_pos(empty_label, first_letter_idx, &first_letter_point);
357 
358     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
359     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
360 
361     lv_label_get_letter_pos(empty_label, last_letter_idx, &last_letter_point);
362 
363     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
364     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
365 }
366 
test_label_long_text_multiline_get_letter_pos_align_center(void)367 void test_label_long_text_multiline_get_letter_pos_align_center(void)
368 {
369     lv_obj_set_style_text_align(long_label_multiline, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME);
370     lv_point_t first_letter_point;
371     lv_point_t last_letter_point;
372     lv_point_t last_letter_after_new_line_point;
373     const lv_point_t expected_first_letter_point = {
374         .x = -102,
375         .y = 0
376     };
377     const lv_point_t expected_last_letter_point = {
378         .x = 153,
379         .y = 32
380     };
381     const lv_point_t expected_last_letter_after_new_line_point = {
382         .x = 0,
383         .y = 48
384     };
385 
386     const uint32_t first_letter_idx = 0;
387     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label_multiline)) - 1; /* char index starts at 0 */
388     const uint32_t last_letter_after_new_line = strlen(lv_label_get_text(long_label_multiline));
389 
390     lv_label_get_letter_pos(long_label_multiline, first_letter_idx, &first_letter_point);
391 
392     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
393     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
394 
395     lv_label_get_letter_pos(long_label_multiline, last_letter_idx, &last_letter_point);
396 
397     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
398     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
399 
400     lv_label_get_letter_pos(long_label_multiline, last_letter_after_new_line, &last_letter_after_new_line_point);
401 
402     TEST_ASSERT_EQUAL(expected_last_letter_after_new_line_point.x, last_letter_after_new_line_point.x);
403     TEST_ASSERT_EQUAL(expected_last_letter_after_new_line_point.y, last_letter_after_new_line_point.y);
404 }
405 
test_label_long_text_get_letter_pos_align_center(void)406 void test_label_long_text_get_letter_pos_align_center(void)
407 {
408     lv_label_set_long_mode(long_label, LV_LABEL_LONG_MODE_WRAP);
409     lv_obj_set_width(long_label, 150);
410     lv_obj_set_height(long_label, 500);
411     lv_obj_set_style_text_align(long_label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME);
412 
413     lv_point_t first_letter_point;
414     lv_point_t last_letter_point;
415     const lv_point_t expected_first_letter_point = {
416         .x = -4,
417         .y = 0
418     };
419     const lv_point_t expected_last_letter_point = {
420         .x = -1,
421         .y = 1536
422     };
423 
424     const uint32_t first_letter_idx = 0;
425     const uint32_t last_letter_idx = strlen(lv_label_get_text(long_label)) - 1; /* char index starts at 0 */
426 
427     lv_label_get_letter_pos(long_label, first_letter_idx, &first_letter_point);
428 
429     TEST_ASSERT_EQUAL(expected_first_letter_point.x, first_letter_point.x);
430     TEST_ASSERT_EQUAL(expected_first_letter_point.y, first_letter_point.y);
431 
432     lv_label_get_letter_pos(long_label, last_letter_idx, &last_letter_point);
433 
434     TEST_ASSERT_EQUAL(expected_last_letter_point.x, last_letter_point.x);
435     TEST_ASSERT_EQUAL(expected_last_letter_point.y, last_letter_point.y);
436 }
437 
test_label_is_char_under_pos_align_left(void)438 void test_label_is_char_under_pos_align_left(void)
439 {
440     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME);
441     bool expected_result = true;
442     bool result = false;
443     lv_point_t last_letter_point;
444 
445     /* Getting the last letter point */
446     const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1;
447     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
448 
449     /* We should get true, since we know the last letter is in this coordinate */
450     result = lv_label_is_char_under_pos(label, &last_letter_point);
451     TEST_ASSERT_EQUAL(expected_result, result);
452 
453     /* If we test a move away from the last letter then we should get false */
454     expected_result = false;
455     last_letter_point.x += 50;
456 
457     result = lv_label_is_char_under_pos(label, &last_letter_point);
458     TEST_ASSERT_EQUAL(expected_result, result);
459 }
460 
test_label_is_char_under_pos_align_right(void)461 void test_label_is_char_under_pos_align_right(void)
462 {
463     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME);
464     bool expected_result = true;
465     bool result = false;
466     lv_point_t last_letter_point;
467 
468     /* Getting the last letter point */
469     const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1;
470     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
471 
472     /* We should get true, since we know the last letter is in this coordinate */
473     result = lv_label_is_char_under_pos(label, &last_letter_point);
474     TEST_ASSERT_EQUAL(expected_result, result);
475 
476     /* If we test a move away from the last letter then we should get false */
477     expected_result = false;
478     last_letter_point.x -= 50;
479 
480     result = lv_label_is_char_under_pos(label, &last_letter_point);
481     TEST_ASSERT_EQUAL(expected_result, result);
482 }
483 
test_label_is_char_under_pos_align_center(void)484 void test_label_is_char_under_pos_align_center(void)
485 {
486     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME);
487     bool expected_result = true;
488     bool result = false;
489     lv_point_t last_letter_point;
490 
491     /* Getting the last letter point */
492     const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1;
493     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
494 
495     /* We should get true, since we know the last letter is in this coordinate */
496     result = lv_label_is_char_under_pos(label, &last_letter_point);
497     TEST_ASSERT_EQUAL(expected_result, result);
498 
499     /* If we test a move away from the last letter then we should get false */
500     expected_result = false;
501     last_letter_point.x -= 50;
502 
503     result = lv_label_is_char_under_pos(label, &last_letter_point);
504     TEST_ASSERT_EQUAL(expected_result, result);
505 }
506 
test_label_cut_text(void)507 void test_label_cut_text(void)
508 {
509     const char * expected_text = "Te";
510     /* label has the default text which is "Text", let's remove "xt" from it */
511     lv_label_cut_text(label, 2, 2);
512 
513     TEST_ASSERT_EQUAL_STRING(expected_text, lv_label_get_text(label));
514 }
515 
test_label_get_letter_on_left(void)516 void test_label_get_letter_on_left(void)
517 {
518     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, LV_STYLE_STATE_CMP_SAME);
519     lv_point_t last_letter_point;
520 
521     const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1;
522     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
523 
524     uint32_t letter_idx_result = lv_label_get_letter_on(label, &last_letter_point, true);
525 
526     TEST_ASSERT_EQUAL(last_letter_idx, letter_idx_result);
527 }
528 
test_label_get_letter_on_center(void)529 void test_label_get_letter_on_center(void)
530 {
531     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, LV_STYLE_STATE_CMP_SAME);
532     lv_point_t last_letter_point;
533 
534     const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1;
535     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
536 
537     uint32_t letter_idx_result = lv_label_get_letter_on(label, &last_letter_point, true);
538 
539     TEST_ASSERT_EQUAL(last_letter_idx, letter_idx_result);
540 }
541 
test_label_get_letter_on_right(void)542 void test_label_get_letter_on_right(void)
543 {
544     lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_RIGHT, LV_STYLE_STATE_CMP_SAME);
545     lv_point_t last_letter_point;
546 
547     const uint32_t last_letter_idx = strlen(lv_label_get_text(label)) - 1;
548     lv_label_get_letter_pos(label, last_letter_idx, &last_letter_point);
549 
550     uint32_t letter_idx_result = lv_label_get_letter_on(label, &last_letter_point, true);
551 
552     TEST_ASSERT_EQUAL(last_letter_idx, letter_idx_result);
553 }
554 
test_label_text_selection(void)555 void test_label_text_selection(void)
556 {
557     const uint32_t selection_start = 0;
558     const uint32_t selection_end = strlen(lv_label_get_text(label)) - 1;
559 
560     lv_label_set_text_selection_start(label, selection_start);
561     lv_label_set_text_selection_end(label, selection_end);
562 
563     uint32_t start = lv_label_get_text_selection_start(label);
564     uint32_t end = lv_label_get_text_selection_end(label);
565 
566     TEST_ASSERT_EQUAL(selection_start, start);
567     TEST_ASSERT_EQUAL(selection_end, end);
568 }
569 
test_label_rtl_dot_long_mode(void)570 void test_label_rtl_dot_long_mode(void)
571 {
572     const char * message =
573         "מעבד, או בשמו המלא יחידת עיבוד מרכזית (באנגלית: CPU - Central Processing Unit).";
574 
575     lv_obj_t * screen = lv_obj_create(lv_screen_active());
576     lv_obj_remove_style_all(screen);
577     lv_obj_set_size(screen, 800, 480);
578     lv_obj_center(screen);
579     lv_obj_set_style_bg_color(screen, lv_color_white(), 0);
580     lv_obj_set_style_bg_opa(screen, LV_OPA_100, 0);
581     lv_obj_set_style_pad_all(screen, 0, 0);
582 
583     lv_obj_t * test_label = lv_label_create(screen);
584     lv_obj_set_style_text_font(test_label, &lv_font_dejavu_16_persian_hebrew, 0);
585     lv_label_set_long_mode(test_label, LV_LABEL_LONG_MODE_DOTS);
586     lv_obj_set_style_base_dir(test_label, LV_BASE_DIR_RTL, 0);
587     lv_obj_set_size(test_label, 300, lv_font_dejavu_16_persian_hebrew.line_height);
588     lv_label_set_text(test_label, message);
589     lv_obj_center(test_label);
590 
591     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/label_rtl_dot_long_mode.png");
592 }
593 
test_label_max_width(void)594 void test_label_max_width(void)
595 {
596     lv_obj_clean(lv_screen_active());
597 
598     lv_obj_t * test_label1 = lv_label_create(lv_screen_active());
599     lv_label_set_text(test_label1, long_text);
600     lv_obj_set_width(test_label1, 600);
601     lv_obj_set_style_max_width(test_label1, 200, LV_PART_MAIN);
602     lv_obj_set_style_bg_color(test_label1, lv_palette_main(LV_PALETTE_GREY), LV_PART_MAIN);
603     lv_obj_set_style_bg_opa(test_label1, LV_OPA_100, LV_PART_MAIN);
604 
605     lv_obj_t * test_label2 = lv_label_create(lv_screen_active());
606     lv_label_set_text(test_label2, long_text);
607     lv_obj_set_width(test_label2, 600);
608     lv_obj_set_height(test_label2, 50);
609     lv_obj_set_x(test_label2, 300);
610     lv_obj_set_style_max_width(test_label2, 200, LV_PART_MAIN);
611     lv_obj_set_style_bg_color(test_label2, lv_palette_main(LV_PALETTE_GREY), LV_PART_MAIN);
612     lv_obj_set_style_bg_opa(test_label2, LV_OPA_100, LV_PART_MAIN);
613     lv_label_set_long_mode(test_label2, LV_LABEL_LONG_MODE_DOTS);
614 
615     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/label_max_width.png");
616 }
617 
test_label_with_recolor_cmd(void)618 void test_label_with_recolor_cmd(void)
619 {
620     lv_obj_clean(lv_screen_active());
621 
622     lv_obj_t * label_recolor = lv_label_create(lv_screen_active());
623     lv_label_set_text(label_recolor, "Write a #ff0000 red# word");
624     lv_label_set_recolor(label_recolor, true);
625 
626     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/label_recolor.png");
627 }
628 
scroll_next_step(lv_obj_t * label1,lv_obj_t * label2,const char * text1,const char * text2,uint32_t idx)629 static void scroll_next_step(lv_obj_t * label1, lv_obj_t * label2, const char * text1, const char * text2, uint32_t idx)
630 {
631     lv_label_set_text(label1, (idx % 2) == 0 ? text1 : text2);
632     lv_label_set_text(label2, (idx % 2) == 0 ? text1 : text2);
633     lv_test_wait(783); /*Use an odd delay*/
634 
635     char buf[128];
636     lv_snprintf(buf, sizeof(buf), "widgets/label_scroll_%d.png", idx);
637     TEST_ASSERT_EQUAL_SCREENSHOT(buf);
638 }
639 
test_label_scroll_mid_update(void)640 void test_label_scroll_mid_update(void)
641 {
642     lv_obj_clean(lv_screen_active());
643 
644     const char * text1 = "This is a long text that we will update while scrolling";
645     const char * text2 = "THIS IS A LONG TEXT THAT WE WILL UPDATE WHILE SCROLLING";
646 
647     lv_obj_t * label1 = lv_label_create(lv_screen_active());
648     lv_label_set_long_mode(label1, LV_LABEL_LONG_MODE_SCROLL);
649     lv_label_set_text(label1, text1),
650                       lv_obj_set_width(label1, 150);
651     lv_obj_set_pos(label1, 10, 10);
652 
653     lv_obj_t * label2 = lv_label_create(lv_screen_active());
654     lv_label_set_long_mode(label2, LV_LABEL_LONG_MODE_SCROLL_CIRCULAR);
655     lv_label_set_text(label2, text1),
656                       lv_obj_set_width(label2, 150);
657     lv_obj_set_pos(label2, 10, 80);
658 
659     uint32_t i;
660     for(i = 0; i < 15; i++) {
661         scroll_next_step(label1, label2, text1, text2, i);
662     }
663 
664 }
665 
666 #endif
667