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