• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-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 
18 #include "gtest/gtest.h"
19 
20 #define private public
21 #define protected public
22 
23 #include "include/core/SkStream.h"
24 #include "test/mock/core/common/mock_container.h"
25 #include "test/mock/core/rosen/mock_canvas.h"
26 
27 #include "base/memory/ace_type.h"
28 #include "core/components/common/layout/constants.h"
29 #include "core/components/common/properties/color.h"
30 #include "core/components/declaration/svg/svg_animate_declaration.h"
31 #include "core/components/declaration/svg/svg_circle_declaration.h"
32 #include "core/components/declaration/svg/svg_declaration.h"
33 #include "core/components/declaration/svg/svg_ellipse_declaration.h"
34 #include "core/components/declaration/svg/svg_fe_blend_declaration.h"
35 #include "core/components/declaration/svg/svg_fe_colormatrix_declaration.h"
36 #include "core/components/declaration/svg/svg_fe_composite_declaration.h"
37 #include "core/components/declaration/svg/svg_fe_declaration.h"
38 #include "core/components/declaration/svg/svg_fe_flood_declaration.h"
39 #include "core/components/declaration/svg/svg_fe_gaussianblur_declaration.h"
40 #include "core/components/declaration/svg/svg_filter_declaration.h"
41 #include "core/components/declaration/svg/svg_gradient_declaration.h"
42 #include "core/components/declaration/svg/svg_image_declaration.h"
43 #include "core/components/declaration/svg/svg_line_declaration.h"
44 #include "core/components/declaration/svg/svg_mask_declaration.h"
45 #include "core/components/declaration/svg/svg_path_declaration.h"
46 #include "core/components/declaration/svg/svg_pattern_declaration.h"
47 #include "core/components/declaration/svg/svg_polygon_declaration.h"
48 #include "core/components/declaration/svg/svg_rect_declaration.h"
49 #include "core/components/declaration/svg/svg_stop_declaration.h"
50 #include "core/components_ng/render/drawing.h"
51 #include "core/components_ng/svg/parse/svg_animation.h"
52 #include "core/components_ng/svg/parse/svg_circle.h"
53 #include "core/components_ng/svg/parse/svg_clip_path.h"
54 #include "core/components_ng/svg/parse/svg_defs.h"
55 #include "core/components_ng/svg/parse/svg_ellipse.h"
56 #include "core/components_ng/svg/parse/svg_fe_blend.h"
57 #include "core/components_ng/svg/parse/svg_fe_color_matrix.h"
58 #include "core/components_ng/svg/parse/svg_fe_composite.h"
59 #include "core/components_ng/svg/parse/svg_fe_flood.h"
60 #include "core/components_ng/svg/parse/svg_fe_gaussian_blur.h"
61 #include "core/components_ng/svg/parse/svg_fe_offset.h"
62 #include "core/components_ng/svg/parse/svg_filter.h"
63 #include "core/components_ng/svg/parse/svg_g.h"
64 #include "core/components_ng/svg/parse/svg_gradient.h"
65 #include "core/components_ng/svg/parse/svg_image.h"
66 #include "core/components_ng/svg/parse/svg_line.h"
67 #include "core/components_ng/svg/parse/svg_mask.h"
68 #include "core/components_ng/svg/parse/svg_path.h"
69 #include "core/components_ng/svg/parse/svg_pattern.h"
70 #include "core/components_ng/svg/parse/svg_polygon.h"
71 #include "core/components_ng/svg/parse/svg_rect.h"
72 #include "core/components_ng/svg/parse/svg_stop.h"
73 #include "core/components_ng/svg/parse/svg_style.h"
74 #include "core/components_ng/svg/parse/svg_svg.h"
75 #include "core/components_ng/svg/parse/svg_use.h"
76 #include "core/components_ng/svg/parse/svg_radial_gradient.h"
77 #include "core/components_ng/svg/parse/svg_linear_gradient.h"
78 #include "core/components_ng/svg/svg_dom.h"
79 
80 using namespace testing;
81 using namespace testing::ext;
82 namespace OHOS::Ace::NG {
83 namespace {
84 const std::string PATTERN_SVG_LABEL =
85     "<svg width=\"210\" height=\"210\" xmlns=\"http://www.w3.org/2000/svg\">"
86     "<defs>"
87     "<pattern id=\"pattern1\"  x=\"0\" y=\"0\" width=\"0.5\" height=\"0.5\" >"
88     "<rect x=\"0\" y=\"0\" width=\"50\" height=\"50\" fill=\"red\" />"
89     "<rect x=\"50\" y=\"50\" width=\"50\" height=\"50\" fill=\"blue\" />"
90     "</pattern>"
91     "</defs>"
92     "<rect x=\"10\" y=\"10\" width=\"200\" height=\"200\" fill=\"url(#pattern1)\" />"
93     "</svg>";
94 
95 const std::string CLIPPATH_EVENODD_SVG_LABEL =
96     "<svg width=\"200\" height=\"200\" viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\">"
97     "<defs>"
98     "<clipPath id=\"starClip\"  clip-rule=\"evenodd\" clipPathUnits=\"objectBoundingBox\" fill-rule=\"evenodd\">"
99     "<rect x=\"0.2\" y=\"0.2\" width=\"0.7\" height=\"0.6\" />  "
100     "</clipPath>"
101     "</defs>"
102     "<rect x=\"0\" y=\"0\" width=\"200\" height=\"200\" fill=\"red\" clip-path=\"url(#starClip)\" />"
103     "</svg>";
104 
105 const std::string CLIPPATH_DEFAULT_SVG_LABEL =
106     "<svg width=\"200\" height=\"200\" viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\">"
107     "<defs>"
108     "<clipPath id=\"starClip\"  clipPathUnits=\"objectBoundingBox\" fill-rule=\"evenodd\">"
109     "<path d=\"M 0.5,0.05 L 0.2,0.99 L 0.95,0.39 L 0.05,0.39 L 0.8,0.99 Z\" /> "
110     "</clipPath>"
111     "</defs>"
112     "<rect x=\"0\" y=\"0\" width=\"200\" height=\"200\" fill=\"red\" clip-path=\"url(#starClip)\" />"
113     "</svg>";
114 
115 const std::string MASK_SVG_LABEL =
116     "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\">"
117     "<defs>"
118     "<mask id=\"mask1\" maskContentUnits=\"objectBoundingBox\">"
119     "<rect x=\"0\" y=\"0\" width=\"1\" height=\"1\" fill=\"red\" />"
120     "</mask>"
121     "</defs>"
122     "<rect x=\"50\" y=\"50\" width=\"100\" height=\"100\" fill=\"blue\" mask=\"url(#mask1)\" />"
123     "</svg>";
124 
125 const std::string FILTER_SVG_LABEL =
126     "<svg width=\"300\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\">"
127     "<defs>"
128     "<filter id=\"blurObjectBBox\" primitiveUnits=\"objectBoundingBox\">"
129     "<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"0.1, 0.1\" />"
130     "</filter>"
131     "</defs>"
132     "<rect x=\"10\" y=\"10\" width=\"100\" height=\"100\" fill=\"green\" filter=\"url(#blurObjectBBox)\" />"
133     "</svg>";
134 
135 const std::string RADIAL_GRADIENT_SVG_LABEL =
136     "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\">"
137     "<defs>"
138     "<radialGradient id=\"grad1\" cx=\"50%\" cy=\"50%\" r=\"50%\" fx=\"50%\" fy=\"50%\" "
139     "gradientUnits=\"objectBoundingBox\" "
140     "spreadMethod=\"pad\" gradientTransform=\"rotate(30)\" >"
141     "<stop offset=\"0%\" style=\"stop-color:rgb(255,0,0); stop-opacity:1\" />"
142     "<stop offset=\"100%\" style=\"stop-color:rgb(0,0,255); stop-opacity:1\" />"
143     "</radialGradient>"
144     "</defs>"
145     "<rect x=\"10\" y=\"10\" width=\"180\" height=\"180\" fill=\"url(#grad1)\" />"
146     "</svg>";
147 
148 const std::string STROKE_RADIAL_GRADIENT_SVG_LABEL =
149     "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\">"
150     "<defs>"
151     "<radialGradient id=\"grad1\" cx=\"50%\" cy=\"50%\" r=\"50%\" fx=\"50%\" fy=\"50%\" "
152     "gradientUnits=\"objectBoundingBox\" "
153     "spreadMethod=\"pad\" gradientTransform=\"rotate(30)\" >"
154     "<stop offset=\"0%\" style=\"stop-color:rgb(255,0,0); stop-opacity:1\" />"
155     "<stop offset=\"100%\" style=\"stop-color:rgb(0,0,255); stop-opacity:1\" />"
156     "</radialGradient>"
157     "</defs>"
158     "<rect x=\"10\" y=\"10\" width=\"180\" height=\"180\" fill=\"none\" stroke=\"url(#grad1)\" />"
159     "</svg>";
160 
161 const std::string RECT_SVG_LABEL =
162     "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\">"
163     "<rect x=\"10\" y=\"10\" width=\"180\" height=\"180\" fill=\"red\" />"
164     "</svg>";
165 
166 const std::string STROKE_RECT_SVG_LABEL =
167     "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\">"
168     "<rect x=\"10\" y=\"10\" width=\"180\" height=\"180\" fill=\"none\" stroke=\"red\" />"
169     "</svg>";
170 
171 const std::string LINEAR_GRADIENT_SVG_LABEL =
172     "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">"
173     "<defs>"
174     "    <linearGradient id=\"grad1\" x1=\"10%\" y1=\"-10%\" x2=\"0\" y2=\"10%\">"
175     "        <stop offset=\"0%\" style=\"stop-color:rgb(255,255,0);stop-opacity:1\" />"
176     "        <stop offset=\"100%\" style=\"stop-color:rgb(255,0,0);stop-opacity:1\" />"
177     "    </linearGradient>"
178     "</defs>"
179     "<rect x=\"10\" y=\"10\" width=\"180\" height=\"180\" fill=\"url(#grad1)\" />"
180     "</svg>";
181 
182 const std::string STROKE_LINEAR_GRADIENT_SVG_LABEL =
183     "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">"
184     "<defs>"
185     "    <linearGradient id=\"grad1\" x1=\"10%\" y1=\"-10%\" x2=\"0\" y2=\"10%\">"
186     "        <stop offset=\"0%\" style=\"stop-color:rgb(255,255,0);stop-opacity:1\" />"
187     "        <stop offset=\"100%\" style=\"stop-color:rgb(255,0,0);stop-opacity:1\" />"
188     "    </linearGradient>"
189     "</defs>"
190     "<rect x=\"10\" y=\"10\" width=\"180\" height=\"180\" fill=\"none\" stroke=\"url(#grad1)\" />"
191     "</svg>";
192 
193 std::unordered_map<std::string, std::shared_ptr<RSImageFilter>> resultHash;
194 } // namespace
195 class ParseTestThreeNg : public testing::Test {
196 public:
SetUpTestSuite()197     static void SetUpTestSuite()
198     {
199         MockContainer::SetUp();
200     }
TearDownTestSuite()201     static void TearDownTestSuite()
202     {
203         MockContainer::TearDown();
204     }
205 };
206 
207 /**
208  * @tc.name: GetLengthTest001
209  * @tc.desc: SvgNode GetRegionLength and GetMeasuredLength test
210  * @tc.type: FUNC
211  */
212 HWTEST_F(ParseTestThreeNg, GetRegionLengthTest001, TestSize.Level1)
213 {
214     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
215     EXPECT_NE(svgNode, nullptr);
216     auto dimension = Dimension(1.0, DimensionUnit::PERCENT);
217     Rect containerRect(0, 0, 1, 1);
218     Size viewPort(1, 1);
219     SvgCoordinateSystemContext svgCoordinateSystemContext(containerRect, viewPort);
220     SvgLengthScaleRule rule =
221         svgCoordinateSystemContext.BuildScaleRule(OHOS::Ace::NG::SvgLengthScaleUnit::USER_SPACE_ON_USE);
222     SvgLengthType svgLengthType = SvgLengthType::HORIZONTAL;
223     EXPECT_EQ(svgNode->GetRegionLength(dimension, rule, svgLengthType), 1.0);
224     EXPECT_EQ(svgNode->GetMeasuredLength(dimension, rule, svgLengthType), 1.0);
225     svgLengthType = SvgLengthType::VERTICAL;
226     EXPECT_EQ(svgNode->GetRegionLength(dimension, rule, svgLengthType), 1.0);
227     EXPECT_EQ(svgNode->GetMeasuredLength(dimension, rule, svgLengthType), 1.0);
228     svgLengthType = SvgLengthType::OTHER;
229     EXPECT_EQ(svgNode->GetRegionLength(dimension, rule, svgLengthType), 1.0);
230     EXPECT_EQ(svgNode->GetMeasuredLength(dimension, rule, svgLengthType), 1.0);
231 }
232 
233 /**
234  * @tc.name: GetRegionLengthTest002
235  * @tc.desc: SvgNode GetRegionLength and GetMeasuredLength test
236  * @tc.type: FUNC
237  */
238 HWTEST_F(ParseTestThreeNg, GetRegionLengthTest002, TestSize.Level1)
239 {
240     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
241     auto dimension = Dimension(1.0, DimensionUnit::PERCENT);
242     Rect containerRect(0, 0, 1, 1);
243     Size viewPort(1, 1);
244     SvgCoordinateSystemContext svgCoordinateSystemContext(containerRect, viewPort);
245     SvgLengthScaleRule rule =
246         svgCoordinateSystemContext.BuildScaleRule(OHOS::Ace::NG::SvgLengthScaleUnit::OBJECT_BOUNDING_BOX);
247     SvgLengthType svgLengthType = SvgLengthType::HORIZONTAL;
248     EXPECT_EQ(svgNode->GetRegionLength(dimension, rule, svgLengthType), 1.0);
249     EXPECT_EQ(svgNode->GetMeasuredLength(dimension, rule, svgLengthType), 1.0);
250     svgLengthType = SvgLengthType::VERTICAL;
251     EXPECT_EQ(svgNode->GetRegionLength(dimension, rule, svgLengthType), 1.0);
252     EXPECT_EQ(svgNode->GetMeasuredLength(dimension, rule, svgLengthType), 1.0);
253     svgLengthType = SvgLengthType::OTHER;
254     EXPECT_EQ(svgNode->GetRegionLength(dimension, rule, svgLengthType), 1.0);
255     EXPECT_EQ(svgNode->GetMeasuredLength(dimension, rule, svgLengthType), 1.0);
256 }
257 
258 /**
259  * @tc.name: GetRegionPositionTest001
260  * @tc.desc: SvgNode GetRegionPosition and GetMeasuredPosition test
261  * @tc.type: FUNC
262  */
263 HWTEST_F(ParseTestThreeNg, GetPositionTest001, TestSize.Level1)
264 {
265     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
266     auto dimension = Dimension(1.0, DimensionUnit::PERCENT);
267     Rect containerRect(0, 0, 1, 1);
268     Size viewPort(1, 1);
269     SvgCoordinateSystemContext svgCoordinateSystemContext(containerRect, viewPort);
270     SvgLengthScaleRule rule =
271         svgCoordinateSystemContext.BuildScaleRule(OHOS::Ace::NG::SvgLengthScaleUnit::USER_SPACE_ON_USE);
272     SvgLengthType svgLengthType = SvgLengthType::HORIZONTAL;
273     EXPECT_EQ(svgNode->GetRegionPosition(dimension, rule, svgLengthType), 1.0);
274     EXPECT_EQ(svgNode->GetMeasuredPosition(dimension, rule, svgLengthType), 1.0);
275     svgLengthType = SvgLengthType::VERTICAL;
276     EXPECT_EQ(svgNode->GetRegionPosition(dimension, rule, svgLengthType), 1.0);
277     EXPECT_EQ(svgNode->GetMeasuredPosition(dimension, rule, svgLengthType), 1.0);
278     svgLengthType = SvgLengthType::OTHER;
279     EXPECT_EQ(svgNode->GetRegionPosition(dimension, rule, svgLengthType), 0.0);
280     EXPECT_EQ(svgNode->GetMeasuredPosition(dimension, rule, svgLengthType), 0.0);
281 }
282 
283 /**
284  * @tc.name: GetRegionPositionTest002
285  * @tc.desc: SvgNode GetRegionPosition and GetMeasuredPosition test
286  * @tc.type: FUNC
287  */
288 HWTEST_F(ParseTestThreeNg, GetRegionPositionTest002, TestSize.Level1)
289 {
290     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
291     auto dimension = Dimension(1.0, DimensionUnit::PERCENT);
292     Rect containerRect(0, 0, 1, 1);
293     Size viewPort(1, 1);
294     SvgCoordinateSystemContext svgCoordinateSystemContext(containerRect, viewPort);
295     SvgLengthScaleRule rule =
296         svgCoordinateSystemContext.BuildScaleRule(OHOS::Ace::NG::SvgLengthScaleUnit::OBJECT_BOUNDING_BOX);
297     SvgLengthType svgLengthType = SvgLengthType::HORIZONTAL;
298     EXPECT_EQ(svgNode->GetRegionPosition(dimension, rule, svgLengthType), 1.0);
299     EXPECT_EQ(svgNode->GetMeasuredPosition(dimension, rule, svgLengthType), 1.0);
300     svgLengthType = SvgLengthType::VERTICAL;
301     EXPECT_EQ(svgNode->GetRegionPosition(dimension, rule, svgLengthType), 1.0);
302     EXPECT_EQ(svgNode->GetMeasuredPosition(dimension, rule, svgLengthType), 1.0);
303     svgLengthType = SvgLengthType::OTHER;
304     EXPECT_EQ(svgNode->GetRegionPosition(dimension, rule, svgLengthType), 0.0);
305     EXPECT_EQ(svgNode->GetMeasuredPosition(dimension, rule, svgLengthType), 0.0);
306 }
307 
308 /**
309  * @tc.name: ConvertDimensionToPxTest001
310  * @tc.desc: ConvertDimensionToPx test
311  * @tc.type: FUNC
312  */
313 HWTEST_F(ParseTestThreeNg, ConvertDimensionToPxTest001, TestSize.Level1)
314 {
315     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
316     auto dimension = Dimension(0.1, DimensionUnit::PERCENT);
317     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
318     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
319     Size viewPort(1, 1);
320     SvgLengthType svgLengthType = SvgLengthType::OTHER;
321     EXPECT_FLOAT_EQ(svgNode->ConvertDimensionToPx(dimension, viewPort, svgLengthType), 0.1);
322     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
323 }
324 
325 /**
326  * @tc.name: SvgImageCalcDstRectTest001
327  * @tc.desc: test CalcDstRect
328  * @tc.type: FUNC
329  */
330 HWTEST_F(ParseTestThreeNg, SvgImageCalcDstRectTest001, TestSize.Level1)
331 {
332     auto svgImage = AceType::DynamicCast<SvgImage>(SvgImage::Create());
333     EXPECT_NE(svgImage, nullptr);
334     Size imageSize(1.0, 1.0);
335     Rect containerRect (0, 0, 1.0, 1.0);
336     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
337     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
338     auto dstRect = svgImage->CalcDstRect(imageSize, containerRect);
339     EXPECT_FLOAT_EQ(dstRect.GetLeft(), 0.0);
340     EXPECT_FLOAT_EQ(dstRect.GetRight(), 1.0);
341     EXPECT_FLOAT_EQ(dstRect.GetTop(), 0.0);
342     EXPECT_FLOAT_EQ(dstRect.GetBottom(), 1.0);
343     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
344 }
345 
346 /**
347  * @tc.name: SvgPatternTest001
348  * @tc.desc: SvgPattern test
349  * @tc.type: FUNC
350  */
351 HWTEST_F(ParseTestThreeNg, SvgPatternTest001, TestSize.Level1)
352 {
353     auto svgStream = SkMemoryStream::MakeCopy(PATTERN_SVG_LABEL.c_str(), PATTERN_SVG_LABEL.length());
354     ImageSourceInfo src;
355     Size size = { 100, 100 };
356     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
357     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
358     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
359     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
360     EXPECT_GT(svg->children_.size(), 0);
361     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
362     EXPECT_NE(svgDefs, nullptr);
363     auto svgPattern = AceType::DynamicCast<SvgPattern>(svgDefs->children_.at(0));
364     EXPECT_NE(svgPattern, nullptr);
__anon6aab9cd50202()365     svgDom->SetAnimationOnFinishCallback([](){});
366     svgDom->SetColorFilter(std::nullopt);
367     Testing::MockCanvas rSCanvas;
368     Testing::TestingBrush rSBrush;
369     Rect containerRect(0, 0, 1, 1);
370     Size viewPort(1, 1);
371     SvgCoordinateSystemContext context(containerRect, viewPort);
372     EXPECT_CALL(rSCanvas, Save());
373     EXPECT_CALL(rSCanvas, Restore());
374     svgPattern->OnPatternEffect(rSCanvas, rSBrush, context);
375     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
376 }
377 
378 /**
379  * @tc.name: SvgPatternTest002
380  * @tc.desc: SvgPattern test
381  * @tc.type: FUNC
382  */
383 HWTEST_F(ParseTestThreeNg, SvgPatternTest002, TestSize.Level1)
384 {
385     auto svgStream = SkMemoryStream::MakeCopy(PATTERN_SVG_LABEL.c_str(), PATTERN_SVG_LABEL.length());
386     ImageSourceInfo src;
387     Size size = { 100, 100 };
388     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
389     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
390     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
391     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
392     EXPECT_GT(svg->children_.size(), 0);
393     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
394     EXPECT_NE(svgDefs, nullptr);
395     auto svgPattern = AceType::DynamicCast<SvgPattern>(svgDefs->children_.at(0));
396     EXPECT_NE(svgPattern, nullptr);
__anon6aab9cd50302()397     svgDom->SetAnimationOnFinishCallback([](){});
398     svgDom->SetColorFilter(std::nullopt);
399     Testing::MockCanvas rSCanvas;
400     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
401     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
402     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
403     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
404     EXPECT_CALL(rSCanvas, Save()).Times(3);
405     EXPECT_CALL(rSCanvas, Restore());
406     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(2);
407     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
408     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
409 }
410 
411 /**
412  * @tc.name: ComputeScaleTest001
413  * @tc.desc: ComputeScale test
414  * @tc.type: FUNC
415  */
416 HWTEST_F(ParseTestThreeNg, ComputeScaleTest001, TestSize.Level1)
417 {
418     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
419     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
420     SvgPreserveAspectRatio preserveAspectRatio;
421     Size viewBox = {0.0, 0.0};
422     Size viewPort = {1.0, 1.0};
423     float scaleX = 1.0;
424     float scaleY = 1.0;
425     SvgAttributesParser::ComputeScale(viewBox, viewPort, preserveAspectRatio, scaleX, scaleY);
426     EXPECT_FLOAT_EQ(scaleX, 1.0);
427     EXPECT_FLOAT_EQ(scaleY, 1.0);
428     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
429 }
430 
431 /**
432  * @tc.name: ParseDimensionTest001
433  * @tc.desc: ParseDimension test
434  * @tc.type: FUNC
435  */
436 HWTEST_F(ParseTestThreeNg, ParseDimensionTest001, TestSize.Level1)
437 {
438     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
439     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_FOURTEEN));
440     std::string val = "10";
441     Dimension y = Dimension(-0.1, DimensionUnit::PERCENT);
442     SvgAttributesParser::ParseDimension(val, y);
443     EXPECT_FLOAT_EQ(y.Value(), 10);
444     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
445     SvgAttributesParser::ParseDimension(val, y);
446     EXPECT_FLOAT_EQ(y.Value(), 10);
447     y = Dimension(-0.1, DimensionUnit::PERCENT);
448     val = "auto";
449     SvgAttributesParser::ParseDimension(val, y);
450     EXPECT_FLOAT_EQ(y.Value(), -0.1);
451     val = " ";
452     y = Dimension(-0.1, DimensionUnit::PERCENT);
453     SvgAttributesParser::ParseDimension(val, y);
454     EXPECT_FLOAT_EQ(y.Value(), -0.1);
455     val = "20%";
456     y = Dimension(-0.1, DimensionUnit::PERCENT);
457     SvgAttributesParser::ParseDimension(val, y);
458     EXPECT_FLOAT_EQ(y.Value(), 0.2);
459     val = "10px";
460     y = Dimension(-0.1, DimensionUnit::PERCENT);
461     SvgAttributesParser::ParseDimension(val, y);
462     EXPECT_FLOAT_EQ(y.Value(), 10);
463     val = "10vp";
464     y = Dimension(-0.1, DimensionUnit::PERCENT);
465     SvgAttributesParser::ParseDimension(val, y);
466     EXPECT_FLOAT_EQ(y.Value(), 10);
467     val = "10lpx";
468     y = Dimension(-0.1, DimensionUnit::PERCENT);
469     SvgAttributesParser::ParseDimension(val, y);
470     EXPECT_FLOAT_EQ(y.Value(), 10);
471     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
472 }
473 
474 /**
475  * @tc.name: TransformForCurrentOBBTest001
476  * @tc.desc: TransformForCurrentOBB test
477  * @tc.type: FUNC
478  */
479 HWTEST_F(ParseTestThreeNg, TransformForCurrentOBBTest001, TestSize.Level1)
480 {
481     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
482     Rect containerRect(0, 0, 1, 1);
483     Size viewPort(1, 1);
484     SvgCoordinateSystemContext context(containerRect, viewPort);
485     auto rule = svgNode->BuildContentScaleRule(context, OHOS::Ace::NG::SvgLengthScaleUnit::USER_SPACE_ON_USE);
486     EXPECT_EQ(rule.GetLengthScaleUnit(), OHOS::Ace::NG::SvgLengthScaleUnit::USER_SPACE_ON_USE);
487     Testing::MockCanvas rSCanvas;
488     svgNode->TransformForCurrentOBB(rSCanvas, rule, containerRect.GetSize(), Offset(0.0, 0.0));
489 }
490 
491 /**
492  * @tc.name: TransformForCurrentOBBTest002
493  * @tc.desc: TransformForCurrentOBB test
494  * @tc.type: FUNC
495  */
496 HWTEST_F(ParseTestThreeNg, TransformForCurrentOBBTest002, TestSize.Level1)
497 {
498     auto svgNode = AccessibilityManager::MakeRefPtr<SvgNode>();
499     Rect containerRect(0, 0, 1, 1);
500     Size viewPort(1, 1);
501     SvgCoordinateSystemContext context(containerRect, viewPort);
502     auto rule = svgNode->BuildContentScaleRule(context, OHOS::Ace::NG::SvgLengthScaleUnit::OBJECT_BOUNDING_BOX);
503     EXPECT_EQ(rule.GetLengthScaleUnit(), OHOS::Ace::NG::SvgLengthScaleUnit::OBJECT_BOUNDING_BOX);
504     Testing::MockCanvas rSCanvas;
505     EXPECT_CALL(rSCanvas, Translate(_, _));
506     EXPECT_CALL(rSCanvas, Scale(_, _));
507     svgNode->TransformForCurrentOBB(rSCanvas, rule, containerRect.GetSize(), Offset(0.0, 0.0));
508 }
509 
510 /**
511  * @tc.name: ClipPathEvenoddTest001
512  * @tc.desc: ClipPath Evenodd label
513  * @tc.type: FUNC
514  */
515 HWTEST_F(ParseTestThreeNg, ClipPathEvenoddTest001, TestSize.Level1)
516 {
517     auto svgStream =
518         SkMemoryStream::MakeCopy(CLIPPATH_EVENODD_SVG_LABEL.c_str(), CLIPPATH_EVENODD_SVG_LABEL.length());
519     ImageSourceInfo src;
520     Size size = { 100, 100 };
521     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
522     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
523     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
524     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
525     EXPECT_GT(svg->children_.size(), 0);
526     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
527     EXPECT_NE(svgDefs, nullptr);
528     auto svgClipPath = AceType::DynamicCast<SvgClipPath>(svgDefs->children_.at(0));
529     EXPECT_NE(svgClipPath, nullptr);
__anon6aab9cd50402()530     svgDom->SetAnimationOnFinishCallback([](){});
531     svgDom->SetColorFilter(std::nullopt);
532     Testing::MockCanvas rSCanvas;
533     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
534     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
535     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
536     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
537     EXPECT_CALL(rSCanvas, Save()).Times(3);
538     EXPECT_CALL(rSCanvas, Translate(_, _)).Times(2);
539     EXPECT_CALL(rSCanvas, Scale(_, _));
540     EXPECT_CALL(rSCanvas, Restore());
541     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(2);
542     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
543     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
544 }
545 
546 /**
547  * @tc.name: ClipPathDefaultTest001
548  * @tc.desc: ClipPath Default label
549  * @tc.type: FUNC
550  */
551 HWTEST_F(ParseTestThreeNg, ClipPathDefaultTest001, TestSize.Level1)
552 {
553     auto svgStream =
554         SkMemoryStream::MakeCopy(CLIPPATH_DEFAULT_SVG_LABEL.c_str(), CLIPPATH_DEFAULT_SVG_LABEL.length());
555     ImageSourceInfo src;
556     Size size = { 100, 100 };
557     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
558     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
559     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
560     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
561     EXPECT_GT(svg->children_.size(), 0);
562     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
563     EXPECT_NE(svgDefs, nullptr);
564     auto svgClipPath = AceType::DynamicCast<SvgClipPath>(svgDefs->children_.at(0));
565     EXPECT_NE(svgClipPath, nullptr);
__anon6aab9cd50502()566     svgDom->SetAnimationOnFinishCallback([](){});
567     svgDom->SetColorFilter(std::nullopt);
568     Testing::MockCanvas rSCanvas;
569     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
570     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
571     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
572     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
573     EXPECT_CALL(rSCanvas, Save()).Times(3);
574     EXPECT_CALL(rSCanvas, Translate(_, _)).Times(2);
575     EXPECT_CALL(rSCanvas, Scale(_, _));
576     EXPECT_CALL(rSCanvas, Restore());
577     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(2);
578     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
579     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
580 }
581 
582 /**
583  * @tc.name: MaskTest001
584  * @tc.desc: mask label
585  * @tc.type: FUNC
586  */
587 HWTEST_F(ParseTestThreeNg, MaskTest001, TestSize.Level1)
588 {
589     auto svgStream =
590         SkMemoryStream::MakeCopy(MASK_SVG_LABEL.c_str(), MASK_SVG_LABEL.length());
591     ImageSourceInfo src;
592     Size size = { 100, 100 };
593     src.SetFillColor(Color::GREEN);
594     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
595     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
596     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
597     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
598     EXPECT_GT(svg->children_.size(), 0);
599     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
600     EXPECT_NE(svgDefs, nullptr);
601     auto svgMask = AceType::DynamicCast<SvgMask>(svgDefs->children_.at(0));
602     EXPECT_NE(svgMask, nullptr);
__anon6aab9cd50602()603     svgDom->SetAnimationOnFinishCallback([](){});
604     svgDom->SetColorFilter(std::nullopt);
605     Testing::MockCanvas rSCanvas;
606     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
607     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
608     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
609     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
610     EXPECT_CALL(rSCanvas, Save()).Times(4);
611     EXPECT_CALL(rSCanvas, Restore());
612     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(3);
613     EXPECT_CALL(rSCanvas, SaveLayer(_)).Times(2);
614     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
615     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
616 }
617 
618 /**
619  * @tc.name: MaskTest002
620  * @tc.desc: mask label
621  * @tc.type: FUNC
622  */
623 HWTEST_F(ParseTestThreeNg, MaskTest002, TestSize.Level1)
624 {
625     auto svgStream =
626         SkMemoryStream::MakeCopy(MASK_SVG_LABEL.c_str(), MASK_SVG_LABEL.length());
627     ImageSourceInfo src;
628     Size size = { 100, 100 };
629     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
630     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
631     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
632     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
633     EXPECT_GT(svg->children_.size(), 0);
634     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
635     EXPECT_NE(svgDefs, nullptr);
636     auto svgMask = AceType::DynamicCast<SvgMask>(svgDefs->children_.at(0));
637     EXPECT_NE(svgMask, nullptr);
__anon6aab9cd50702()638     svgDom->SetAnimationOnFinishCallback([](){});
639     svgDom->SetColorFilter(std::nullopt);
640     Testing::MockCanvas rSCanvas;
641     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
642     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
643     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
644     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
645     EXPECT_CALL(rSCanvas, Save()).Times(4);
646     EXPECT_CALL(rSCanvas, Restore());
647     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(3);
648     EXPECT_CALL(rSCanvas, SaveLayer(_)).Times(2);
649     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
650     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
651 }
652 
653 /**
654  * @tc.name: FilterTest001
655  * @tc.desc: Filter label
656  * @tc.type: FUNC
657  */
658 HWTEST_F(ParseTestThreeNg, FilterTest001, TestSize.Level1)
659 {
660     auto svgStream =
661         SkMemoryStream::MakeCopy(FILTER_SVG_LABEL.c_str(), FILTER_SVG_LABEL.length());
662     ImageSourceInfo src;
663     Size size = { 100, 100 };
664     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
665     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
666     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
667     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
668     EXPECT_GT(svg->children_.size(), 0);
669     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
670     EXPECT_NE(svgDefs, nullptr);
671     auto svgFilter = AceType::DynamicCast<SvgFilter>(svgDefs->children_.at(0));
672     EXPECT_NE(svgFilter, nullptr);
__anon6aab9cd50802()673     svgDom->SetAnimationOnFinishCallback([](){});
674     svgDom->SetColorFilter(std::nullopt);
675     Testing::MockCanvas rSCanvas;
676     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
677     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
678     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
679     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
680     EXPECT_CALL(rSCanvas, Save()).Times(3);
681     EXPECT_CALL(rSCanvas, Restore());
682     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(2);
683     EXPECT_CALL(rSCanvas, SaveLayer(_)).Times(1);
684     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
685     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
686 }
687 
688 /**
689  * @tc.name: SvgRadialGradientTest001
690  * @tc.desc: SvgRadialGradient label
691  * @tc.type: FUNC
692  */
693 HWTEST_F(ParseTestThreeNg, SvgRadialGradientTest001, TestSize.Level1)
694 {
695     auto svgStream =
696         SkMemoryStream::MakeCopy(RADIAL_GRADIENT_SVG_LABEL.c_str(), RADIAL_GRADIENT_SVG_LABEL.length());
697     ImageSourceInfo src;
698     Size size = { 100, 100 };
699     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
700     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
701     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
702     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
703     EXPECT_GT(svg->children_.size(), 0);
704     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
705     EXPECT_NE(svgDefs, nullptr);
706     auto svgRadialGradient = AceType::DynamicCast<SvgRadialGradient>(svgDefs->children_.at(0));
707     EXPECT_NE(svgRadialGradient, nullptr);
__anon6aab9cd50902()708     svgDom->SetAnimationOnFinishCallback([](){});
709     svgDom->SetColorFilter(std::nullopt);
710     Testing::MockCanvas rSCanvas;
711     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
712     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
713     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
714     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
715     EXPECT_CALL(rSCanvas, Save()).Times(3);
716     EXPECT_CALL(rSCanvas, Restore());
717     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(2);
718     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
719     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
720 }
721 
722 
723 /**
724  * @tc.name: SvgLinearGradientTest001
725  * @tc.desc: SvgLinearGradient
726  * @tc.type: FUNC
727  */
728 HWTEST_F(ParseTestThreeNg, SvgLinearGradientTest001, TestSize.Level1)
729 {
730     auto svgStream = SkMemoryStream::MakeCopy(LINEAR_GRADIENT_SVG_LABEL.c_str(), LINEAR_GRADIENT_SVG_LABEL.length());
731     ImageSourceInfo src;
732     Size size = { 100, 100 };
733     src.SetFillColor(Color::GREEN);
734     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
735     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
736     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
__anon6aab9cd50a02()737     svgDom->SetAnimationOnFinishCallback([](){});
738     svgDom->SetColorFilter(std::nullopt);
739     Testing::MockCanvas rSCanvas;
740     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
741     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
742     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
743     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
744     EXPECT_CALL(rSCanvas, Save()).Times(3);
745     EXPECT_CALL(rSCanvas, Restore());
746     EXPECT_CALL(rSCanvas, ClipRect(_, _, _)).Times(2);
747     svgDom->DrawImage(rSCanvas, ImageFit::CONTAIN, size);
748     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
749 }
750 
751 /**
752  * @tc.name: InitBrushTest001
753  * @tc.desc: InitBrush test
754  * @tc.type: FUNC
755  */
756 HWTEST_F(ParseTestThreeNg, InitBrushTest001, TestSize.Level1)
757 {
758     auto svgStream =
759         SkMemoryStream::MakeCopy(RECT_SVG_LABEL.c_str(), RECT_SVG_LABEL.length());
760     ImageSourceInfo src;
761     Size size = { 100, 100 };
762     src.SetFillColor(Color::GREEN);
763     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
764     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
765     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
766     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
767     EXPECT_GT(svg->children_.size(), 0);
768     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
769     EXPECT_NE(svgRect, nullptr);
770     Testing::TestingBrush rSBrush;
771     Testing::MockCanvas rSCanvas;
772     Rect containerRect(0, 0, 100, 100);
773     Size viewPort(100, 100);
774     SvgCoordinateSystemContext context(containerRect, viewPort);
775     OHOS::Ace::Gradient gradient;
776     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
777     gradient.AddColor(gradientColor);
778     svgRect->attributes_.fillState.SetGradient(gradient);
779     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::COLOR);
780     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::LINEAR_GRADIENT);
781     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::RADIAL_GRADIENT);
782     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::PATTERN);
783     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::NONE);
784     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
785 }
786 
787 /**
788  * @tc.name: InitBrushTest002
789  * @tc.desc: InitBrush test
790  * @tc.type: FUNC
791  */
792 HWTEST_F(ParseTestThreeNg, InitBrushTest002, TestSize.Level1)
793 {
794     auto svgStream =
795         SkMemoryStream::MakeCopy(RADIAL_GRADIENT_SVG_LABEL.c_str(), RADIAL_GRADIENT_SVG_LABEL.length());
796     ImageSourceInfo src;
797     Size size = { 100, 100 };
798     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
799     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
800     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
801     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
802     EXPECT_GT(svg->children_.size(), 0);
803     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
804     EXPECT_NE(svgDefs, nullptr);
805     auto svgRadialGradient = AceType::DynamicCast<SvgRadialGradient>(svgDefs->children_.at(0));
806     EXPECT_NE(svgRadialGradient, nullptr);
807     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(1));
808     EXPECT_NE(svgRect, nullptr);
809     Testing::TestingBrush rSBrush;
810     Testing::MockCanvas rSCanvas;
811     Rect containerRect(0, 0, 100, 100);
812     Size viewPort(100, 100);
813     SvgCoordinateSystemContext context(containerRect, viewPort);
814     OHOS::Ace::Gradient gradient;
815     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
816     gradient.AddColor(gradientColor);
817     svgRect->attributes_.fillState.SetGradient(gradient);
818     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::RADIAL_GRADIENT);
819     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
820 }
821 
822 /**
823  * @tc.name: InitBrushTest003
824  * @tc.desc: InitBrush label
825  * @tc.type: FUNC
826  */
827 HWTEST_F(ParseTestThreeNg, InitBrushTest003, TestSize.Level1)
828 {
829     auto svgStream =
830         SkMemoryStream::MakeCopy(LINEAR_GRADIENT_SVG_LABEL.c_str(), LINEAR_GRADIENT_SVG_LABEL.length());
831     ImageSourceInfo src;
832     Size size = { 100, 100 };
833     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
834     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
835     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
836     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
837     EXPECT_GT(svg->children_.size(), 0);
838     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
839     EXPECT_NE(svgDefs, nullptr);
840     auto svgLinearGradient = AceType::DynamicCast<SvgLinearGradient>(svgDefs->children_.at(0));
841     EXPECT_NE(svgLinearGradient, nullptr);
842     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(1));
843     EXPECT_NE(svgRect, nullptr);
844     Testing::TestingBrush rSBrush;
845     Testing::MockCanvas rSCanvas;
846     Rect containerRect(0, 0, 100, 100);
847     Size viewPort(100, 100);
848     SvgCoordinateSystemContext context(containerRect, viewPort);
849     OHOS::Ace::Gradient gradient;
850     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
851     gradient.AddColor(gradientColor);
852     svgRect->attributes_.fillState.SetGradient(gradient);
853     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::LINEAR_GRADIENT);
854     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
855 }
856 
857 /**
858  * @tc.name: InitBrushTest004
859  * @tc.desc: InitBrush test
860  * @tc.type: FUNC
861  */
862 HWTEST_F(ParseTestThreeNg, InitBrushTest004, TestSize.Level1)
863 {
864     auto svgStream =
865         SkMemoryStream::MakeCopy(PATTERN_SVG_LABEL.c_str(), PATTERN_SVG_LABEL.length());
866     ImageSourceInfo src;
867     Size size = { 100, 100 };
868     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
869     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
870     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
871     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
872     EXPECT_GT(svg->children_.size(), 0);
873     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
874     EXPECT_NE(svgDefs, nullptr);
875     auto svgPattern = AceType::DynamicCast<SvgPattern>(svgDefs->children_.at(0));
876     EXPECT_NE(svgPattern, nullptr);
877     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(1));
878     EXPECT_NE(svgRect, nullptr);
879     Testing::TestingBrush rSBrush;
880     Testing::MockCanvas rSCanvas;
881     EXPECT_CALL(rSCanvas, Save());
882     EXPECT_CALL(rSCanvas, Restore());
883     Rect containerRect(0, 0, 100, 100);
884     Size viewPort(100, 100);
885     SvgCoordinateSystemContext context(containerRect, viewPort);
886     OHOS::Ace::Gradient gradient;
887     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
888     gradient.AddColor(gradientColor);
889     svgRect->attributes_.fillState.SetGradient(gradient);
890     svgRect->InitBrush(rSCanvas, rSBrush, context, PaintType::PATTERN);
891     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
892 }
893 
894 /**
895  * @tc.name: InitPenFillTest001
896  * @tc.desc: InitPenFill test
897  * @tc.type: FUNC
898  */
899 HWTEST_F(ParseTestThreeNg, InitPenFillTest001, TestSize.Level1)
900 {
901     auto svgStream =
902         SkMemoryStream::MakeCopy(STROKE_RECT_SVG_LABEL.c_str(), STROKE_RECT_SVG_LABEL.length());
903     ImageSourceInfo src;
904     Size size = { 100, 100 };
905     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
906     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
907     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
908     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
909     EXPECT_GT(svg->children_.size(), 0);
910     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
911     EXPECT_NE(svgRect, nullptr);
912     Testing::TestingPen rSPen;
913     Rect containerRect(0, 0, 100, 100);
914     Size viewPort(100, 100);
915     SvgCoordinateSystemContext context(containerRect, viewPort);
916     OHOS::Ace::Gradient gradient;
917     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
918     gradient.AddColor(gradientColor);
919     svgRect->attributes_.fillState.SetGradient(gradient);
920     svgRect->InitPenFill(rSPen, context, PaintType::COLOR);
921     svgRect->InitPenFill(rSPen, context, PaintType::LINEAR_GRADIENT);
922     svgRect->InitPenFill(rSPen, context, PaintType::RADIAL_GRADIENT);
923     svgRect->InitPenFill(rSPen, context, PaintType::PATTERN);
924     svgRect->InitPenFill(rSPen, context, PaintType::NONE);
925     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
926 }
927 
928 /**
929  * @tc.name: InitPenFillTest002
930  * @tc.desc: InitPenFill test
931  * @tc.type: FUNC
932  */
933 HWTEST_F(ParseTestThreeNg, InitPenFillTest002, TestSize.Level1)
934 {
935     auto svgStream =
936         SkMemoryStream::MakeCopy(STROKE_RADIAL_GRADIENT_SVG_LABEL.c_str(), STROKE_RADIAL_GRADIENT_SVG_LABEL.length());
937     ImageSourceInfo src;
938     Size size = { 100, 100 };
939     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
940     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
941     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
942     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
943     EXPECT_GT(svg->children_.size(), 0);
944     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
945     EXPECT_NE(svgDefs, nullptr);
946     auto svgRadialGradient = AceType::DynamicCast<SvgRadialGradient>(svgDefs->children_.at(0));
947     EXPECT_NE(svgRadialGradient, nullptr);
948     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(1));
949     EXPECT_NE(svgRect, nullptr);
950     Testing::TestingPen rSPen;
951     Rect containerRect(0, 0, 100, 100);
952     Size viewPort(100, 100);
953     SvgCoordinateSystemContext context(containerRect, viewPort);
954     OHOS::Ace::Gradient gradient;
955     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
956     gradient.AddColor(gradientColor);
957     svgRect->attributes_.fillState.SetGradient(gradient);
958     svgRect->InitPenFill(rSPen, context, PaintType::RADIAL_GRADIENT);
959     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
960 }
961 
962 /**
963  * @tc.name: InitPenFillTest003
964  * @tc.desc: InitPenFill test
965  * @tc.type: FUNC
966  */
967 HWTEST_F(ParseTestThreeNg, InitPenFillTest003, TestSize.Level1)
968 {
969     auto svgStream =
970         SkMemoryStream::MakeCopy(STROKE_LINEAR_GRADIENT_SVG_LABEL.c_str(), STROKE_LINEAR_GRADIENT_SVG_LABEL.length());
971     ImageSourceInfo src;
972     Size size = { 100, 100 };
973     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
974     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
975     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
976     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
977     EXPECT_GT(svg->children_.size(), 0);
978     auto svgDefs = AceType::DynamicCast<SvgDefs>(svg->children_.at(0));
979     EXPECT_NE(svgDefs, nullptr);
980     auto svgLinearGradient = AceType::DynamicCast<SvgLinearGradient>(svgDefs->children_.at(0));
981     EXPECT_NE(svgLinearGradient, nullptr);
982     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(1));
983     EXPECT_NE(svgRect, nullptr);
984     Testing::TestingPen rSPen;
985     Rect containerRect(0, 0, 100, 100);
986     Size viewPort(100, 100);
987     SvgCoordinateSystemContext context(containerRect, viewPort);
988     OHOS::Ace::Gradient gradient;
989     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
990     gradient.AddColor(gradientColor);
991     svgRect->attributes_.fillState.SetGradient(gradient);
992     svgRect->InitPenFill(rSPen, context, PaintType::LINEAR_GRADIENT);
993     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
994 }
995 
996 /**
997  * @tc.name: GetLocalMatrixTest001
998  * @tc.desc: GetLocalMatrix test
999  * @tc.type: FUNC
1000  */
1001 HWTEST_F(ParseTestThreeNg, GetLocalMatrixTest001, TestSize.Level1)
1002 {
1003     auto svgStream =
1004         SkMemoryStream::MakeCopy(STROKE_RECT_SVG_LABEL.c_str(), STROKE_RECT_SVG_LABEL.length());
1005     ImageSourceInfo src;
1006     Size size = { 100, 100 };
1007     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
1008     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
1009     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
1010     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
1011     EXPECT_GT(svg->children_.size(), 0);
1012     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
1013     EXPECT_NE(svgRect, nullptr);
1014     Rect containerRect(0, 0, 100, 100);
1015     Size viewPort(100, 100);
1016     SvgCoordinateSystemContext context(containerRect, viewPort);
1017     auto rsMatrix = svgRect->GetLocalMatrix(SvgLengthScaleUnit::OBJECT_BOUNDING_BOX, context);
1018     rsMatrix = svgRect->GetLocalMatrix(SvgLengthScaleUnit::USER_SPACE_ON_USE, context);
1019     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
1020 }
1021 
1022 /**
1023  * @tc.name: GetFillTypeTest001
1024  * @tc.desc: GetFillType test
1025  * @tc.type: FUNC
1026  */
1027 HWTEST_F(ParseTestThreeNg, GetFillTypeTest001, TestSize.Level1)
1028 {
1029     auto svgStream =
1030         SkMemoryStream::MakeCopy(RECT_SVG_LABEL.c_str(), RECT_SVG_LABEL.length());
1031     ImageSourceInfo src;
1032     Size size = { 100, 100 };
1033     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
1034     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
1035     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
1036     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
1037     EXPECT_GT(svg->children_.size(), 0);
1038     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
1039     EXPECT_NE(svgRect, nullptr);
1040     auto fillType = svgRect->GetFillType();
1041     EXPECT_EQ(fillType, PaintType::COLOR);
1042     svgRect->attributes_.fillState.SetColor(Color::RED, false);
1043     OHOS::Ace::Gradient gradient;
1044     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
1045     gradient.AddColor(gradientColor);
1046     svgRect->attributes_.fillState.SetGradient(gradient);
1047     fillType = svgRect->GetFillType();
1048     EXPECT_EQ(fillType, PaintType::COLOR);
1049     gradient.SetHref("test");
1050     svgRect->attributes_.fillState.SetGradient(gradient);
1051     fillType = svgRect->GetFillType();
1052     EXPECT_EQ(fillType, PaintType::NONE);
1053     svgRect->attributes_.fillState.SetColor(Color::RED);
1054     fillType = svgRect->GetFillType();
1055     EXPECT_EQ(fillType, PaintType::NONE);
1056     svgRect->attributes_.fillState.SetHref("test");
1057     fillType = svgRect->GetFillType();
1058     EXPECT_EQ(fillType, PaintType::NONE);
1059     svgRect->attributes_.fillState.SetIsFillNone(true);
1060     fillType = svgRect->GetFillType();
1061     EXPECT_EQ(fillType, PaintType::NONE);
1062     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
1063 }
1064 
1065 /**
1066  * @tc.name: GetStrokeTypeTest001
1067  * @tc.desc: GetStrokeType test
1068  * @tc.type: FUNC
1069  */
1070 HWTEST_F(ParseTestThreeNg, GetStrokeTypeTest001, TestSize.Level1)
1071 {
1072     auto svgStream =
1073         SkMemoryStream::MakeCopy(STROKE_RECT_SVG_LABEL.c_str(), STROKE_RECT_SVG_LABEL.length());
1074     ImageSourceInfo src;
1075     Size size = { 100, 100 };
1076     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
1077     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
1078     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
1079     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
1080     EXPECT_GT(svg->children_.size(), 0);
1081     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
1082     EXPECT_NE(svgRect, nullptr);
1083     auto strokeType = svgRect->GetStrokeType();
1084     EXPECT_EQ(strokeType, PaintType::COLOR);
1085     svgRect->attributes_.strokeState.SetColor(Color::TRANSPARENT);
1086     strokeType = svgRect->GetStrokeType();
1087     EXPECT_EQ(strokeType, PaintType::NONE);
1088     svgRect->attributes_.strokeState.SetColor(Color::RED, false);
1089     OHOS::Ace::Gradient gradient;
1090     OHOS::Ace::GradientColor gradientColor(Color::BLACK);
1091     gradient.AddColor(gradientColor);
1092     svgRect->attributes_.strokeState.SetGradient(gradient);
1093     strokeType = svgRect->GetStrokeType();
1094     EXPECT_EQ(strokeType, PaintType::COLOR);
1095     gradient.SetHref("test");
1096     svgRect->attributes_.strokeState.SetGradient(gradient);
1097     strokeType = svgRect->GetStrokeType();
1098     EXPECT_EQ(strokeType, PaintType::NONE);
1099     svgRect->attributes_.strokeState.SetHref("test");
1100     strokeType = svgRect->GetStrokeType();
1101     EXPECT_EQ(strokeType, PaintType::NONE);
1102     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
1103 }
1104 
1105 /**
1106  * @tc.name: SetPenStyleTest001
1107  * @tc.desc: SetPenStyle test
1108  * @tc.type: FUNC
1109  */
1110 HWTEST_F(ParseTestThreeNg, SetPenStyleTest001, TestSize.Level1)
1111 {
1112     auto svgStream =
1113         SkMemoryStream::MakeCopy(STROKE_RECT_SVG_LABEL.c_str(), STROKE_RECT_SVG_LABEL.length());
1114     ImageSourceInfo src;
1115     Size size = { 100, 100 };
1116     int32_t backupApiVersion = MockContainer::Current()->GetApiTargetVersion();
1117     MockContainer::Current()->SetApiTargetVersion(static_cast<int32_t>(PlatformVersion::VERSION_EIGHTEEN));
1118     auto svgDom = SvgDom::CreateSvgDom(*svgStream, src);
1119     auto svg = AceType::DynamicCast<SvgSvg>(svgDom->root_);
1120     EXPECT_GT(svg->children_.size(), 0);
1121     auto svgRect = AceType::DynamicCast<SvgRect>(svg->children_.at(0));
1122     EXPECT_NE(svgRect, nullptr);
1123     Testing::TestingPen rSPen;
1124     svgRect->attributes_.strokeState.SetLineCap(LineCapStyle::ROUND);
1125     svgRect->SetPenStyle(rSPen);
1126     svgRect->attributes_.strokeState.SetLineCap(LineCapStyle::SQUARE);
1127     svgRect->SetPenStyle(rSPen);
1128     svgRect->attributes_.strokeState.SetLineCap(LineCapStyle::BUTT);
1129     svgRect->SetPenStyle(rSPen);
1130     svgRect->attributes_.strokeState.SetLineJoin(LineJoinStyle::ROUND);
1131     svgRect->SetPenStyle(rSPen);
1132     svgRect->attributes_.strokeState.SetLineJoin(LineJoinStyle::BEVEL);
1133     svgRect->SetPenStyle(rSPen);
1134     svgRect->attributes_.strokeState.SetLineJoin(LineJoinStyle::MITER);
1135     svgRect->SetPenStyle(rSPen);
1136         std::vector<double> segments = {4.0, 2.0, 6.0};
1137     svgRect->attributes_.strokeState.SetLineDash(segments);
1138     svgRect->SetPenStyle(rSPen);
1139     MockContainer::Current()->SetApiTargetVersion(backupApiVersion);
1140 }
1141 } // namespace OHOS::Ace::NG