1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 
7 static lv_obj_t * spangroup = NULL;
8 static lv_obj_t * active_screen = NULL;
9 
setUp(void)10 void setUp(void)
11 {
12     spangroup = lv_spangroup_create(NULL);
13 }
14 
tearDown(void)15 void tearDown(void)
16 {
17     lv_obj_delete(spangroup);
18 
19     if(active_screen) {
20         lv_obj_clean(active_screen);
21     }
22 
23     spangroup = NULL;
24     active_screen = NULL;
25 }
26 
test_spangroup_create_returns_not_null_object(void)27 void test_spangroup_create_returns_not_null_object(void)
28 {
29     lv_obj_t * obj = lv_spangroup_create(NULL);
30 
31     TEST_ASSERT(NULL != obj);
32 }
33 
test_spangroup_new_span_with_null_parameter_returns_null_object(void)34 void test_spangroup_new_span_with_null_parameter_returns_null_object(void)
35 {
36     lv_span_t * span = lv_spangroup_new_span(NULL);
37 
38     TEST_ASSERT(NULL == span);
39     TEST_ASSERT_EQUAL_INT(0, lv_spangroup_get_span_count(spangroup));
40 }
41 
test_spangroup_new_span_with_valid_parameter_returns_not_null_object(void)42 void test_spangroup_new_span_with_valid_parameter_returns_not_null_object(void)
43 {
44     lv_span_t * span = lv_spangroup_new_span(spangroup);
45 
46     TEST_ASSERT(NULL != span);
47     TEST_ASSERT_EQUAL_INT(1, lv_spangroup_get_span_count(spangroup));
48 }
49 
test_spangroup_delete_span_span_is_null(void)50 void test_spangroup_delete_span_span_is_null(void)
51 {
52     lv_span_t * span = lv_spangroup_new_span(spangroup);
53 
54     lv_spangroup_delete_span(spangroup, span);
55 
56     TEST_ASSERT_EQUAL_INT(0, lv_spangroup_get_span_count(spangroup));
57 }
58 
test_span_set_text(void)59 void test_span_set_text(void)
60 {
61     const char * test_text = "Test Text";
62     lv_span_t * span = lv_spangroup_new_span(spangroup);
63 
64     lv_span_set_text(span, test_text);
65 
66     TEST_ASSERT_EQUAL_STRING(span->txt, test_text);
67 }
68 
test_span_set_text_with_bad_parameter_no_action_performed(void)69 void test_span_set_text_with_bad_parameter_no_action_performed(void)
70 {
71     const char * test_text = "Test Text";
72     lv_span_t * span = lv_spangroup_new_span(spangroup);
73 
74     lv_span_set_text(span, test_text);
75     lv_span_set_text(span, NULL);
76 
77     TEST_ASSERT_EQUAL_STRING(span->txt, test_text);
78 }
79 
test_span_set_text_with_previous_test_overwrites(void)80 void test_span_set_text_with_previous_test_overwrites(void)
81 {
82     const char * old_test_text = "Old Test Text";
83     const char * new_test_text = "New Test Text and it is longer";
84     lv_span_t * span = lv_spangroup_new_span(spangroup);
85 
86     lv_span_set_text(span, old_test_text);
87     lv_span_set_text(span, new_test_text);
88 
89     TEST_ASSERT_EQUAL_STRING(span->txt, new_test_text);
90 }
91 
test_span_set_text_static(void)92 void test_span_set_text_static(void)
93 {
94     const char * test_text = "Test Text";
95     lv_span_t * span = lv_spangroup_new_span(spangroup);
96 
97     lv_span_set_text_static(span, test_text);
98 
99     TEST_ASSERT_EQUAL_STRING(span->txt, test_text);
100 }
101 
test_span_set_text_static_with_bad_parameter_no_action_performed(void)102 void test_span_set_text_static_with_bad_parameter_no_action_performed(void)
103 {
104     const char * test_text = "Test Text";
105     lv_span_t * span = lv_spangroup_new_span(spangroup);
106 
107     lv_span_set_text_static(span, test_text);
108     lv_span_set_text_static(span, NULL);
109 
110     TEST_ASSERT_EQUAL_STRING(span->txt, test_text);
111 }
112 
test_span_set_text_static_with_previous_text_overwrites(void)113 void test_span_set_text_static_with_previous_text_overwrites(void)
114 {
115     const char * old_test_text = "Old Test Text";
116     const char * new_test_text = "New Test Text and it is longer";
117     lv_span_t * span = lv_spangroup_new_span(spangroup);
118     lv_span_set_text_static(span, old_test_text);
119     lv_span_set_text_static(span, new_test_text);
120 
121     TEST_ASSERT_EQUAL_STRING(span->txt, new_test_text);
122 }
123 
test_spangroup_set_align(void)124 void test_spangroup_set_align(void)
125 {
126     const lv_text_align_t align = LV_TEXT_ALIGN_CENTER;
127     lv_spangroup_set_align(spangroup, align);
128 
129     TEST_ASSERT_EQUAL(align, lv_spangroup_get_align(spangroup));
130 }
131 
test_spangroup_set_overflow(void)132 void test_spangroup_set_overflow(void)
133 {
134     const lv_span_overflow_t overflow = LV_SPAN_OVERFLOW_ELLIPSIS;
135     lv_spangroup_set_overflow(spangroup, overflow);
136 
137     TEST_ASSERT_EQUAL(overflow, lv_spangroup_get_overflow(spangroup));
138 }
139 
test_spangroup_set_overflow_invalid_parameters_overflow_not_changed(void)140 void test_spangroup_set_overflow_invalid_parameters_overflow_not_changed(void)
141 {
142     lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_ELLIPSIS);
143     lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_LAST);
144 
145     TEST_ASSERT_EQUAL(LV_SPAN_OVERFLOW_ELLIPSIS, lv_spangroup_get_overflow(spangroup));
146 }
147 
test_spangroup_set_indent(void)148 void test_spangroup_set_indent(void)
149 {
150     const int32_t indent = 100;
151 
152     lv_spangroup_set_indent(spangroup, indent);
153 
154     TEST_ASSERT_EQUAL(indent, lv_spangroup_get_indent(spangroup));
155 }
156 
test_spangroup_set_mode(void)157 void test_spangroup_set_mode(void)
158 {
159     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_EXPAND);
160     TEST_ASSERT_EQUAL(LV_SPAN_MODE_EXPAND, lv_spangroup_get_mode(spangroup));
161 
162     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK);
163     TEST_ASSERT_EQUAL(LV_SPAN_MODE_BREAK, lv_spangroup_get_mode(spangroup));
164 
165     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_FIXED);
166     TEST_ASSERT_EQUAL(LV_SPAN_MODE_FIXED, lv_spangroup_get_mode(spangroup));
167 }
168 
test_spangroup_set_mode_invalid_parameter_mode_not_changed(void)169 void test_spangroup_set_mode_invalid_parameter_mode_not_changed(void)
170 {
171     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_EXPAND);
172     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_LAST);
173     TEST_ASSERT_EQUAL(LV_SPAN_MODE_EXPAND, lv_spangroup_get_mode(spangroup));
174 }
175 
test_spangroup_set_max_lines(void)176 void test_spangroup_set_max_lines(void)
177 {
178     const int32_t lines = 100;
179 
180     lv_spangroup_set_max_lines(spangroup, lines);
181 
182     TEST_ASSERT_EQUAL_INT32(lines, lv_spangroup_get_max_lines(spangroup));
183 }
184 
test_spangroup_get_max_lines_for_new_span_group(void)185 void test_spangroup_get_max_lines_for_new_span_group(void)
186 {
187     int32_t lines;
188 
189     lines = lv_spangroup_get_max_lines(spangroup);
190 
191     TEST_ASSERT_EQUAL_INT32(-1, lines);
192 
193     lines = 3;
194     lv_spangroup_set_max_lines(spangroup, lines);
195     lines = lv_spangroup_get_max_lines(spangroup);
196 
197     TEST_ASSERT_EQUAL_INT32(3, lines);
198 }
199 
test_spangroup_get_max_line_h(void)200 void test_spangroup_get_max_line_h(void)
201 {
202     int32_t max_line;
203 
204     max_line = lv_spangroup_get_max_line_height(spangroup);
205 
206     TEST_ASSERT_EQUAL(0, (uint32_t)max_line);
207 
208     (void)lv_spangroup_new_span(spangroup);
209     max_line = lv_spangroup_get_max_line_height(spangroup);
210 
211     // TODO: find out why this magic numberdd
212     TEST_ASSERT_EQUAL(16, (uint32_t)max_line);
213 }
214 
test_spangroup_draw(void)215 void test_spangroup_draw(void)
216 {
217     active_screen = lv_screen_active();
218     spangroup = lv_spangroup_create(active_screen);
219     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK);
220     lv_obj_set_width(spangroup, 100);
221     lv_span_t * span_1 = lv_spangroup_new_span(spangroup);
222     lv_span_set_text(span_1, "This text is over 100 pixels width");
223 
224     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_01.png");
225 
226     lv_span_t * span_2 = lv_spangroup_new_span(spangroup);
227     lv_span_set_text(span_2, "This text is also over 100 pixels width");
228     lv_style_set_text_decor(&span_2->style, LV_TEXT_DECOR_STRIKETHROUGH);
229 
230     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_02.png");
231 
232     lv_spangroup_set_align(spangroup, LV_TEXT_ALIGN_CENTER);
233 
234     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_03.png");
235 
236     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_EXPAND);
237 
238     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_04.png");
239 
240     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_FIXED);
241 
242     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_05.png");
243 }
244 
test_spangroup_get_child(void)245 void test_spangroup_get_child(void)
246 {
247     const int32_t span_1_idx = 0;
248     const int32_t span_2_idx = 1;
249     lv_span_t * span_1 = lv_spangroup_new_span(spangroup);
250     lv_span_t * span_2 = lv_spangroup_new_span(spangroup);
251 
252     TEST_ASSERT_EQUAL_PTR(span_2, lv_spangroup_get_child(spangroup, span_2_idx));
253     TEST_ASSERT_EQUAL_PTR(span_1, lv_spangroup_get_child(spangroup, span_1_idx));
254 }
255 
test_spangroup_get_child_count(void)256 void test_spangroup_get_child_count(void)
257 {
258     (void)lv_spangroup_new_span(spangroup);
259     (void)lv_spangroup_new_span(spangroup);
260 
261     const uint32_t cnt = lv_spangroup_get_span_count(spangroup);
262 
263     TEST_ASSERT_EQUAL(2, cnt);
264 }
265 
test_spangroup_get_expand_width(void)266 void test_spangroup_get_expand_width(void)
267 {
268     const uint32_t experimental_size = 232;
269     const uint32_t constrained_size = 232;
270     active_screen = lv_screen_active();
271 
272     spangroup = lv_spangroup_create(active_screen);
273     lv_span_t * span = lv_spangroup_new_span(spangroup);
274     lv_span_set_text(span, "This text is over 100 pixels width");
275 
276     TEST_ASSERT_EQUAL_INT(experimental_size,
277                           lv_spangroup_get_expand_width(spangroup, UINT32_MAX));
278 
279     TEST_ASSERT_EQUAL_INT(constrained_size,
280                           lv_spangroup_get_expand_width(spangroup, experimental_size));
281 }
282 
test_spangroup_newlines(void)283 void test_spangroup_newlines(void)
284 {
285     active_screen = lv_screen_active();
286     spangroup = lv_spangroup_create(active_screen);
287     lv_obj_set_size(spangroup, LV_PCT(100), LV_PCT(100));
288 
289     lv_span_set_text(lv_spangroup_new_span(spangroup), "Lorem\n");
290     lv_span_set_text(lv_spangroup_new_span(spangroup), "ipsum");
291 
292     lv_span_set_text(lv_spangroup_new_span(spangroup), "\n\n");
293 
294     lv_span_set_text(lv_spangroup_new_span(spangroup), "dolor");
295     lv_span_set_text(lv_spangroup_new_span(spangroup), "");
296     lv_span_set_text(lv_spangroup_new_span(spangroup), "\nsit");
297 
298     /* carriage return is treated as equivalent to line feed */
299     lv_span_set_text(lv_spangroup_new_span(spangroup), "\r");
300 
301     lv_span_set_text(lv_spangroup_new_span(spangroup), "amet,\n consectetur");
302     lv_span_set_text(lv_spangroup_new_span(spangroup), " adipiscing");
303 
304     lv_span_set_text(lv_spangroup_new_span(spangroup), "\n");
305     lv_span_set_text(lv_spangroup_new_span(spangroup), "");
306 
307     lv_span_set_text(lv_spangroup_new_span(spangroup), "\relit, sed\n");
308     lv_span_set_text(lv_spangroup_new_span(spangroup), "do eiusmod");
309 
310     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_06.png");
311 }
312 
313 #if LV_USE_FREETYPE && __WORDSIZE == 64
314 
test_spangroup_chinese_break_line(void)315 void test_spangroup_chinese_break_line(void)
316 {
317     lv_font_t * font = lv_freetype_font_create("src/test_files/fonts/noto/NotoSansSC-Regular.ttf",
318                                                LV_FREETYPE_FONT_RENDER_MODE_BITMAP, 24, LV_FREETYPE_FONT_STYLE_NORMAL);
319 
320     if(!font) {
321         LV_LOG_ERROR("freetype font create failed.");
322         TEST_FAIL();
323     }
324 
325     active_screen = lv_screen_active();
326     spangroup = lv_spangroup_create(active_screen);
327     lv_obj_set_size(spangroup, LV_PCT(100), LV_PCT(100));
328     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK);
329 
330     lv_obj_set_style_text_font(spangroup, font, 0);
331     lv_obj_set_style_border_width(spangroup, 2, 0);
332     lv_obj_set_width(spangroup, 250);
333 
334     lv_span_t * span1 = lv_spangroup_new_span(spangroup);
335     lv_span_set_text(span1, "八百标兵奔北坡");
336     lv_span_t * span2 = lv_spangroup_new_span(spangroup);
337     lv_span_set_text(span2, "炮兵并排北边跑");
338     lv_style_set_text_color(&span2->style, lv_palette_main(LV_PALETTE_RED));
339     lv_span_t * span3 = lv_spangroup_new_span(spangroup);
340     lv_span_set_text(span3, "中英文测试。The quick brown fox jumps over a lazy dog. ");
341     lv_style_set_text_color(&span3->style, lv_palette_main(LV_PALETTE_BLUE));
342     lv_span_t * span4 = lv_spangroup_new_span(spangroup);
343     lv_span_set_text(span4, "abcdefghijklmn中英文测试");
344     lv_style_set_text_color(&span4->style, lv_palette_main(LV_PALETTE_GREEN));
345 
346     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_07.png");
347 
348     lv_obj_set_style_text_font(spangroup, LV_FONT_DEFAULT, 0);
349     lv_freetype_font_delete(font);
350 }
351 
352 #else
353 
test_spangroup_chinese_break_line(void)354 void test_spangroup_chinese_break_line(void)
355 {
356 }
357 
358 #endif
359 
test_spangroup_style_text_letter_space(void)360 void test_spangroup_style_text_letter_space(void)
361 {
362     active_screen = lv_screen_active();
363     spangroup = lv_spangroup_create(active_screen);
364 
365     lv_obj_set_style_outline_width(spangroup, 1, 0);
366     lv_obj_set_style_text_letter_space(spangroup, 20, 0);
367 
368     lv_span_set_text(lv_spangroup_new_span(spangroup), "A");
369     lv_span_set_text(lv_spangroup_new_span(spangroup), "B");
370     lv_span_set_text(lv_spangroup_new_span(spangroup), "C");
371     lv_span_set_text(lv_spangroup_new_span(spangroup), "D");
372     lv_span_set_text(lv_spangroup_new_span(spangroup), "E");
373     lv_span_set_text(lv_spangroup_new_span(spangroup), "F");
374 
375     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_08.png");
376 }
377 
378 #if LV_FONT_MONTSERRAT_24 && LV_FONT_MONTSERRAT_20
test_spangroup_get_span_coords(void)379 void test_spangroup_get_span_coords(void)
380 {
381     /* Initialize the active screen and create a new span group */
382     active_screen = lv_screen_active();
383     spangroup = lv_spangroup_create(active_screen);
384 
385     const uint32_t span_count = 5;
386     lv_span_t * spans[span_count];
387 
388     /* Set styles and properties for the span group */
389     lv_obj_set_style_outline_width(spangroup, 1, 0);
390     lv_spangroup_set_indent(spangroup, 20);
391     lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK);
392     lv_obj_set_width(spangroup, 300);
393     lv_obj_set_style_pad_all(spangroup, 20, LV_PART_MAIN);
394 
395     /* Create spans and set their properties */
396     spans[0] = lv_spangroup_new_span(spangroup);
397     lv_span_set_text(spans[0], "China is a beautiful country.");
398     lv_style_set_text_color(lv_span_get_style(spans[0]), lv_palette_main(LV_PALETTE_RED));
399     lv_style_set_text_decor(lv_span_get_style(spans[0]), LV_TEXT_DECOR_UNDERLINE);
400     lv_style_set_text_opa(lv_span_get_style(spans[0]), LV_OPA_50);
401 
402     spans[1] = lv_spangroup_new_span(spangroup);
403     lv_span_set_text_static(spans[1], "good good study, day day up.");
404     lv_style_set_text_font(lv_span_get_style(spans[1]), &lv_font_montserrat_24);
405     lv_style_set_text_color(lv_span_get_style(spans[1]), lv_palette_main(LV_PALETTE_GREEN));
406 
407     spans[2] = lv_spangroup_new_span(spangroup);
408     lv_span_set_text_static(spans[2], "LVGL is an open-source graphics library.");
409     lv_style_set_text_color(lv_span_get_style(spans[2]), lv_palette_main(LV_PALETTE_BLUE));
410 
411     spans[3] = lv_spangroup_new_span(spangroup);
412     lv_span_set_text_static(spans[3], "the boy no name.");
413     lv_style_set_text_color(lv_span_get_style(spans[3]), lv_palette_main(LV_PALETTE_GREEN));
414     lv_style_set_text_font(lv_span_get_style(spans[3]), &lv_font_montserrat_20);
415     lv_style_set_text_decor(lv_span_get_style(spans[3]), LV_TEXT_DECOR_UNDERLINE);
416 
417     spans[4] = lv_spangroup_new_span(spangroup);
418     lv_span_set_text(spans[4], "I have a dream that hope to come true.");
419     lv_style_set_text_decor(lv_span_get_style(spans[4]), LV_TEXT_DECOR_STRIKETHROUGH);
420 
421     /* Refresh the span group mode and update layout */
422     lv_spangroup_refr_mode(spangroup);
423     lv_obj_update_layout(spangroup);
424 
425     /* Define expected coordinates for testing */
426     const lv_span_coords_t test_coords[] = {
427         {.heading = {.x1 = 40, .y1 = 20, .x2 = 280, .y2 = 20}, .middle = {.x1 = 40, .y1 = 20, .x2 = 241, .y2 = 36}, .trailing = {.x1 = 0, .y1 = 0, .x2 = 0, .y2 = 0}},
428         {.heading = {.x1 = 241, .y1 = 20, .x2 = 280, .y2 = 36}, .middle = {.x1 = 20, .y1 = 36, .x2 = 280, .y2 = 63}, .trailing = {.x1 = 20, .y1 = 63, .x2 = 155, .y2 = 90}},
429         {.heading = {.x1 = 155, .y1 = 63, .x2 = 280, .y2 = 90}, .middle = {.x1 = 20, .y1 = 90, .x2 = 280, .y2 = 90}, .trailing = {.x1 = 20, .y1 = 90, .x2 = 188, .y2 = 112}},
430         {.heading = {.x1 = 188, .y1 = 90, .x2 = 280, .y2 = 112}, .middle = {.x1 = 20, .y1 = 112, .x2 = 280, .y2 = 112}, .trailing = {.x1 = 20, .y1 = 112, .x2 = 116, .y2 = 134}},
431         {.heading = {.x1 = 116, .y1 = 112, .x2 = 280, .y2 = 134}, .middle = {.x1 = 20, .y1 = 134, .x2 = 280, .y2 = 134}, .trailing = {.x1 = 20, .y1 = 134, .x2 = 160, .y2 = 150}}
432     };
433 
434     /* Define colors for visual testing */
435     const lv_color_t colors[] = {
436         lv_palette_main(LV_PALETTE_RED), lv_palette_main(LV_PALETTE_GREEN), lv_palette_main(LV_PALETTE_BLUE),
437         lv_palette_main(LV_PALETTE_YELLOW), lv_palette_main(LV_PALETTE_PURPLE), lv_palette_main(LV_PALETTE_ORANGE),
438         lv_palette_main(LV_PALETTE_INDIGO), lv_palette_main(LV_PALETTE_BROWN), lv_palette_main(LV_PALETTE_GREY),
439         lv_palette_main(LV_PALETTE_PINK)
440     };
441     const uint32_t color_count = sizeof(colors) / sizeof(colors[0]);
442     const lv_area_t area = spangroup->coords;
443 
444     /* Iterate through spans and validate coordinates */
445     for(uint32_t i = 0; i < span_count; i++) {
446         lv_span_coords_t coords = lv_spangroup_get_span_coords(spangroup, spans[i]);
447         TEST_ASSERT_EQUAL_MEMORY(&coords.heading, &test_coords[i].heading, sizeof(lv_span_coords_t));
448 
449         /* Visual testing */
450         const lv_color_t color = colors[i % color_count];
451 
452         /* Create and style heading object */
453         lv_obj_t * obj_head = lv_obj_create(active_screen);
454         lv_obj_remove_style_all(obj_head);
455         lv_obj_set_pos(obj_head, coords.heading.x1 + area.x1, coords.heading.y1 + area.y1);
456         lv_obj_set_size(obj_head, coords.heading.x2 - coords.heading.x1, coords.heading.y2 - coords.heading.y1);
457         lv_obj_set_style_bg_color(obj_head, color, LV_PART_MAIN);
458         lv_obj_set_style_bg_opa(obj_head, LV_OPA_50, LV_PART_MAIN);
459 
460         /* Create and style middle object */
461         lv_obj_t * obj_middle = lv_obj_create(active_screen);
462         lv_obj_remove_style_all(obj_middle);
463         lv_obj_set_pos(obj_middle, coords.middle.x1 + area.x1, coords.middle.y1 + area.y1);
464         lv_obj_set_size(obj_middle, coords.middle.x2 - coords.middle.x1, coords.middle.y2 - coords.middle.y1);
465         lv_obj_set_style_bg_color(obj_middle, color, LV_PART_MAIN);
466         lv_obj_set_style_bg_opa(obj_middle, LV_OPA_50, LV_PART_MAIN);
467 
468         /* Create and style trailing object */
469         lv_obj_t * obj_trailing = lv_obj_create(active_screen);
470         lv_obj_remove_style_all(obj_trailing);
471         lv_obj_set_pos(obj_trailing, coords.trailing.x1 + area.x1, coords.trailing.y1 + area.y1);
472         lv_obj_set_size(obj_trailing, coords.trailing.x2 - coords.trailing.x1, coords.trailing.y2 - coords.trailing.y1);
473         lv_obj_set_style_bg_color(obj_trailing, color, LV_PART_MAIN);
474         lv_obj_set_style_bg_opa(obj_trailing, LV_OPA_50, LV_PART_MAIN);
475     }
476 
477     /* Validate the final screenshot */
478     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_09.png");
479 }
480 #endif
481 
test_spangroup_set_right_align_on_overflow(void)482 void test_spangroup_set_right_align_on_overflow(void)
483 {
484     active_screen = lv_screen_active();
485     spangroup = lv_spangroup_create(active_screen);
486 
487     lv_obj_set_style_outline_width(spangroup, 1, 0);
488 
489     lv_obj_set_width(spangroup, 180);
490     lv_obj_set_height(spangroup, 20);
491 
492     lv_spangroup_set_align(spangroup, LV_TEXT_ALIGN_RIGHT);
493 
494     lv_span_t * span = lv_spangroup_new_span(spangroup);
495     lv_span_set_text_static(span, "China is a beautiful country.");
496     lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_ELLIPSIS);
497 
498     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_10.png");
499 }
500 
501 #endif
502