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