1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3
4 #include "unity/unity.h"
5
6 #define LV_ARRAY_GET(array, index, type) ((type*)lv_array_at((array), (index)))
7
8 static const char * svg_str_1 = \
9 "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
10 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">"
11 "<!-- some comment content <tag> <desc> ... -->"
12 "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.2\" baseProfile=\"tiny\""
13 "width=\"300px\" height=\"600px\" viewBox =\"0 0 10 10\">"
14 "<rect xml:id=rect1 fill=\"white\" x=\"10\" y=\"10\" width=\"100\" height=\"100\"/>"
15 "<desc> SVG Test </desc>"
16 "</svg>";
17
setUp(void)18 void setUp(void)
19 {
20 }
21
tearDown(void)22 void tearDown(void)
23 {
24 }
25
testSvgParser(void)26 void testSvgParser(void)
27 {
28 lv_svg_node_t * svg = lv_svg_load_data(svg_str_1, lv_strlen(svg_str_1));
29 TEST_ASSERT_NOT_EQUAL(NULL, svg);
30 lv_svg_node_delete(svg);
31 }
32
testNode(void)33 void testNode(void)
34 {
35 lv_svg_node_t * svg = lv_svg_node_create(NULL);
36
37 TEST_ASSERT_NOT_EQUAL(NULL, svg);
38 lv_svg_node_delete(svg);
39 }
40
testNodeTree(void)41 void testNodeTree(void)
42 {
43 lv_svg_node_t * root = lv_svg_node_create(NULL);
44
45 lv_svg_node_t * node1 = lv_svg_node_create(root);
46 lv_svg_node_t * node2 = lv_svg_node_create(node1);
47 lv_svg_node_t * node3 = lv_svg_node_create(root);
48
49 lv_svg_attr_t attr1;
50 attr1.id = LV_SVG_ATTR_X;
51 attr1.val_type = LV_SVG_ATTR_VALUE_DATA;
52 attr1.value.fval = 10.0f;
53
54 lv_array_push_back(&node3->attrs, &attr1);
55
56 TEST_ASSERT_EQUAL(lv_array_size(&node3->attrs), 1);
57 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&node3->attrs, 0, lv_svg_attr_t))->value.fval, 10.0f);
58
59 lv_svg_node_delete(node2);
60 lv_svg_node_delete(root);
61 }
62
testSvgElement(void)63 void testSvgElement(void)
64 {
65 const char * svg_1 = \
66 "<svg version=\"1.2\" baseProfile=\"tiny\"></svg>";
67 lv_svg_node_t * svg_node1 = lv_svg_load_data(svg_1, lv_strlen(svg_1));
68 TEST_ASSERT_EQUAL(lv_array_size(&svg_node1->attrs), 2);
69 TEST_ASSERT_EQUAL_STRING((LV_ARRAY_GET(&svg_node1->attrs, 0, lv_svg_attr_t))->value.sval, "1.2");
70 TEST_ASSERT_EQUAL_STRING((LV_ARRAY_GET(&svg_node1->attrs, 1, lv_svg_attr_t))->value.sval, "tiny");
71 lv_svg_node_delete(svg_node1);
72
73 /* test viewBox */
74 const char * svg_viewbox0 = \
75 "<svg viewBox=\"none\"></svg>";
76 lv_svg_node_t * svg_node_viewbox = lv_svg_load_data(svg_viewbox0, lv_strlen(svg_viewbox0));
77 TEST_ASSERT_EQUAL(0, LV_ARRAY_GET(&svg_node_viewbox->attrs, 0, lv_svg_attr_t)->class_type);
78 lv_svg_node_delete(svg_node_viewbox);
79
80 const char * svg_viewbox1 = \
81 "<svg viewBox=\"0 0 10 10\"></svg>";
82 lv_svg_node_t * svg_node_viewbox1 = lv_svg_load_data(svg_viewbox1, lv_strlen(svg_viewbox1));
83 float ret1[4] = {0.0f, 0.0f, 10.0f, 10.0f};
84 TEST_ASSERT_EQUAL_FLOAT_ARRAY(ret1, (float *)(LV_ARRAY_GET(&svg_node_viewbox1->attrs, 0, lv_svg_attr_t))->value.val, 4);
85 lv_svg_node_delete(svg_node_viewbox1);
86
87 const char * svg_viewbox2 = \
88 "<svg viewBox=\"-5,10 +10,-10\"></svg>";
89 lv_svg_node_t * svg_node_viewbox2 = lv_svg_load_data(svg_viewbox2, lv_strlen(svg_viewbox2));
90 float ret2[4] = {-5.0f, 10.0f, 10.0f, -10.0f};
91 TEST_ASSERT_EQUAL_FLOAT_ARRAY(ret2, (float *)(LV_ARRAY_GET(&svg_node_viewbox2->attrs, 0, lv_svg_attr_t))->value.val, 4);
92 lv_svg_node_delete(svg_node_viewbox2);
93
94 const char * svg_viewbox3 = \
95 "<svg viewBox=\"-5,-5\"></svg>";
96 lv_svg_node_t * svg_node_viewbox3 = lv_svg_load_data(svg_viewbox3, lv_strlen(svg_viewbox3));
97 TEST_ASSERT_EQUAL(0, LV_ARRAY_GET(&svg_node_viewbox3->attrs, 0, lv_svg_attr_t)->class_type);
98 lv_svg_node_delete(svg_node_viewbox3);
99
100 const char * svg_viewbox4 = \
101 "<svg viewBox=\"-5,-5 .2 1.5E+1\"></svg>";
102 lv_svg_node_t * svg_node_viewbox4 = lv_svg_load_data(svg_viewbox4, lv_strlen(svg_viewbox4));
103 float ret4[4] = {-5.0f, -5.0f, 0.2f, 15.0f};
104 TEST_ASSERT_EQUAL_FLOAT_ARRAY(ret4, (float *)(LV_ARRAY_GET(&svg_node_viewbox4->attrs, 0, lv_svg_attr_t))->value.val, 4);
105 lv_svg_node_delete(svg_node_viewbox4);
106
107 /* width and height */
108 const char * svg_wh = \
109 "<svg width=\"100\" height=\"100px\"></svg>";
110 lv_svg_node_t * svg_node_wh = lv_svg_load_data(svg_wh, lv_strlen(svg_wh));
111 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh->attrs, 0, lv_svg_attr_t))->value.fval, 100.0f);
112 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh->attrs, 1, lv_svg_attr_t))->value.fval, 100.0f);
113 lv_svg_node_delete(svg_node_wh);
114
115 const char * svg_wh2 = \
116 "<svg width=\"10cm\" height=\"100mm\"></svg>";
117 lv_svg_node_t * svg_node_wh2 = lv_svg_load_data(svg_wh2, lv_strlen(svg_wh2));
118 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh2->attrs, 0, lv_svg_attr_t))->value.fval, 377.9528f);
119 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh2->attrs, 1, lv_svg_attr_t))->value.fval, 377.9528f);
120 lv_svg_node_delete(svg_node_wh2);
121
122 const char * svg_wh3 = \
123 "<svg width=\"10in\" height=\"10pc\"></svg>";
124 lv_svg_node_t * svg_node_wh3 = lv_svg_load_data(svg_wh3, lv_strlen(svg_wh3));
125 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh3->attrs, 0, lv_svg_attr_t))->value.fval, 960.0f);
126 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh3->attrs, 1, lv_svg_attr_t))->value.fval, 160.0f);
127 lv_svg_node_delete(svg_node_wh3);
128
129 const char * svg_wh4 = \
130 "<svg width=\"10em\" height=\"10ex\"></svg>";
131 lv_svg_node_t * svg_node_wh4 = lv_svg_load_data(svg_wh4, lv_strlen(svg_wh4));
132 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh4->attrs, 0, lv_svg_attr_t))->value.fval, 160.0f);
133 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh4->attrs, 1, lv_svg_attr_t))->value.fval, 83.2f);
134 lv_svg_node_delete(svg_node_wh4);
135
136 const char * svg_wh5 = \
137 "<svg width=\"10pt\" height=\"100%\"></svg>";
138 lv_svg_node_t * svg_node_wh5 = lv_svg_load_data(svg_wh5, lv_strlen(svg_wh5));
139 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh5->attrs, 0, lv_svg_attr_t))->value.fval, 13.3333f);
140 TEST_ASSERT_EQUAL_FLOAT((LV_ARRAY_GET(&svg_node_wh5->attrs, 1, lv_svg_attr_t))->value.fval, 1.0f);
141 lv_svg_node_delete(svg_node_wh5);
142
143 /* preserveAspectRatio */
144
145 const char * svg_ar0 = \
146 "<svg preserveAspectRatio=\"none meet\"></svg>";
147 lv_svg_node_t * svg_node_ar = lv_svg_load_data(svg_ar0, lv_strlen(svg_ar0));
148 TEST_ASSERT_EQUAL(lv_array_size(&svg_node_ar->attrs), 1);
149 lv_svg_node_delete(svg_node_ar);
150
151 const char * svg_ar1 = \
152 "<svg preserveAspectRatio=\"xMinYMin meet\"></svg>";
153 svg_node_ar = lv_svg_load_data(svg_ar1, lv_strlen(svg_ar1));
154 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 2);
155 lv_svg_node_delete(svg_node_ar);
156
157 const char * svg_ar2 = \
158 "<svg preserveAspectRatio=\" xMidYMin slice\"></svg>";
159 svg_node_ar = lv_svg_load_data(svg_ar2, lv_strlen(svg_ar2));
160 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 5);
161 lv_svg_node_delete(svg_node_ar);
162
163 const char * svg_ar3 = \
164 "<svg preserveAspectRatio=\"xMaxYMin unknow\"></svg>";
165 svg_node_ar = lv_svg_load_data(svg_ar3, lv_strlen(svg_ar3));
166 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 6);
167 lv_svg_node_delete(svg_node_ar);
168
169 const char * svg_ar4 = \
170 "<svg preserveAspectRatio=\"xMinYMid meet\"></svg>";
171 svg_node_ar = lv_svg_load_data(svg_ar4, lv_strlen(svg_ar4));
172 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 8);
173 lv_svg_node_delete(svg_node_ar);
174
175 const char * svg_ar5 = \
176 "<svg preserveAspectRatio=\"xMidYMid\"></svg>";
177 svg_node_ar = lv_svg_load_data(svg_ar5, lv_strlen(svg_ar5));
178 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 10);
179 lv_svg_node_delete(svg_node_ar);
180
181 const char * svg_ar6 = \
182 "<svg preserveAspectRatio=\"xMaxYMid slice\"></svg>";
183 svg_node_ar = lv_svg_load_data(svg_ar6, lv_strlen(svg_ar6));
184 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 13);
185 lv_svg_node_delete(svg_node_ar);
186
187 const char * svg_ar7 = \
188 "<svg preserveAspectRatio=\"xMinYMax slice\"></svg>";
189 svg_node_ar = lv_svg_load_data(svg_ar7, lv_strlen(svg_ar7));
190 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 15);
191 lv_svg_node_delete(svg_node_ar);
192
193 const char * svg_ar8 = \
194 "<svg preserveAspectRatio=\"xMidYMax meet\"></svg>";
195 svg_node_ar = lv_svg_load_data(svg_ar8, lv_strlen(svg_ar8));
196 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 16);
197 lv_svg_node_delete(svg_node_ar);
198
199 const char * svg_ar9 = \
200 "<svg preserveAspectRatio=\"xMaxYMax meet\"></svg>";
201 svg_node_ar = lv_svg_load_data(svg_ar9, lv_strlen(svg_ar9));
202 TEST_ASSERT_EQUAL((LV_ARRAY_GET(&svg_node_ar->attrs, 0, lv_svg_attr_t))->value.uval, 18);
203 lv_svg_node_delete(svg_node_ar);
204
205 const char * svg_ar10 = \
206 "<svg preserveAspectRatio=\"unknown\"></svg>";
207 svg_node_ar = lv_svg_load_data(svg_ar10, lv_strlen(svg_ar10));
208 TEST_ASSERT_EQUAL(lv_array_size(&svg_node_ar->attrs), 1);
209 lv_svg_node_delete(svg_node_ar);
210 }
211
testPolylineElement(void)212 void testPolylineElement(void)
213 {
214 const char * svg_poly1 = \
215 "<svg><polyline points=\"100.0,50 200,150.0 180,110 200,200 210,340\"/></svg>";
216 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_poly1, lv_strlen(svg_poly1));
217 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
218 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
219 5);
220 lv_svg_node_delete(svg_node_root);
221
222 const char * svg_poly2 = \
223 "<svg><polyline points=\"\n100.0,50\t200,150.0\n180,110\r \"/></svg>";
224 svg_node_root = lv_svg_load_data(svg_poly2, lv_strlen(svg_poly2));
225 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
226 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
227 3);
228 lv_svg_node_delete(svg_node_root);
229
230 const char * svg_poly3 = \
231 "<svg><polyline points=\"100.0 200,150.0 edf,err\"/></svg>";
232 svg_node_root = lv_svg_load_data(svg_poly3, lv_strlen(svg_poly3));
233 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
234 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
235 1);
236 lv_svg_node_delete(svg_node_root);
237
238 const char * svg_poly4 = \
239 "<svg><polyline points=\"100.0\"/></svg>";
240 svg_node_root = lv_svg_load_data(svg_poly4, lv_strlen(svg_poly4));
241 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
242 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
243 0);
244 lv_svg_node_delete(svg_node_root);
245
246 const char * svg_poly5 = \
247 "<svg><polyline points=\" \"/></svg>";
248 svg_node_root = lv_svg_load_data(svg_poly5, lv_strlen(svg_poly5));
249 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
250 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
251 lv_svg_node_delete(svg_node_root);
252
253 }
254
testPathElement(void)255 void testPathElement(void)
256 {
257 const char * svg_path1 = \
258 "<svg><path d=\" \"/></svg>";
259 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_path1, lv_strlen(svg_path1));
260 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
261 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
262 lv_svg_node_delete(svg_node_root);
263
264 const char * svg_path2 = \
265 "<svg><path d=\"REt321\"/></svg>";
266 svg_node_root = lv_svg_load_data(svg_path2, lv_strlen(svg_path2));
267 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
268 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
269 0);
270 lv_svg_node_delete(svg_node_root);
271
272 const char * svg_path3 = \
273 "<svg><path d=\"1223\"/></svg>";
274 svg_node_root = lv_svg_load_data(svg_path3, lv_strlen(svg_path3));
275 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
276 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
277 0);
278 lv_svg_node_delete(svg_node_root);
279
280 const char * svg_path4 = \
281 "<svg><path d=\"m 100 200 150 180 L300 500 C 400 450 320.0 280.5 400 400 Z\"/></svg>";
282 svg_node_root = lv_svg_load_data(svg_path4, lv_strlen(svg_path4));
283 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
284 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
285 5);
286 lv_svg_node_delete(svg_node_root);
287
288 const char * svg_path5 = \
289 "<svg><path d=\"M 100 200 300 500 L400 450 l 150 100 H 500 h 100 H 600 v 100 s 100 200 300 400\"/></svg>";
290 svg_node_root = lv_svg_load_data(svg_path5, lv_strlen(svg_path5));
291 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
292 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
293 9);
294 uint32_t seg_size = sizeof(uint32_t) + sizeof(lv_svg_point_t);
295 lv_svg_attr_values_list_t * list = (lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0,
296 lv_svg_attr_t))->value.val;
297
298 lv_svg_attr_path_value_t * path = (lv_svg_attr_path_value_t *)(&list->data);
299 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_MOVE_TO);
300
301 path = (lv_svg_attr_path_value_t *)((uint8_t *)&list->data + seg_size);
302 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_LINE_TO);
303
304 path = (lv_svg_attr_path_value_t *)((uint8_t *)&list->data + seg_size * 2);
305 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_LINE_TO);
306
307 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->x, 400.0f);
308 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->y, 450.0f);
309
310 path = (lv_svg_attr_path_value_t *)((uint8_t *)&list->data + seg_size * 7);
311 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_LINE_TO);
312
313 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->x, 600.0f);
314 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->y, 650.0f);
315 lv_svg_node_delete(svg_node_root);
316
317 const char * svg_path6 = \
318 "<svg><path d=\"M 100 200 C300 500 400 450 320.0 280.5 c320 340 230 220 200 200"
319 " S400 400 450 450 s 500 450 550 550 q200 200 300 300 T400 400 l 450 450 480 520 t 500 500\"/></svg>";
320 svg_node_root = lv_svg_load_data(svg_path6, lv_strlen(svg_path6));
321 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
322 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
323 10);
324 lv_svg_node_delete(svg_node_root);
325 }
326
testTransform(void)327 void testTransform(void)
328 {
329 const char * svg_tr1 = \
330 "<svg><g transform=\" \"/></svg>";
331 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_tr1, lv_strlen(svg_tr1));
332 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
333 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
334 lv_svg_node_delete(svg_node_root);
335
336 const char * svg_tr2 = \
337 "<svg><g transform=\"none\"/></svg>";
338 svg_node_root = lv_svg_load_data(svg_tr2, lv_strlen(svg_tr2));
339 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
340 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 1);
341 lv_svg_node_delete(svg_node_root);
342
343 const char * svg_tr3 = \
344 "<svg><g transform=\"matrix()\"/></svg>";
345 svg_node_root = lv_svg_load_data(svg_tr3, lv_strlen(svg_tr3));
346 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
347 lv_svg_matrix_t * matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
348
349 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][0], 1.0f);
350 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][1], 1.0f);
351 TEST_ASSERT_EQUAL_FLOAT(matrix->m[2][2], 1.0f);
352
353 lv_svg_node_delete(svg_node_root);
354
355 const char * svg_tr4 = \
356 "<svg><g transform=\"matrix(1.5, 0, 2.0, 2, 10, 20)\"/></svg>";
357 svg_node_root = lv_svg_load_data(svg_tr4, lv_strlen(svg_tr4));
358 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
359 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
360
361 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][0], 1.5f);
362 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][0], 0.0f);
363 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][1], 2.0f);
364 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][1], 2.0f);
365 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][2], 10.0f);
366 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][2], 20.0f);
367
368 lv_svg_node_delete(svg_node_root);
369
370 const char * svg_tr5 = \
371 "<svg><g transform=\"translate(1, 2) translate(2.0, 2)\"/></svg>";
372 svg_node_root = lv_svg_load_data(svg_tr5, lv_strlen(svg_tr5));
373 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
374 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
375
376 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][2], 3.0f);
377 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][2], 4.0f);
378
379 lv_svg_node_delete(svg_node_root);
380
381 const char * svg_tr6 = \
382 "<svg><g transform=\" scale(0.5) scale(0.5 0.5)\"/></svg>";
383 svg_node_root = lv_svg_load_data(svg_tr6, lv_strlen(svg_tr6));
384 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
385 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
386
387 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][0], 0.25f);
388 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][1], 0.25f);
389
390 lv_svg_node_delete(svg_node_root);
391
392 const char * svg_tr7 = \
393 "<svg><g transform=\" translate(10 ) scale( 0.5 0.5) scale(0.5 ) \"/></svg>";
394 svg_node_root = lv_svg_load_data(svg_tr7, lv_strlen(svg_tr7));
395 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
396 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
397
398 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][2], 10.0f);
399 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][2], 0.0f);
400 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][0], 0.25f);
401 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][1], 0.25f);
402
403 lv_svg_node_delete(svg_node_root);
404
405 const char * svg_tr8 = \
406 "<svg><g transform=\" rotate(90 10 10) \"/></svg>";
407 svg_node_root = lv_svg_load_data(svg_tr8, lv_strlen(svg_tr8));
408 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
409 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
410
411 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][2], 20.0f);
412 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][2], 0.0f);
413
414 lv_svg_node_delete(svg_node_root);
415
416 const char * svg_tr9 = \
417 "<svg><g transform=\" rotate(90 ) \"/></svg>";
418 svg_node_root = lv_svg_load_data(svg_tr9, lv_strlen(svg_tr9));
419 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
420 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
421
422 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][2], 0.0f);
423 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][2], 0.0f);
424
425 lv_svg_node_delete(svg_node_root);
426
427 const char * svg_tr10 = \
428 "<svg><g transform=\" skewX(10) skewY(10) \"/></svg>";
429 svg_node_root = lv_svg_load_data(svg_tr10, lv_strlen(svg_tr10));
430 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
431 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
432
433 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][1], 0.176327f);
434 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][0], 0.176327f);
435
436 lv_svg_node_delete(svg_node_root);
437 }
438
testStrokeFill(void)439 void testStrokeFill(void)
440 {
441 const char * svg_sf1 = \
442 "<svg><g fill=\" \"/></svg>";
443 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_sf1, lv_strlen(svg_sf1));
444 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
445 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
446 lv_svg_node_delete(svg_node_root);
447
448 const char * svg_sf2 = \
449 "<svg><g fill=\"none\" stroke=\"inherit\"/></svg>";
450 svg_node_root = lv_svg_load_data(svg_sf2, lv_strlen(svg_sf2));
451 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
452 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 2);
453 lv_svg_node_delete(svg_node_root);
454
455 const char * svg_sf3 = \
456 "<svg><g fill=\" url(#grad1) \"/></svg>";
457 svg_node_root = lv_svg_load_data(svg_sf3, lv_strlen(svg_sf3));
458 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
459 const char * str = (const char *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.sval;
460 TEST_ASSERT_EQUAL_STRING(str, "grad1");
461 lv_svg_node_delete(svg_node_root);
462
463 const char * svg_sf4 = \
464 "<svg><g fill=\" url( # grad2 ) \"/></svg>";
465 svg_node_root = lv_svg_load_data(svg_sf4, lv_strlen(svg_sf4));
466 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
467 str = (const char *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.sval;
468 TEST_ASSERT_EQUAL_STRING(str, "");
469 lv_svg_node_delete(svg_node_root);
470
471 const char * svg_sf5 = \
472 "<svg><g fill=\" url( #grad2 ) \"/></svg>";
473 svg_node_root = lv_svg_load_data(svg_sf5, lv_strlen(svg_sf5));
474 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
475 str = (const char *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.sval;
476 TEST_ASSERT_EQUAL_STRING(str, "grad2");
477 lv_svg_node_delete(svg_node_root);
478
479 const char * svg_sf6 = \
480 "<svg><g fill=\" url (#grad2) \"/></svg>";
481 svg_node_root = lv_svg_load_data(svg_sf6, lv_strlen(svg_sf6));
482 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
483 uint32_t c = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.uval;
484 TEST_ASSERT_EQUAL(c, 0);
485 lv_svg_node_delete(svg_node_root);
486
487 const char * svg_sf7 = \
488 "<svg><g fill=\"rgb(255, 255, 255)\"/></svg>";
489 svg_node_root = lv_svg_load_data(svg_sf7, lv_strlen(svg_sf7));
490 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
491 c = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.uval;
492 TEST_ASSERT_EQUAL(c, 0xffffff);
493 lv_svg_node_delete(svg_node_root);
494
495 const char * svg_sf8 = \
496 "<svg><g fill=\"rgb(50%, 50%, 50%)\"/></svg>";
497 svg_node_root = lv_svg_load_data(svg_sf8, lv_strlen(svg_sf8));
498 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
499 c = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.uval;
500 TEST_ASSERT_EQUAL(c, 0x808080);
501 lv_svg_node_delete(svg_node_root);
502
503 const char * svg_sf9 = \
504 "<svg><g fill=\"#F00\"/></svg>";
505 svg_node_root = lv_svg_load_data(svg_sf9, lv_strlen(svg_sf9));
506 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
507 c = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.uval;
508 TEST_ASSERT_EQUAL(c, 0xff0000);
509 lv_svg_node_delete(svg_node_root);
510
511 const char * svg_sf10 = \
512 "<svg><g fill=\"#FF8000\"/></svg>";
513 svg_node_root = lv_svg_load_data(svg_sf10, lv_strlen(svg_sf10));
514 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
515 c = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.uval;
516 TEST_ASSERT_EQUAL(c, 0xff8000);
517 lv_svg_node_delete(svg_node_root);
518
519 const char * svg_sf11 = \
520 "<svg><g fill=\"red\"/></svg>";
521 svg_node_root = lv_svg_load_data(svg_sf11, lv_strlen(svg_sf11));
522 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
523 c = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.uval;
524 TEST_ASSERT_EQUAL(c, 0xff0000);
525 lv_svg_node_delete(svg_node_root);
526 }
527
testStrokeFillAttrs(void)528 void testStrokeFillAttrs(void)
529 {
530 const char * svg_sf0 = \
531 "<svg><g fill-rule=\'\'/></svg>";
532 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_sf0, lv_strlen(svg_sf0));
533 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
534 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
535 lv_svg_node_delete(svg_node_root);
536
537 const char * svg_sf1 = \
538 "<svg><g stroke-width=1 stroke-miterlimit=3 fill-rule=\'inherit\' /></svg>";
539 svg_node_root = lv_svg_load_data(svg_sf1, lv_strlen(svg_sf1));
540 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
541 float f1 = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.fval;
542 TEST_ASSERT_EQUAL_FLOAT(f1, 1.0f);
543 uint32_t f2 = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.ival;
544 TEST_ASSERT_EQUAL(f2, 3);
545 lv_svg_node_delete(svg_node_root);
546
547 const char * svg_sf2 = \
548 "<svg><g fill-rule=\"evenodd\" stroke-width=\'-1\' stroke-miterlimit=\'-5.0\'/></svg>";
549 svg_node_root = lv_svg_load_data(svg_sf2, lv_strlen(svg_sf2));
550 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
551 uint32_t r1 = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.ival;
552 TEST_ASSERT_EQUAL(r1, LV_SVG_FILL_EVENODD);
553 float w1 = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.fval;
554 TEST_ASSERT_EQUAL_FLOAT(w1, 0.0f);
555 uint32_t l1 = (LV_ARRAY_GET(&svg_node->attrs, 2, lv_svg_attr_t))->value.uval;
556 TEST_ASSERT_EQUAL(l1, 1);
557 lv_svg_node_delete(svg_node_root);
558
559 const char * svg_sf3 = \
560 "<svg><g stroke-linecap=\"round\" stroke-linejoin=\' bevel\' fill-rule=nonzero/></svg>";
561 svg_node_root = lv_svg_load_data(svg_sf3, lv_strlen(svg_sf3));
562 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
563 uint32_t c1 = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.ival;
564 TEST_ASSERT_EQUAL(c1, LV_SVG_LINE_CAP_ROUND);
565 uint32_t c2 = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.ival;
566 TEST_ASSERT_EQUAL(c2, LV_SVG_LINE_JOIN_BEVEL);
567 uint32_t r2 = (LV_ARRAY_GET(&svg_node->attrs, 2, lv_svg_attr_t))->value.ival;
568 TEST_ASSERT_EQUAL(r2, LV_SVG_FILL_NONZERO);
569 lv_svg_node_delete(svg_node_root);
570
571 const char * svg_sf4 = \
572 "<svg><g stroke-linecap=\" square \" stroke-linejoin=round/></svg>";
573 svg_node_root = lv_svg_load_data(svg_sf4, lv_strlen(svg_sf4));
574 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
575 uint32_t c3 = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.ival;
576 TEST_ASSERT_EQUAL(c3, LV_SVG_LINE_CAP_SQUARE);
577 uint32_t c4 = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.ival;
578 TEST_ASSERT_EQUAL(c4, LV_SVG_LINE_JOIN_ROUND);
579 lv_svg_node_delete(svg_node_root);
580
581 const char * svg_sf5 = \
582 "<svg><g stroke-linecap=\"a\" stroke-linejoin=\'b\' stroke-dasharray=\"none\" stroke-opacity=\"inherit\"/></svg>";
583 svg_node_root = lv_svg_load_data(svg_sf5, lv_strlen(svg_sf5));
584 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
585 uint32_t c5 = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.ival;
586 TEST_ASSERT_EQUAL(c5, LV_SVG_LINE_CAP_BUTT);
587 uint32_t c6 = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.ival;
588 TEST_ASSERT_EQUAL(c6, LV_SVG_LINE_JOIN_MITER);
589 lv_svg_node_delete(svg_node_root);
590
591 const char * svg_sf6 = \
592 "<svg><g stroke-dasharray=\"1,2,3, 2.5, 3 \" stroke-dashoffset=1.2"
593 " fill-opacity=\"2.0\" stroke-dasharray=\"inherit\" /></svg>";
594 svg_node_root = lv_svg_load_data(svg_sf6, lv_strlen(svg_sf6));
595 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
596 lv_svg_attr_values_list_t * list = (lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0,
597 lv_svg_attr_t))->value.val;
598 TEST_ASSERT_EQUAL(list->length, 5);
599 float * arr = (float *)(&list->data);
600 float ret[5] = {1.0f, 2.0f, 3.0f, 2.5f, 3.0f};
601 TEST_ASSERT_EQUAL_FLOAT_ARRAY(ret, arr, 5);
602
603 float c8 = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.fval;
604 TEST_ASSERT_EQUAL_FLOAT(c8, 1.2f);
605 float c9 = (LV_ARRAY_GET(&svg_node->attrs, 2, lv_svg_attr_t))->value.fval;
606 TEST_ASSERT_EQUAL_FLOAT(c9, 1.0f);
607 lv_svg_node_delete(svg_node_root);
608 }
609
testTextAttrs(void)610 void testTextAttrs(void)
611 {
612 const char * svg_sf0 = \
613 "<svg><text font-size=\'16\' font-family=\"arial\" font-variant=inherit>hello world!</text></svg>";
614 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_sf0, lv_strlen(svg_sf0));
615 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
616
617 float font_size = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.fval;
618 TEST_ASSERT_EQUAL_FLOAT(font_size, 16.0f);
619 const char * font_family = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.sval;
620 TEST_ASSERT_EQUAL_STRING(font_family, "arial");
621 lv_svg_node_t * svg_node1 = LV_SVG_NODE_CHILD(svg_node, 0);
622 const char * content = svg_node1->xml_id;
623 TEST_ASSERT_EQUAL_STRING(content, "hello world!");
624 lv_svg_node_delete(svg_node_root);
625
626 const char * svg_sf1 = \
627 "<svg><text font-size=\'16em\' font=\'user\' font-style=\" italic \" >hello<tspan>my\n</tspan>world!</text></svg>";
628 svg_node_root = lv_svg_load_data(svg_sf1, lv_strlen(svg_sf1));
629 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
630
631 font_size = (LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.fval;
632 TEST_ASSERT_EQUAL_FLOAT(font_size, 256.0f);
633 const char * font_style = (LV_ARRAY_GET(&svg_node->attrs, 1, lv_svg_attr_t))->value.sval;
634 TEST_ASSERT_EQUAL_STRING(font_style, "italic ");
635 svg_node1 = LV_SVG_NODE_CHILD(svg_node, 0);
636 const char * content1 = svg_node1->xml_id;
637 TEST_ASSERT_EQUAL_STRING(content1, "hello");
638 svg_node1 = LV_SVG_NODE_CHILD(svg_node, 2);
639 const char * content2 = svg_node1->xml_id;
640 TEST_ASSERT_EQUAL_STRING(content2, "world!");
641 svg_node1 = LV_SVG_NODE_CHILD(svg_node, 1);
642 lv_svg_node_t * svg_node2 = LV_SVG_NODE_CHILD(svg_node1, 0);
643 const char * content3 = svg_node2->xml_id;
644 TEST_ASSERT_EQUAL_STRING(content3, "my");
645 lv_svg_node_delete(svg_node_root);
646 }
647
testGradient(void)648 void testGradient(void)
649 {
650 const char * svg_gt1 = \
651 "<svg><linearGradient id=\"gt1\" gradientUnits= objectBoundingBox>"
652 "<stop stop-color='red' offset=0.1/>"
653 "<stop stop-color=\'black\' stop-opacity=\"0.5\" offset=1.0/>"
654 "</linearGradient></svg>";
655 lv_svg_node_t * svg_node_root = lv_svg_load_data(svg_gt1, lv_strlen(svg_gt1));
656 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0);
657 TEST_ASSERT_EQUAL_STRING(svg_node->xml_id, "gt1");
658 lv_svg_node_t * svg_node1 = LV_SVG_NODE_CHILD(svg_node, 1);
659 uint32_t c1 = (LV_ARRAY_GET(&svg_node1->attrs, 0, lv_svg_attr_t))->value.uval;
660 TEST_ASSERT_EQUAL(c1, 0);
661 float o1 = (LV_ARRAY_GET(&svg_node1->attrs, 1, lv_svg_attr_t))->value.fval;
662 TEST_ASSERT_EQUAL_FLOAT(o1, 0.5f);
663 float o2 = (LV_ARRAY_GET(&svg_node1->attrs, 2, lv_svg_attr_t))->value.fval;
664 TEST_ASSERT_EQUAL_FLOAT(o2, 1.0f);
665 lv_svg_node_delete(svg_node_root);
666
667 const char * svg_gt2 = \
668 "<svg><defs><radialGradient xml:id=\"gt2\" gradientUnits=\"userSpaceOnUse\""
669 "cx=\"400\" cy=\"200\" r=\"300\">"
670 "<stop offset=\"0\" stop-color=\"red\"/>"
671 "<stop offset=\"0.5\" stop-color=\"blue\"/>"
672 "<stop offset=\"1\" stop-color=\"red\"/>"
673 "</radialGradient></defs></svg>";
674 svg_node_root = lv_svg_load_data(svg_gt2, lv_strlen(svg_gt2));
675 svg_node = LV_SVG_NODE_CHILD(svg_node_root, 0); //defs
676 svg_node1 = LV_SVG_NODE_CHILD(svg_node, 0);
677 TEST_ASSERT_EQUAL_STRING(svg_node1->xml_id, "gt2");
678 uint32_t g = (LV_ARRAY_GET(&svg_node1->attrs, 0, lv_svg_attr_t))->value.ival;
679 TEST_ASSERT_EQUAL(g, LV_SVG_GRADIENT_UNITS_USER_SPACE);
680 float cx = (LV_ARRAY_GET(&svg_node1->attrs, 1, lv_svg_attr_t))->value.fval;
681 TEST_ASSERT_EQUAL_FLOAT(cx, 400.0f);
682 float cy = (LV_ARRAY_GET(&svg_node1->attrs, 2, lv_svg_attr_t))->value.fval;
683 TEST_ASSERT_EQUAL_FLOAT(cy, 200.0f);
684 lv_svg_node_delete(svg_node_root);
685 }
686
testBadCase(void)687 void testBadCase(void)
688 {
689 const char * svg_b1 = \
690 "<rect x=10 y=10 width=100 height=100/>";
691 lv_svg_node_t * svg = lv_svg_load_data(svg_b1, lv_strlen(svg_b1));
692 TEST_ASSERT_EQUAL(NULL, svg);
693 lv_svg_node_delete(svg);
694
695 const char * svg_b2 = \
696 "<svg><text><rect x=10 y=10 width=200 height=200/></svg>";
697 svg = lv_svg_load_data(svg_b2, lv_strlen(svg_b2));
698 TEST_ASSERT_EQUAL(NULL, svg);
699 lv_svg_node_delete(svg);
700
701 const char * svg_b3 = \
702 "<svg><rect x=10 y=10 width=200 height/></svg>";
703 svg = lv_svg_load_data(svg_b3, lv_strlen(svg_b3));
704 TEST_ASSERT_EQUAL(NULL, svg);
705 lv_svg_node_delete(svg);
706
707 const char * svg_b4 = \
708 "<svg><g fill=\"url( \"/></svg>";
709 svg = lv_svg_load_data(svg_b4, lv_strlen(svg_b4));
710 lv_svg_node_t * svg_node = LV_SVG_NODE_CHILD(svg, 0);
711 TEST_ASSERT_EQUAL(0, LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t)->class_type);
712 lv_svg_node_delete(svg);
713
714 const char * svg_b5 = \
715 "<svg><g transform=matrix/></svg>";
716 svg = lv_svg_load_data(svg_b5, lv_strlen(svg_b5));
717 svg_node = LV_SVG_NODE_CHILD(svg, 0);
718 lv_svg_matrix_t * matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
719
720 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][0], 1.0f);
721 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][1], 1.0f);
722 TEST_ASSERT_EQUAL_FLOAT(matrix->m[2][2], 1.0f);
723 lv_svg_node_delete(svg);
724
725 const char * svg_b6 = \
726 "<svg><123><123></svg>";
727 svg = lv_svg_load_data(svg_b6, lv_strlen(svg_b6));
728 TEST_ASSERT_EQUAL(NULL, svg);
729 lv_svg_node_delete(svg);
730
731 const char * svg_b7 = \
732 "<svg><my> bad case <you></svg>";
733 svg = lv_svg_load_data(svg_b7, lv_strlen(svg_b7));
734 TEST_ASSERT_EQUAL(NULL, svg);
735 lv_svg_node_delete(svg);
736
737 const char * svg_b8 = \
738 "<svg><path d=\"M 100 L150 180 L 150 Z\"/></svg>";
739 svg = lv_svg_load_data(svg_b8, lv_strlen(svg_b8));
740 svg_node = LV_SVG_NODE_CHILD(svg, 0);
741 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
742 3);
743 uint32_t seg_size = sizeof(uint32_t) + sizeof(lv_svg_point_t);
744 lv_svg_attr_values_list_t * list = (lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0,
745 lv_svg_attr_t))->value.val;
746
747 lv_svg_attr_path_value_t * path = (lv_svg_attr_path_value_t *)(&list->data);
748 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_MOVE_TO);
749
750 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->x, 100.0f);
751 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->y, 150.0f);
752
753 path = (lv_svg_attr_path_value_t *)((uint8_t *)&list->data + seg_size);
754 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_LINE_TO);
755
756 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->x, 180.0f);
757 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->y, 150.0f);
758 lv_svg_node_delete(svg);
759
760 const char * svg_b9 = \
761 "<svg><path d=\"M 100 200 L150 Z\"/></svg>";
762 svg = lv_svg_load_data(svg_b9, lv_strlen(svg_b9));
763 svg_node = LV_SVG_NODE_CHILD(svg, 0);
764 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
765 1);
766 seg_size = sizeof(uint32_t) + sizeof(lv_svg_point_t);
767 list = (lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
768
769 path = (lv_svg_attr_path_value_t *)(&list->data);
770 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_MOVE_TO);
771
772 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->x, 100.0f);
773 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->y, 200.0f);
774 lv_svg_node_delete(svg);
775
776 const char * svg_b10 = \
777 "<svg></text>bad case</text></svg>";
778 svg = lv_svg_load_data(svg_b10, lv_strlen(svg_b10));
779 TEST_ASSERT_EQUAL(NULL, svg);
780 lv_svg_node_delete(svg);
781
782 const char * svg_b11 = \
783 "<svg><text font-size></text></svg>";
784 svg = lv_svg_load_data(svg_b11, lv_strlen(svg_b11));
785 svg_node = LV_SVG_NODE_CHILD(svg, 0);
786 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
787 TEST_ASSERT_EQUAL(LV_TREE_NODE(svg_node)->child_cnt, 0);
788 lv_svg_node_delete(svg);
789
790 const char * svg_b12 = \
791 "<svg><text font-size=></text></svg>";
792 svg = lv_svg_load_data(svg_b12, lv_strlen(svg_b12));
793 svg_node = LV_SVG_NODE_CHILD(svg, 0);
794 TEST_ASSERT_EQUAL(lv_array_size(&svg_node->attrs), 0);
795 TEST_ASSERT_EQUAL(LV_TREE_NODE(svg_node)->child_cnt, 0);
796 lv_svg_node_delete(svg);
797
798 const char * svg_b13 = \
799 "<svg><!-aaaa /></svg>";
800 svg = lv_svg_load_data(svg_b13, lv_strlen(svg_b13));
801 TEST_ASSERT_NOT_EQUAL(NULL, svg);
802 lv_svg_node_delete(svg);
803
804 const char * svg_b14 = \
805 "<svg><rect"
806 "x=1 y=1 width=10 height=10"
807 "x=1 y=1 width=10 height=10"
808 "x=1 y=1 width=10 height=10"
809 " /></svg>";
810 svg = lv_svg_load_data(svg_b14, lv_strlen(svg_b14));
811 TEST_ASSERT_NOT_EQUAL(NULL, svg);
812 lv_svg_node_delete(svg);
813
814 const char * svg_b15 = \
815 "<svg>"
816 "<path d=\'m-122.3,84.285s0.1,1.894-0.73,1.875c-0.82-0.019-17.27-48.094-37.8-45.851,0,0,17.78-7.353,38.53,43.976z\'/>"
817 "</svg>";
818 svg = lv_svg_load_data(svg_b15, lv_strlen(svg_b15));
819 svg_node = LV_SVG_NODE_CHILD(svg, 0);
820
821 TEST_ASSERT_EQUAL(((lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val)->length,
822 5);
823 seg_size = sizeof(uint32_t) + sizeof(lv_svg_point_t);
824 list = (lv_svg_attr_values_list_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
825
826 path = (lv_svg_attr_path_value_t *)(&list->data);
827 TEST_ASSERT_EQUAL(path->cmd, LV_SVG_PATH_CMD_MOVE_TO);
828
829 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->x, -122.3f);
830 TEST_ASSERT_EQUAL_FLOAT(((lv_svg_point_t *)(&path->data))->y, 84.285f);
831
832 lv_svg_node_delete(svg);
833
834 const char * svg_b16 = \
835 "<svg>"
836 "<g transform=\'matrix(1.7656463,0,0,1.7656463,324.90716,255.00942)\'>"
837 "</g>"
838 "</svg>";
839 svg = lv_svg_load_data(svg_b16, lv_strlen(svg_b16));
840 svg_node = LV_SVG_NODE_CHILD(svg, 0);
841 matrix = (lv_svg_matrix_t *)(LV_ARRAY_GET(&svg_node->attrs, 0, lv_svg_attr_t))->value.val;
842
843 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][0], 1.7656463f);
844 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][0], 0.0f);
845 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][1], 0.0f);
846 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][1], 1.7656463f);
847 TEST_ASSERT_EQUAL_FLOAT(matrix->m[0][2], 324.90716f);
848 TEST_ASSERT_EQUAL_FLOAT(matrix->m[1][2], 255.00942f);
849
850 lv_svg_node_delete(svg);
851 }
852
853 #endif
854