1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 
7 /* Function run before every test */
setUp(void)8 void setUp(void)
9 {
10 }
11 
12 /* Function run after every test */
tearDown(void)13 void tearDown(void)
14 {
15     lv_obj_clean(lv_screen_active());
16 }
17 
18 /* A simple horizontal scale */
test_scale_render_example_1(void)19 void test_scale_render_example_1(void)
20 {
21     lv_obj_t * scale = lv_scale_create(lv_screen_active());
22     lv_obj_set_size(scale, lv_pct(80), 100);
23     lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_BOTTOM);
24     lv_obj_center(scale);
25 
26     lv_scale_set_label_show(scale, true);
27 
28     lv_scale_set_total_tick_count(scale, 31);
29     lv_scale_set_major_tick_every(scale, 5);
30 
31     lv_obj_set_style_length(scale, 5, LV_PART_ITEMS);
32     lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR);
33     lv_scale_set_range(scale, 10, 40);
34 
35     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/scale_1.png");
36 }
37 
38 /* An vertical scale and a horizontal scale with section and custom styling */
test_scale_render_example_2(void)39 void test_scale_render_example_2(void)
40 {
41     static lv_style_t indicator_style;
42     lv_style_init(&indicator_style);
43 
44     /* Label style properties */
45     lv_style_set_text_font(&indicator_style, &lv_font_montserrat_14);
46     lv_style_set_text_color(&indicator_style, lv_palette_darken(LV_PALETTE_BLUE, 3));
47 
48     /* Major tick properties */
49     lv_style_set_line_color(&indicator_style, lv_palette_darken(LV_PALETTE_BLUE, 3));
50     lv_style_set_width(&indicator_style, 10U);      /*Tick length*/
51     lv_style_set_line_width(&indicator_style, 2U);  /*Tick width*/
52 
53     static lv_style_t minor_ticks_style;
54     lv_style_init(&minor_ticks_style);
55     lv_style_set_line_color(&minor_ticks_style, lv_palette_lighten(LV_PALETTE_BLUE, 2));
56     lv_style_set_width(&minor_ticks_style, 5U);         /*Tick length*/
57     lv_style_set_line_width(&minor_ticks_style, 2U);    /*Tick width*/
58 
59     static lv_style_t main_line_style;
60     lv_style_init(&main_line_style);
61     /* Main line properties */
62     lv_style_set_line_color(&main_line_style, lv_palette_darken(LV_PALETTE_BLUE, 3));
63     lv_style_set_line_width(&main_line_style, 2U); // Tick width
64 
65     static lv_style_t section_label_style;
66     static lv_style_t section_minor_tick_style;
67     static lv_style_t section_main_line_style;
68 
69     lv_style_init(&section_label_style);
70     lv_style_init(&section_minor_tick_style);
71     lv_style_init(&section_main_line_style);
72 
73     /* Label style properties */
74     lv_style_set_text_font(&section_label_style, &lv_font_montserrat_14);
75     lv_style_set_text_color(&section_label_style, lv_palette_darken(LV_PALETTE_RED, 3));
76 
77     lv_style_set_line_color(&section_label_style, lv_palette_darken(LV_PALETTE_RED, 3));
78     lv_style_set_line_width(&section_label_style, 5U); /*Tick width*/
79 
80     lv_style_set_line_color(&section_minor_tick_style, lv_palette_lighten(LV_PALETTE_RED, 2));
81     lv_style_set_line_width(&section_minor_tick_style, 4U); /*Tick width*/
82 
83     /* Main line properties */
84     lv_style_set_line_color(&section_main_line_style, lv_palette_darken(LV_PALETTE_RED, 3));
85     lv_style_set_line_width(&section_main_line_style, 4U); /*Tick width*/
86 
87     uint32_t i;
88     for(i = 0; i < 2; i++) {
89         lv_obj_t * scale = lv_scale_create(lv_screen_active());
90         lv_scale_set_label_show(scale, true);
91 
92         if(i == 0) {
93             lv_obj_set_size(scale, 60, 200);
94             lv_scale_set_mode(scale, LV_SCALE_MODE_VERTICAL_RIGHT);
95             lv_obj_align(scale, LV_ALIGN_CENTER, -100, 0);
96 
97         }
98         else {
99             lv_obj_set_size(scale, 200, 60);
100             lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_TOP);
101             lv_obj_align(scale, LV_ALIGN_CENTER, 100, 0);
102         }
103 
104         lv_scale_set_total_tick_count(scale, 21);
105         lv_scale_set_major_tick_every(scale, 5);
106 
107         lv_obj_set_style_length(scale, 5, LV_PART_ITEMS);
108         lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR);
109         lv_scale_set_range(scale, 0, 100);
110 
111         static const char * custom_labels[] = {"0 °C", "25 °C", "50 °C", "75 °C", "100 °C", NULL};
112         lv_scale_set_text_src(scale, custom_labels);
113         /* Configure scale styles */
114         lv_obj_add_style(scale, &indicator_style, LV_PART_INDICATOR);
115         lv_obj_add_style(scale, &minor_ticks_style, LV_PART_ITEMS);
116         lv_obj_add_style(scale, &main_line_style, LV_PART_MAIN);
117 
118         lv_scale_section_t * section = lv_scale_add_section(scale);
119         /* Configure section styles */
120         lv_scale_section_set_range(section, 75, 100);
121         lv_scale_section_set_style(section, LV_PART_INDICATOR, &section_label_style);
122         lv_scale_section_set_style(section, LV_PART_ITEMS, &section_minor_tick_style);
123         lv_scale_section_set_style(section, LV_PART_MAIN, &section_main_line_style);
124 
125         lv_obj_set_style_bg_color(scale, lv_palette_main(LV_PALETTE_BLUE_GREY), 0);
126         lv_obj_set_style_bg_opa(scale, LV_OPA_50, 0);
127         lv_obj_set_style_radius(scale, 8, 0);
128 
129         if(i == 0) {
130             lv_obj_set_style_pad_left(scale, 8, 0);
131             lv_obj_set_style_pad_ver(scale, 20, 0);
132 
133         }
134         else {
135             lv_obj_set_style_pad_bottom(scale, 8, 0);
136             lv_obj_set_style_pad_hor(scale, 20, 0);
137         }
138     }
139 
140     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/scale_2.png");
141 }
142 
143 /* A simple round scale */
test_scale_render_example_3(void)144 void test_scale_render_example_3(void)
145 {
146     lv_obj_t * scale = lv_scale_create(lv_screen_active());
147     lv_obj_set_size(scale, 150, 150);
148     lv_scale_set_mode(scale, LV_SCALE_MODE_ROUND_INNER);
149     lv_obj_set_style_bg_opa(scale, LV_OPA_COVER, 0);
150     lv_obj_set_style_bg_color(scale, lv_palette_lighten(LV_PALETTE_RED, 5), 0);
151     lv_obj_set_style_radius(scale, LV_RADIUS_CIRCLE, 0);
152     lv_obj_center(scale);
153 
154     lv_scale_set_label_show(scale, true);
155 
156     lv_scale_set_total_tick_count(scale, 11);
157     lv_scale_set_major_tick_every(scale, 5);
158 
159     lv_obj_set_style_length(scale, 5, LV_PART_ITEMS);
160     lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR);
161     lv_scale_set_range(scale, 10, 40);
162 
163     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/scale_3.png");
164 }
165 
166 /* A round scale with section and custom styling */
test_scale_render_example_4(void)167 void test_scale_render_example_4(void)
168 {
169     lv_obj_t * scale = lv_scale_create(lv_screen_active());
170     lv_obj_set_size(scale, 150, 150);
171     lv_scale_set_label_show(scale, true);
172     lv_scale_set_mode(scale, LV_SCALE_MODE_ROUND_OUTER);
173     lv_obj_center(scale);
174 
175     lv_scale_set_total_tick_count(scale, 21);
176     lv_scale_set_major_tick_every(scale, 5);
177 
178     lv_obj_set_style_length(scale, 5, LV_PART_ITEMS);
179     lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR);
180     lv_scale_set_range(scale, 0, 100);
181 
182     static const char * custom_labels[] = {"0 °C", "25 °C", "50 °C", "75 °C", "100 °C", NULL};
183     lv_scale_set_text_src(scale, custom_labels);
184 
185     static lv_style_t indicator_style;
186     lv_style_init(&indicator_style);
187 
188     /* Label style properties */
189     lv_style_set_text_font(&indicator_style, &lv_font_montserrat_14);
190     lv_style_set_text_color(&indicator_style, lv_palette_darken(LV_PALETTE_BLUE, 3));
191 
192     /* Major tick properties */
193     lv_style_set_line_color(&indicator_style, lv_palette_darken(LV_PALETTE_BLUE, 3));
194     lv_style_set_width(&indicator_style, 10U);      /*Tick length*/
195     lv_style_set_line_width(&indicator_style, 2U);  /*Tick width*/
196     lv_obj_add_style(scale, &indicator_style, LV_PART_INDICATOR);
197 
198     static lv_style_t minor_ticks_style;
199     lv_style_init(&minor_ticks_style);
200     lv_style_set_line_color(&minor_ticks_style, lv_palette_lighten(LV_PALETTE_BLUE, 2));
201     lv_style_set_width(&minor_ticks_style, 5U);         /*Tick length*/
202     lv_style_set_line_width(&minor_ticks_style, 2U);    /*Tick width*/
203     lv_obj_add_style(scale, &minor_ticks_style, LV_PART_ITEMS);
204 
205     static lv_style_t main_line_style;
206     lv_style_init(&main_line_style);
207     /* Main line properties */
208     lv_style_set_arc_color(&main_line_style, lv_palette_darken(LV_PALETTE_BLUE, 3));
209     lv_style_set_arc_width(&main_line_style, 2U); /*Tick width*/
210     lv_obj_add_style(scale, &main_line_style, LV_PART_MAIN);
211 
212     /* Add a section */
213     static lv_style_t section_minor_tick_style;
214     static lv_style_t section_label_style;
215     static lv_style_t section_main_line_style;
216 
217     lv_style_init(&section_label_style);
218     lv_style_init(&section_minor_tick_style);
219     lv_style_init(&section_main_line_style);
220 
221     /* Label style properties */
222     lv_style_set_text_font(&section_label_style, &lv_font_montserrat_14);
223     lv_style_set_text_color(&section_label_style, lv_palette_darken(LV_PALETTE_RED, 3));
224 
225     lv_style_set_line_color(&section_label_style, lv_palette_darken(LV_PALETTE_RED, 3));
226     lv_style_set_line_width(&section_label_style, 5U); /*Tick width*/
227 
228     lv_style_set_line_color(&section_minor_tick_style, lv_palette_lighten(LV_PALETTE_RED, 2));
229     lv_style_set_line_width(&section_minor_tick_style, 4U); /*Tick width*/
230 
231     /* Main line properties */
232     lv_style_set_arc_color(&section_main_line_style, lv_palette_darken(LV_PALETTE_RED, 3));
233     lv_style_set_arc_width(&section_main_line_style, 4U); /*Tick width*/
234 
235     /* Configure section styles */
236     lv_scale_section_t * section = lv_scale_add_section(scale);
237     lv_scale_section_set_range(section, 75, 100);
238     lv_scale_section_set_style(section, LV_PART_INDICATOR, &section_label_style);
239     lv_scale_section_set_style(section, LV_PART_ITEMS, &section_minor_tick_style);
240     lv_scale_section_set_style(section, LV_PART_MAIN, &section_main_line_style);
241 
242     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/scale_4.png");
243 }
244 
draw_event_cb(lv_event_t * e)245 static void draw_event_cb(lv_event_t * e)
246 {
247     lv_obj_t * obj = lv_event_get_target(e);
248     lv_draw_task_t * draw_task = lv_event_get_draw_task(e);
249     lv_draw_dsc_base_t * base_dsc = lv_draw_task_get_draw_dsc(draw_task);
250     lv_draw_label_dsc_t * label_draw_dsc = lv_draw_task_get_label_dsc(draw_task);
251     if(base_dsc->part == LV_PART_INDICATOR) {
252         if(label_draw_dsc) {
253             const lv_color_t color_idx[7] = {
254                 lv_palette_main(LV_PALETTE_RED),
255                 lv_palette_main(LV_PALETTE_ORANGE),
256                 lv_palette_main(LV_PALETTE_YELLOW),
257                 lv_palette_main(LV_PALETTE_GREEN),
258                 lv_palette_main(LV_PALETTE_CYAN),
259                 lv_palette_main(LV_PALETTE_BLUE),
260                 lv_palette_main(LV_PALETTE_PURPLE),
261             };
262             uint8_t major_tick = lv_scale_get_major_tick_every(obj);
263             label_draw_dsc->color = color_idx[base_dsc->id1 / major_tick];
264 
265             /*Free the previously allocated text if needed*/
266             if(label_draw_dsc->text_local) lv_free((void *)label_draw_dsc->text);
267 
268             /*Malloc the text and set text_local as 1 to make LVGL automatically free the text.
269              * (Local texts are malloc'd internally by LVGL. Mimic this behavior here too)*/
270             char tmp_buffer[20] = {0}; /* Big enough buffer */
271             lv_snprintf(tmp_buffer, sizeof(tmp_buffer), "%.1f", base_dsc->id2 * 1.0f);
272             label_draw_dsc->text = lv_strdup(tmp_buffer);
273             label_draw_dsc->text_local = 1;
274 
275             lv_point_t size;
276             lv_text_get_size(&size, label_draw_dsc->text, label_draw_dsc->font, 0, 0, 1000, LV_TEXT_FLAG_NONE);
277             int32_t new_w = size.x;
278             int32_t old_w = lv_area_get_width(&draw_task->area);
279 
280             /* Distribute the new size equally on both sides */
281             draw_task->area.x1 -= (new_w - old_w) / 2;
282             draw_task->area.x2 += ((new_w - old_w) + 1) / 2;  /* +1 for rounding */
283 
284         }
285     }
286 }
287 
test_scale_render_example_7(void)288 void test_scale_render_example_7(void)
289 {
290     lv_obj_t * scale = lv_scale_create(lv_screen_active());
291     lv_obj_set_size(scale, lv_pct(80), 100);
292     lv_scale_set_mode(scale, LV_SCALE_MODE_HORIZONTAL_BOTTOM);
293     lv_obj_center(scale);
294 
295     lv_scale_set_label_show(scale, true);
296 
297     lv_scale_set_total_tick_count(scale, 31);
298     lv_scale_set_major_tick_every(scale, 5);
299 
300     lv_obj_set_style_length(scale, 5, LV_PART_ITEMS);
301     lv_obj_set_style_length(scale, 10, LV_PART_INDICATOR);
302     lv_scale_set_range(scale, 10, 40);
303 
304     lv_obj_add_event_cb(scale, draw_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL);
305     lv_obj_add_flag(scale, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS);
306 
307     TEST_ASSERT_EQUAL_SCREENSHOT("widgets/scale_5.png");
308 }
309 
test_scale_set_style(void)310 void test_scale_set_style(void)
311 {
312     lv_obj_t * scale = lv_scale_create(lv_screen_active());
313 
314     static lv_style_t section_minor_tick_style;
315     static lv_style_t section_label_style;
316     static lv_style_t section_main_line_style;
317 
318     lv_style_init(&section_label_style);
319     lv_style_init(&section_minor_tick_style);
320     lv_style_init(&section_main_line_style);
321 
322     /* Configure section styles */
323     lv_scale_section_t * section = lv_scale_add_section(scale);
324     lv_scale_section_set_range(section, 75, 100);
325 
326     lv_scale_section_set_style(section, LV_PART_MAIN, &section_main_line_style);
327     TEST_ASSERT_NOT_NULL(section->main_style);
328     TEST_ASSERT_NULL(section->indicator_style);
329     TEST_ASSERT_NULL(section->items_style);
330 
331     TEST_ASSERT_EQUAL(section->main_style, &section_main_line_style);
332 
333     lv_scale_section_set_style(section, LV_PART_INDICATOR, &section_label_style);
334     TEST_ASSERT_NOT_NULL(section->main_style);
335     TEST_ASSERT_NOT_NULL(section->indicator_style);
336     TEST_ASSERT_NULL(section->items_style);
337 
338     TEST_ASSERT_EQUAL(section->main_style, &section_main_line_style);
339     TEST_ASSERT_EQUAL(section->indicator_style, &section_label_style);
340 
341     lv_scale_section_set_style(section, LV_PART_ITEMS, &section_minor_tick_style);
342     TEST_ASSERT_NOT_NULL(section->main_style);
343     TEST_ASSERT_NOT_NULL(section->indicator_style);
344     TEST_ASSERT_NOT_NULL(section->items_style);
345 
346     TEST_ASSERT_EQUAL(section->main_style, &section_main_line_style);
347     TEST_ASSERT_EQUAL(section->indicator_style, &section_label_style);
348     TEST_ASSERT_EQUAL(section->items_style, &section_minor_tick_style);
349 
350     /* Invalid part */
351     lv_scale_section_set_style(section, LV_PART_CURSOR, &section_minor_tick_style);
352     TEST_ASSERT_NOT_NULL(section->main_style);
353     TEST_ASSERT_NOT_NULL(section->indicator_style);
354     TEST_ASSERT_NOT_NULL(section->items_style);
355 
356     TEST_ASSERT_EQUAL(section->main_style, &section_main_line_style);
357     TEST_ASSERT_EQUAL(section->indicator_style, &section_label_style);
358     TEST_ASSERT_EQUAL(section->items_style, &section_minor_tick_style);
359 
360     /* NULL section */
361     lv_scale_section_t * null_section = NULL;
362 
363     lv_scale_section_set_range(null_section, 75, 100);
364     lv_scale_section_set_style(null_section, LV_PART_MAIN, &section_main_line_style);
365 }
366 
367 /* The scale internally counts the number of custom labels until it finds the NULL sentinel */
test_scale_custom_labels_count(void)368 void test_scale_custom_labels_count(void)
369 {
370     lv_obj_t * scale = lv_scale_create(lv_screen_active());
371     lv_scale_set_label_show(scale, true);
372 
373     static const char * custom_labels[] = {"0 °C", "25 °C", "50 °C", "75 °C", "100 °C", NULL};
374     lv_scale_set_text_src(scale, custom_labels);
375 
376     lv_scale_t * scale_widget = (lv_scale_t *)scale;
377 
378     TEST_ASSERT_EQUAL(5U, scale_widget->custom_label_cnt);
379 
380     static const char * animal_labels[] = {"cat", "dog", NULL};
381     lv_scale_set_text_src(scale, animal_labels);
382 
383     TEST_ASSERT_EQUAL(2U, scale_widget->custom_label_cnt);
384 }
385 
test_scale_mode(void)386 void test_scale_mode(void)
387 {
388     lv_obj_t * scale = lv_scale_create(lv_screen_active());
389 
390     lv_scale_mode_t mode = LV_SCALE_MODE_ROUND_INNER;
391     lv_scale_set_mode(scale, mode);
392 
393     TEST_ASSERT_EQUAL(mode, lv_scale_get_mode(scale));
394 }
395 
test_scale_total_tick_count(void)396 void test_scale_total_tick_count(void)
397 {
398     lv_obj_t * scale = lv_scale_create(lv_screen_active());
399 
400     uint32_t total_tick_count = 42;
401     lv_scale_set_total_tick_count(scale, total_tick_count);
402 
403     TEST_ASSERT_EQUAL(total_tick_count, lv_scale_get_total_tick_count(scale));
404 }
405 
test_scale_major_tick_every(void)406 void test_scale_major_tick_every(void)
407 {
408     lv_obj_t * scale = lv_scale_create(lv_screen_active());
409 
410     uint32_t major_tick_every = 6;
411     lv_scale_set_major_tick_every(scale, major_tick_every);
412 
413     TEST_ASSERT_EQUAL(major_tick_every, lv_scale_get_major_tick_every(scale));
414 }
415 
test_scale_label_show(void)416 void test_scale_label_show(void)
417 {
418     lv_obj_t * scale = lv_scale_create(lv_screen_active());
419 
420     bool label_show = true;
421     lv_scale_set_label_show(scale, label_show);
422 
423     TEST_ASSERT_EQUAL(label_show, lv_scale_get_label_show(scale));
424 
425     label_show = false;
426     lv_scale_set_label_show(scale, label_show);
427 
428     TEST_ASSERT_EQUAL(label_show, lv_scale_get_label_show(scale));
429 }
430 
test_scale_angle_range(void)431 void test_scale_angle_range(void)
432 {
433     lv_obj_t * scale = lv_scale_create(lv_screen_active());
434 
435     uint32_t angle_range = 42;
436     lv_scale_set_angle_range(scale, angle_range);
437 
438     TEST_ASSERT_EQUAL(angle_range, lv_scale_get_angle_range(scale));
439 }
440 
test_scale_rotation(void)441 void test_scale_rotation(void)
442 {
443     lv_obj_t * scale = lv_scale_create(lv_screen_active());
444 
445     lv_scale_set_rotation(scale, 135);
446     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 135);
447 
448     lv_scale_set_rotation(scale, 375); /* 15 */
449     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 15);
450 
451     lv_scale_set_rotation(scale, 540); /* 180 */
452     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 180);
453 
454     lv_scale_set_rotation(scale, 1085); /* 5 */
455     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 5);
456 
457     lv_scale_set_rotation(scale, -90); /* 270 */
458     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 270);
459 
460     lv_scale_set_rotation(scale, -270); /* 90 */
461     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 90);
462 
463     lv_scale_set_rotation(scale, -355); /* 5 */
464     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 5);
465 
466     lv_scale_set_rotation(scale, -370); /* 350 */
467     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 350);
468 
469     lv_scale_set_rotation(scale, -405); /* 315 */
470     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 315);
471 
472     lv_scale_set_rotation(scale, -450); /* 270 */
473     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 270);
474 
475     lv_scale_set_rotation(scale, -1075); /* 5 */
476     TEST_ASSERT_EQUAL(lv_scale_get_rotation(scale), 5);
477 }
478 
test_scale_range(void)479 void test_scale_range(void)
480 {
481     lv_obj_t * scale = lv_scale_create(lv_screen_active());
482 
483     int32_t min_range = 24;
484     int32_t max_range = 42;
485     lv_scale_set_range(scale, min_range, max_range);
486 
487     TEST_ASSERT_EQUAL(min_range, lv_scale_get_range_min_value(scale));
488     TEST_ASSERT_EQUAL(max_range, lv_scale_get_range_max_value(scale));
489 }
490 
test_scale_set_line_needle_value(void)491 void test_scale_set_line_needle_value(void)
492 {
493     lv_obj_t * scale = lv_scale_create(lv_screen_active());
494     lv_scale_set_mode(scale, LV_SCALE_MODE_ROUND_INNER);
495 
496     lv_obj_t * line = lv_line_create(scale);
497 
498     /* test the scale allocating the array */
499     lv_scale_set_line_needle_value(scale, line, 50, 35);
500     TEST_ASSERT_EQUAL_UINT32(2, lv_line_get_point_count(line));
501     const lv_point_precise_t * allocated_points_array = lv_line_get_points(line);
502     TEST_ASSERT_NOT_NULL(allocated_points_array);
503     TEST_ASSERT_TRUE(lv_line_is_point_array_mutable(line));
504     TEST_ASSERT_EQUAL_PTR(allocated_points_array, lv_line_get_points_mutable(line));
505 
506     /* test the scale using the line's pre-set mutable array */
507     lv_point_precise_t provided_points_array[2] = {{-100, -100}, {-100, -100}};
508     lv_line_set_points_mutable(line, provided_points_array, 2);
509     lv_scale_set_line_needle_value(scale, line, 20, 20);
510     TEST_ASSERT(
511         provided_points_array[0].x != -100 || provided_points_array[0].y != -100
512         || provided_points_array[1].x != -100 || provided_points_array[1].y != -100
513     );
514     TEST_ASSERT_EQUAL_PTR(provided_points_array, lv_line_get_points_mutable(line));
515 
516     provided_points_array[0].x = -100;
517     provided_points_array[0].y = -100;
518     provided_points_array[1].x = -100;
519     provided_points_array[1].y = -100;
520     /* set the line array to an immutable one. The scale will switch back to its allocated one */
521     lv_line_set_points(line, provided_points_array, 2); /* immutable setter */
522     lv_scale_set_line_needle_value(scale, line, 10, 30);
523     TEST_ASSERT_EQUAL_PTR(allocated_points_array, lv_line_get_points_mutable(line));
524     TEST_ASSERT(
525         provided_points_array[0].x == -100 && provided_points_array[0].y == -100
526         && provided_points_array[1].x == -100 && provided_points_array[1].y == -100
527     );
528 }
529 
530 #endif
531