• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <string>
17 #include "gtest/gtest.h"
18 
19 #define private public
20 #define protected public
21 
22 #include "include/core/SkStream.h"
23 #include "test/mock/core/common/mock_container.h"
24 #include "test/mock/core/rosen/mock_canvas.h"
25 
26 #include "base/memory/ace_type.h"
27 #include "core/components/common/layout/constants.h"
28 #include "core/components/common/properties/color.h"
29 #include "core/components/declaration/svg/svg_animate_declaration.h"
30 #include "core/components/declaration/svg/svg_circle_declaration.h"
31 #include "core/components/declaration/svg/svg_declaration.h"
32 #include "core/components/declaration/svg/svg_ellipse_declaration.h"
33 #include "core/components/declaration/svg/svg_fe_blend_declaration.h"
34 #include "core/components/declaration/svg/svg_fe_colormatrix_declaration.h"
35 #include "core/components/declaration/svg/svg_fe_composite_declaration.h"
36 #include "core/components/declaration/svg/svg_fe_declaration.h"
37 #include "core/components/declaration/svg/svg_fe_flood_declaration.h"
38 #include "core/components/declaration/svg/svg_fe_gaussianblur_declaration.h"
39 #include "core/components/declaration/svg/svg_filter_declaration.h"
40 #include "core/components/declaration/svg/svg_gradient_declaration.h"
41 #include "core/components/declaration/svg/svg_image_declaration.h"
42 #include "core/components/declaration/svg/svg_line_declaration.h"
43 #include "core/components/declaration/svg/svg_mask_declaration.h"
44 #include "core/components/declaration/svg/svg_path_declaration.h"
45 #include "core/components/declaration/svg/svg_pattern_declaration.h"
46 #include "core/components/declaration/svg/svg_polygon_declaration.h"
47 #include "core/components/declaration/svg/svg_rect_declaration.h"
48 #include "core/components/declaration/svg/svg_stop_declaration.h"
49 #include "core/components_ng/render/drawing.h"
50 #include "core/components_ng/svg/parse/svg_animation.h"
51 #include "core/components_ng/svg/parse/svg_circle.h"
52 #include "core/components_ng/svg/parse/svg_clip_path.h"
53 #include "core/components_ng/svg/parse/svg_defs.h"
54 #include "core/components_ng/svg/parse/svg_ellipse.h"
55 #include "core/components_ng/svg/parse/svg_fe_blend.h"
56 #include "core/components_ng/svg/parse/svg_fe_color_matrix.h"
57 #include "core/components_ng/svg/parse/svg_fe_composite.h"
58 #include "core/components_ng/svg/parse/svg_fe_flood.h"
59 #include "core/components_ng/svg/parse/svg_fe_gaussian_blur.h"
60 #include "core/components_ng/svg/parse/svg_fe_offset.h"
61 #include "core/components_ng/svg/parse/svg_filter.h"
62 #include "core/components_ng/svg/parse/svg_g.h"
63 #include "core/components_ng/svg/parse/svg_gradient.h"
64 #include "core/components_ng/svg/parse/svg_image.h"
65 #include "core/components_ng/svg/parse/svg_line.h"
66 #include "core/components_ng/svg/parse/svg_mask.h"
67 #include "core/components_ng/svg/parse/svg_path.h"
68 #include "core/components_ng/svg/parse/svg_pattern.h"
69 #include "core/components_ng/svg/parse/svg_polygon.h"
70 #include "core/components_ng/svg/parse/svg_rect.h"
71 #include "core/components_ng/svg/parse/svg_stop.h"
72 #include "core/components_ng/svg/parse/svg_style.h"
73 #include "core/components_ng/svg/parse/svg_svg.h"
74 #include "core/components_ng/svg/parse/svg_use.h"
75 #include "core/components_ng/svg/svg_dom.h"
76 
77 using namespace testing;
78 using namespace testing::ext;
79 
80 namespace OHOS::Ace::NG {
81 namespace {
82 
83 const std::string TRANSFORM_RECT_SVG_LABEL =
84     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
85     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
86     "stroke-width=\"1\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"rotate(34.56)\" "
87     "transform-origin=\"123.45px 99.99%\"/></svg>";
88 
89 const std::string TRANSFORM_SCALE_SVG_LABEL =
90     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
91     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
92     "stroke-width=\"1\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"scale(0.8, 0.8)\" "
93     "transform-origin=\"123.45px 99.99%\"/></svg>";
94 
95 const std::string TRANSFORM_SKEW_SVG_LABEL =
96     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
97     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
98     "stroke-width=\"1\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"skewX(34.56) skewY(98.76)\" "
99     "transform-origin=\"123.45px 99.99%\"/></svg>";
100 
101 const std::string TRANSFORM_TRANSLATE_SVG_LABEL =
102     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
103     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
104     "stroke-width=\"1\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"translate(34.56)\" "
105     "transform-origin=\"123.45px 99.99%\"/></svg>";
106 
107 const std::string TRANSFORM_MATRIX_SVG_LABEL =
108     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
109     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
110     "stroke-width=\"1\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"matrix(1,0,0.577,1,0,0)\" "
111     "transform-origin=\"123.45px 99.99%\"/></svg>";
112 
113 
114 const std::string TRANSFORM_INVALID_EMPTY_SVG_LABEL =
115     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
116     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
117     "stroke-width=\"16px\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"rotate()\" "
118     "transform-origin=\"123.45px 99.99%\"/></svg>";
119 
120 const std::string TRANSFORM_INVALID_PARA_SVG_LABEL =
121     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
122     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
123     "stroke-width=\"16px\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"rotate(abc)\" "
124     "transform-origin=\"123.45px 99.99%\"/></svg>";
125 
126 const std::string TRANSFORM_ORIGIN_INVALID_PARA_SVG_LABEL =
127     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
128     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
129     "stroke-width=\"16px\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"rotate(34.56)\" "
130     "transform-origin=\"abcd\"/></svg>";
131 
132 const std::string TRANSFORM_ORIGIN_INVALID_EMPTY_SVG_LABEL =
133     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
134     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
135     "stroke-width=\"16px\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"rotate(34.56)\" "
136     "transform-origin=\"\"/></svg>";
137 
138 const std::string TRANSFORM_ORIGIN_INVALID_SPACE_SVG_LABEL =
139     "<svg width=\"400px\" height=\"400px\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">"
140     "<rect x=\"60px\" y=\"200px\" width=\"50px\" height=\"50px\" fill=\"red\" opacity=\"0.5\" stroke=\"blue\" "
141     "stroke-width=\"16px\" stroke-opacity=\"0.3\" id=\"circleId\" transform=\"rotate(34.56)\" "
142     "transform-origin=\"   \"/></svg>";
143 
144 constexpr float IMAGE_COMPONENT_WIDTH = 100.0f;
145 constexpr float IMAGE_COMPONENT_HEIGHT = 100.0f;
146 } // namespace
147 
148 
149 class SvgTransformTestNg : public testing::Test {
150 public:
151     void CallBack(Testing::MockCanvas& rSCanvas);
SetUpTestSuite()152     static void SetUpTestSuite()
153     {
154         MockContainer::SetUp();
155     }
TearDownTestSuite()156     static void TearDownTestSuite()
157     {
158         MockContainer::TearDown();
159     }
160 };
161 
CallBack(Testing::MockCanvas & rSCanvas)162 void SvgTransformTestNg::CallBack(Testing::MockCanvas& rSCanvas)
163 {
164     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
165     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
166     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
167     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
168     EXPECT_CALL(rSCanvas, DrawPath(_)).Times(AtLeast(1));
169 }
170 
171 /**
172  * @tc.name: ParseTransformTestRect
173  * @tc.desc: parse transform-origin label
174  * @tc.type: FUNC
175  */
176 HWTEST_F(SvgTransformTestNg, ParseTransformTestRect, TestSize.Level1)
177 {
178     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_RECT_SVG_LABEL.c_str(), TRANSFORM_RECT_SVG_LABEL.length());
179     EXPECT_NE(svgStream, nullptr);
180     ImageSourceInfo src;
181     src.SetFillColor(Color::BLACK);
182     Testing::MockCanvas rSCanvas;
183     CallBack(rSCanvas);
184     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
185     EXPECT_NE(svgDom, nullptr);
186     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
187 
188     /* *
189      * @tc.steps: step1. get shape from svg.
190      * @tc.expected: shape is Effective.
191      */
192     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
193     EXPECT_NE(svgRect, nullptr);
194     svgDom->root_->SetSmoothEdge(1);
195     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
196 
197     /* *
198      * @tc.steps: step2. get transform function vector from the shape.
199      * @tc.expected: transform function vector value is equal to svg source.
200      */
201     auto attributes = svgRect->attributes_;
202     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
203     NG::TransformInfo element;
204     element = attributes.transformVec[0];
205     EXPECT_EQ(element.funcType, "rotate");
206     EXPECT_EQ(element.paramVec[0], "34.56");
207 }
208 
209 /**
210  * @tc.name: ParseTransformTestScale
211  * @tc.desc: parse transform-origin label
212  * @tc.type: FUNC
213  */
214 HWTEST_F(SvgTransformTestNg, ParseTransformTestScale, TestSize.Level1)
215 {
216     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_SCALE_SVG_LABEL.c_str(), TRANSFORM_SCALE_SVG_LABEL.length());
217     EXPECT_NE(svgStream, nullptr);
218     ImageSourceInfo src;
219     src.SetFillColor(Color::BLACK);
220     Testing::MockCanvas rSCanvas;
221     CallBack(rSCanvas);
222     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
223     EXPECT_NE(svgDom, nullptr);
224     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
225 
226     /* *
227      * @tc.steps: step1. get shape from svg.
228      * @tc.expected: shape is Effective.
229      */
230     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
231     EXPECT_NE(svgRect, nullptr);
232     svgDom->root_->SetSmoothEdge(1);
233     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
234 
235     /* *
236      * @tc.steps: step2. get transform function vector from the shape.
237      * @tc.expected: transform function vector value is equal to svg source.
238      */
239     auto attributes = svgRect->attributes_;
240     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
241     NG::TransformInfo element;
242     element = attributes.transformVec[0];
243     EXPECT_EQ(element.funcType, "scale");
244     EXPECT_EQ(element.paramVec[0], "0.8");
245     EXPECT_EQ(element.paramVec[1], "0.8");
246 }
247 
248 /**
249  * @tc.name: ParseTransformTestSkew
250  * @tc.desc: parse transform-origin label
251  * @tc.type: FUNC
252  */
253 HWTEST_F(SvgTransformTestNg, ParseTransformTestSkew, TestSize.Level1)
254 {
255     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_SKEW_SVG_LABEL.c_str(), TRANSFORM_SKEW_SVG_LABEL.length());
256     EXPECT_NE(svgStream, nullptr);
257     ImageSourceInfo src;
258     src.SetFillColor(Color::BLACK);
259     Testing::MockCanvas rSCanvas;
260     CallBack(rSCanvas);
261     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
262     EXPECT_NE(svgDom, nullptr);
263     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
264 
265     /* *
266      * @tc.steps: step1. get shape from svg.
267      * @tc.expected: shape is Effective.
268      */
269     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
270     EXPECT_NE(svgRect, nullptr);
271     svgDom->root_->SetSmoothEdge(1);
272     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
273 
274     /* *
275      * @tc.steps: step2. get transform function vector from the shape.
276      * @tc.expected: transform function vector value is equal to svg source.
277      */
278     auto attributes = svgRect->attributes_;
279     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
280     NG::TransformInfo element;
281     element = attributes.transformVec[0];
282     EXPECT_EQ(element.funcType, "skewX");
283     EXPECT_EQ(element.paramVec[0], "34.56");
284 
285     NG::TransformInfo element2;
286     element2 = attributes.transformVec[1];
287     EXPECT_EQ(element2.funcType, "skewY");
288     EXPECT_EQ(element2.paramVec[0], "98.76");
289 }
290 
291 /**
292  * @tc.name: ParseTransformTestTranslate
293  * @tc.desc: parse transform-origin label
294  * @tc.type: FUNC
295  */
296 HWTEST_F(SvgTransformTestNg, ParseTransformTestTranslate, TestSize.Level1)
297 {
298     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_TRANSLATE_SVG_LABEL.c_str(),
299         TRANSFORM_TRANSLATE_SVG_LABEL.length());
300     EXPECT_NE(svgStream, nullptr);
301     ImageSourceInfo src;
302     src.SetFillColor(Color::BLACK);
303     Testing::MockCanvas rSCanvas;
304     CallBack(rSCanvas);
305     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
306     EXPECT_NE(svgDom, nullptr);
307     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
308 
309     /* *
310      * @tc.steps: step1. get shape from svg.
311      * @tc.expected: shape is Effective.
312      */
313     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
314     EXPECT_NE(svgRect, nullptr);
315     svgDom->root_->SetSmoothEdge(1);
316     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
317 
318     /* *
319      * @tc.steps: step2. get transform function vector from the shape.
320      * @tc.expected: transform function vector value is equal to svg source.
321      */
322     auto attributes = svgRect->attributes_;
323     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
324     NG::TransformInfo element;
325     element = attributes.transformVec[0];
326     EXPECT_EQ(element.funcType, "translate");
327     EXPECT_EQ(element.paramVec[0], "34.56");
328 }
329 
330 /**
331  * @tc.name: ParseTransformTestMatrix
332  * @tc.desc: parse transform-origin label
333  * @tc.type: FUNC
334  */
335 HWTEST_F(SvgTransformTestNg, ParseTransformTestMatrix, TestSize.Level1)
336 {
337     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_MATRIX_SVG_LABEL.c_str(), TRANSFORM_MATRIX_SVG_LABEL.length());
338     EXPECT_NE(svgStream, nullptr);
339     ImageSourceInfo src;
340     src.SetFillColor(Color::BLACK);
341     Testing::MockCanvas rSCanvas;
342     CallBack(rSCanvas);
343     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
344     EXPECT_NE(svgDom, nullptr);
345     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
346 
347     /* *
348      * @tc.steps: step1. get shape from svg.
349      * @tc.expected: shape is Effective.
350      */
351     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
352     EXPECT_NE(svgRect, nullptr);
353     svgDom->root_->SetSmoothEdge(1);
354     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
355 
356     /* *
357      * @tc.steps: step2. get transform function vector from the shape.
358      * @tc.expected: transform function vector value is equal to svg source.
359      */
360     auto attributes = svgRect->attributes_;
361     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
362     NG::TransformInfo element;
363     element = attributes.transformVec[0];
364     EXPECT_EQ(element.funcType, "matrix");
365     EXPECT_EQ(element.paramVec[0], "1");
366     EXPECT_EQ(element.paramVec[1], "0");
367     EXPECT_EQ(element.paramVec[2], "0.577");
368     EXPECT_EQ(element.paramVec[3], "1");
369     EXPECT_EQ(element.paramVec[4], "0");
370     EXPECT_EQ(element.paramVec[5], "0");
371 }
372 
373 /**
374  * @tc.name: ParseTransformInvalidTest001
375  * @tc.desc: parse transform-origin label
376  * @tc.type: FUNC
377  */
378 HWTEST_F(SvgTransformTestNg, ParseTransformInvalidTest001, TestSize.Level1)
379 {
380     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_INVALID_EMPTY_SVG_LABEL.c_str(),
381         TRANSFORM_INVALID_EMPTY_SVG_LABEL.length());
382     EXPECT_NE(svgStream, nullptr);
383     ImageSourceInfo src;
384     src.SetFillColor(Color::BLACK);
385     Testing::MockCanvas rSCanvas;
386     CallBack(rSCanvas);
387     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
388     EXPECT_NE(svgDom, nullptr);
389     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
390 
391     /* *
392      * @tc.steps: step1. get shape from svg.
393      * @tc.expected: shape is Effective.
394      */
395     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
396     EXPECT_NE(svgRect, nullptr);
397     svgDom->root_->SetSmoothEdge(1);
398     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
399 
400     /* *
401      * @tc.steps: step2. get transform function vector from the shape.
402      * @tc.expected: transform function vector value is equal to svg source.
403      */
404     auto attributes = svgRect->attributes_;
405     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
406     EXPECT_EQ(0, attributes.transformVec.size());
407 }
408 
409 /**
410  * @tc.name: ParseTransformInvalidTest002
411  * @tc.desc: parse transform-origin label
412  * @tc.type: FUNC
413  */
414 HWTEST_F(SvgTransformTestNg, ParseTransformInvalidTest002, TestSize.Level1)
415 {
416     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_INVALID_PARA_SVG_LABEL.c_str(),
417         TRANSFORM_INVALID_PARA_SVG_LABEL.length());
418     EXPECT_NE(svgStream, nullptr);
419     ImageSourceInfo src;
420     src.SetFillColor(Color::BLACK);
421     Testing::MockCanvas rSCanvas;
422     CallBack(rSCanvas);
423     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
424     EXPECT_NE(svgDom, nullptr);
425     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
426 
427     /* *
428      * @tc.steps: step1. get shape from svg.
429      * @tc.expected: shape is Effective.
430      */
431     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
432     EXPECT_NE(svgRect, nullptr);
433     svgDom->root_->SetSmoothEdge(1);
434     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
435 
436     /* *
437      * @tc.steps: step2. get transform function vector from the shape.
438      * @tc.expected: transform function vector value is equal to svg source.
439      */
440     auto attributes = svgRect->attributes_;
441     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
442     EXPECT_EQ(0, attributes.transformVec.size());
443 }
444 
445 /**
446  * @tc.name: ParseTransformOriginTest001
447  * @tc.desc: parse transform-origin label
448  * @tc.type: FUNC
449  */
450 HWTEST_F(SvgTransformTestNg, ParseTransformOriginTest001, TestSize.Level1)
451 {
452     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_RECT_SVG_LABEL.c_str(), TRANSFORM_RECT_SVG_LABEL.length());
453     EXPECT_NE(svgStream, nullptr);
454     ImageSourceInfo src;
455     src.SetFillColor(Color::BLACK);
456     Testing::MockCanvas rSCanvas;
457     CallBack(rSCanvas);
458     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
459     EXPECT_NE(svgDom, nullptr);
460     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
461 
462     /* *
463      * @tc.steps: step1. get shape from svg.
464      * @tc.expected: shape is Effective.
465      */
466     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
467     EXPECT_NE(svgRect, nullptr);
468     svgDom->root_->SetSmoothEdge(1);
469     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
470 
471     /* *
472      * @tc.steps: step2. get transform-origin value from the shape.
473      * @tc.expected: transform-origin value is equal to svg source.
474      */
475     auto attributes = svgRect->attributes_;
476     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
477 
478     EXPECT_EQ(Dimension(123.45_px), attributes.transformOrigin.first);
479     EXPECT_EQ(Dimension(0.9999_pct), attributes.transformOrigin.second);
480 }
481 
482 /**
483  * @tc.name: ParseTransformOriginInvalidTest001
484  * @tc.desc: parse transform-origin label
485  * @tc.type: FUNC
486  */
487 HWTEST_F(SvgTransformTestNg, ParseTransformOriginInvalidTest001, TestSize.Level1)
488 {
489     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_ORIGIN_INVALID_PARA_SVG_LABEL.c_str(),
490         TRANSFORM_ORIGIN_INVALID_PARA_SVG_LABEL.length());
491     EXPECT_NE(svgStream, nullptr);
492     ImageSourceInfo src;
493     src.SetFillColor(Color::BLACK);
494     Testing::MockCanvas rSCanvas;
495     CallBack(rSCanvas);
496     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
497     EXPECT_NE(svgDom, nullptr);
498     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
499 
500     /* *
501      * @tc.steps: step1. get shape from svg.
502      * @tc.expected: shape is Effective.
503      */
504     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
505     EXPECT_NE(svgRect, nullptr);
506     svgDom->root_->SetSmoothEdge(1);
507     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
508 
509     /* *
510      * @tc.steps: step2. get transform-origin value from the shape.
511      * @tc.expected: transform-origin value is equal to svg source.
512      */
513     auto attributes = svgRect->attributes_;
514     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
515     EXPECT_EQ(Dimension(0.0f), attributes.transformOrigin.first);
516     EXPECT_EQ(Dimension(0.0_px), attributes.transformOrigin.second);
517 }
518 
519 /**
520  * @tc.name: ParseTransformOriginInvalidTest002
521  * @tc.desc: parse transform-origin label
522  * @tc.type: FUNC
523  */
524 HWTEST_F(SvgTransformTestNg, ParseTransformOriginInvalidTest002, TestSize.Level1)
525 {
526     auto svgStream = SkMemoryStream::MakeCopy(TRANSFORM_ORIGIN_INVALID_EMPTY_SVG_LABEL.c_str(),
527         TRANSFORM_ORIGIN_INVALID_EMPTY_SVG_LABEL.length());
528     EXPECT_NE(svgStream, nullptr);
529     ImageSourceInfo src;
530     src.SetFillColor(Color::BLACK);
531     Testing::MockCanvas rSCanvas;
532     CallBack(rSCanvas);
533     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
534     EXPECT_NE(svgDom, nullptr);
535     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
536 
537     /* *
538      * @tc.steps: step1. get shape from svg.
539      * @tc.expected: shape is Effective.
540      */
541     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
542     EXPECT_NE(svgRect, nullptr);
543     svgDom->root_->SetSmoothEdge(1);
544     svgDom->root_->Draw(rSCanvas, Size(IMAGE_COMPONENT_WIDTH, IMAGE_COMPONENT_HEIGHT), Color::BLACK);
545 
546     /* *
547      * @tc.steps: step2. get transform-origin value from the shape.
548      * @tc.expected: transform-origin value is equal to svg source.
549      */
550     auto attributes = svgRect->attributes_;
551     std::vector<NG::TransformInfo> transformVec = attributes.transformVec;
552     EXPECT_EQ(Dimension(0.0f), attributes.transformOrigin.first);
553     EXPECT_EQ(Dimension(0.0_px), attributes.transformOrigin.second);
554 }
555 } // namespace OHOS::Ace::NG
556