1 /*
2  * Copyright (c) 2023 iSoftStone Information Technology (Group) 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 #include "gmock/gmock.h"
16 #include "gtest/gtest.h"
17 
18 #include "base/utils/utils.h"
19 #define protected public
20 #define private public
21 #include "test/mock/core/rosen/mock_canvas.h"
22 
23 #include "core/components_ng/render/border_image_painter.h"
24 
25 #undef private
26 #undef protected
27 
28 using namespace testing;
29 using namespace testing::ext;
30 
31 namespace OHOS::Ace {
32 namespace {
33 const NG::BorderWidthProperty BORDER_WIDTH_TEST = { 1.0_vp, 1.0_vp, 1.0_vp, 1.0_vp };
34 const NG::SizeF PAINTSIZE = { 5.0, 10.0 };
35 const NG::SizeF TEST_SIZE = { 100.0, 200.0 };
36 const NG::OffsetF OFFSET_F = { 1.0, 2.0 };
37 
38 const NG::DisplayScaleInfo DIPSCALE = { .vpScale = 10.0 };
39 const double FIVE = 5.0;
40 const double TWO = 2.0;
41 const double ONE = 1.0;
42 const double ZERO_TEST = 0.0;
43 const std::string SRC_IMAGES = "images/mmm.jpg";
44 
45 const Dimension DIMENSION_SLICE = 10.0_vp;
46 const Dimension DIMENSION_WIDTH = 30.0_vp;
47 const Dimension DIMENSION_OUTSET = 100.0_vp;
48 
49 const BorderImageDirection DIRECTION_LEFT = BorderImageDirection::LEFT;
50 const BorderImageDirection DIRECTION_RIGHT = BorderImageDirection::RIGHT;
51 const BorderImageDirection DIRECTION_TOP = BorderImageDirection::TOP;
52 const BorderImageDirection DIRECTION_BOTTOM = BorderImageDirection::BOTTOM;
53 
MakeBorderImage()54 BorderImage* MakeBorderImage()
55 {
56     BorderImage* testImage = new BorderImage(SRC_IMAGES);
57     testImage->SetEdgeSlice(DIRECTION_LEFT, DIMENSION_SLICE);
58     testImage->SetEdgeSlice(DIRECTION_RIGHT, DIMENSION_SLICE);
59     testImage->SetEdgeSlice(DIRECTION_TOP, DIMENSION_SLICE);
60     testImage->SetEdgeSlice(DIRECTION_BOTTOM, DIMENSION_SLICE);
61 
62     testImage->SetEdgeWidth(DIRECTION_LEFT, DIMENSION_WIDTH);
63     testImage->SetEdgeWidth(DIRECTION_RIGHT, DIMENSION_WIDTH);
64     testImage->SetEdgeWidth(DIRECTION_TOP, DIMENSION_WIDTH);
65     testImage->SetEdgeWidth(DIRECTION_BOTTOM, DIMENSION_WIDTH);
66 
67     testImage->SetEdgeOutset(DIRECTION_LEFT, DIMENSION_OUTSET);
68     testImage->SetEdgeOutset(DIRECTION_RIGHT, DIMENSION_OUTSET);
69     testImage->SetEdgeOutset(DIRECTION_TOP, DIMENSION_OUTSET);
70     testImage->SetEdgeOutset(DIRECTION_BOTTOM, DIMENSION_OUTSET);
71     return testImage;
72 };
73 } // namespace
74 
75 class BorderImagePainterTestNg : public testing::Test {
76 public:
77     void CallBack(Testing::MockCanvas& rSCanvas);
78 };
79 
CallBack(Testing::MockCanvas & rSCanvas)80 void BorderImagePainterTestNg::CallBack(Testing::MockCanvas& rSCanvas)
81 {
82     EXPECT_CALL(rSCanvas, AttachBrush(_)).WillRepeatedly(ReturnRef(rSCanvas));
83     EXPECT_CALL(rSCanvas, DetachBrush()).WillRepeatedly(ReturnRef(rSCanvas));
84     EXPECT_CALL(rSCanvas, AttachPen(_)).WillRepeatedly(ReturnRef(rSCanvas));
85     EXPECT_CALL(rSCanvas, DetachPen()).WillRepeatedly(ReturnRef(rSCanvas));
86 }
87 
88 /**
89  * @tc.name: BorderImagePainter001
90  * @tc.desc: Test cast to BorderImagePainterTestNg
91  * @tc.type: FUNC
92  */
93 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter001, TestSize.Level1)
94 {
95     /**
96      * @tc.steps: step1. push widthProp != nullptr.
97      * @tc.steps: step1. Build a object borderImagePainter.
98      */
99     NG::BorderImageProperty borderImageProperty;
100     RSImage image;
101     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
102     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
103 
104     /**
105      * @tc.steps: step2. push borderImagePainter.borderImageProperty_ is not null.
106      * @tc.steps: step2. call InitPainter.
107      */
108     borderImageProperty.propBorderImage = AceType::MakeRefPtr<BorderImage>();
109 
110     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
111     borderImagePainter.hasWidthProp_ = true;
112     borderImagePainter.imageWidth_ = 720.0;
113     borderImagePainter.imageHeight_ = 1080.0;
114     borderImagePainter.paintSize_ = TEST_SIZE;
115     borderImagePainter.InitPainter();
116 
117     /**
118      * @tc.expected: the borderImagePainter.borderCenterWidth_ is expected results.
119      * @tc.expected: the borderImagePainter.imageCenterWidth_ is expected results.
120      */
121     EXPECT_EQ(borderImagePainter.borderCenterWidth_, 100);
122     EXPECT_EQ(borderImagePainter.borderCenterHeight_, 200);
123     EXPECT_EQ(borderImagePainter.imageCenterWidth_, -720);
124     EXPECT_EQ(borderImagePainter.imageCenterHeight_, -1080);
125 }
126 
127 /**
128  * @tc.name: BorderImagePainter002
129  * @tc.desc: Test cast to BorderImagePainterTestNg
130  * @tc.type: FUNC
131  */
132 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter002, TestSize.Level1)
133 {
134     /**
135      * @tc.steps: step1. push widthProp = nullptr.
136      * @tc.steps: step1. Build a object borderImagePainter.
137      */
138     NG::BorderImageProperty borderImageProperty;
139     RSImage image;
140     std::unique_ptr<NG::BorderWidthProperty> widthProp;
141     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
142 
143     /**
144      * @tc.steps: step2. push borderImageProperty.propBorderImage is null.
145      * @tc.steps: step2. push borderImagePainter.leftSlice_ < imageWidth_.
146      * @tc.steps: step2. call InitPainter.
147      */
148     borderImageProperty.propBorderImage = AceType::MakeRefPtr<BorderImage>();
149     borderImageProperty.propHasBorderImageSlice = true;
150 
151     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
152     borderImagePainter.leftSlice_ = 10.0;
153     borderImagePainter.rightSlice_ = 20.0;
154     borderImagePainter.topSlice_ = 40.0;
155     borderImagePainter.bottomSlice_ = 80.0;
156     borderImagePainter.InitBorderImageSlice();
157     borderImagePainter.InitBorderImageWidth();
158     borderImagePainter.InitBorderImageOutset();
159 
160     /**
161      * @tc.expected: the borderImagePainter.leftSlice_ is expected results.
162      * @tc.expected: the borderImagePainter.rightSlice_ is expected results.
163      */
164     EXPECT_EQ(borderImagePainter.leftSlice_, 10);
165     EXPECT_EQ(borderImagePainter.rightSlice_, 20);
166     EXPECT_EQ(borderImagePainter.topSlice_, 40);
167     EXPECT_EQ(borderImagePainter.bottomSlice_, 80);
168 }
169 
170 /**
171  * @tc.name: BorderImagePainter003
172  * @tc.desc: Test cast to BorderImagePainterTestNg
173  * @tc.type: FUNC
174  */
175 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter003, TestSize.Level1)
176 {
177     /**
178      * @tc.steps: step1. push widthProp != nullptr.
179      * @tc.steps: step1. Build a object borderImagePainter.
180      */
181     NG::BorderImageProperty borderImageProperty;
182     RSImage image;
183     Testing::MockCanvas canvas;
184     CallBack(canvas);
185     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
186     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
187 
188     /**
189      * @tc.steps: step2. push borderImageProperty.propBorderImage is not null.
190      * @tc.steps: step2. push borderImagePainter.leftSlice_ > imageWidth_.
191      * @tc.steps: step2. call InitBorderImageSlice.
192      */
193     auto testBorderImage = MakeBorderImage();
194     testBorderImage->needFillCenter_ = true;
195 
196     borderImageProperty.propBorderImage = std::move(testBorderImage);
197     borderImageProperty.propBorderImageSource = ImageSourceInfo(SRC_IMAGES);
198     borderImageProperty.propHasBorderImageSlice = true;
199 
200     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
201     borderImagePainter.leftSlice_ = 120.0;
202     borderImagePainter.rightSlice_ = 240.0;
203     borderImagePainter.topSlice_ = 120.0;
204     borderImagePainter.bottomSlice_ = 240.0;
205     borderImagePainter.InitBorderImageSlice();
206     borderImagePainter.PaintBorderImage(OFFSET_F, canvas);
207 
208     /**
209      * @tc.expected: the borderImagePainter.leftSlice_ is expected results.
210      * @tc.expected: the borderImagePainter.rightSlice_ is expected results.
211      */
212     EXPECT_EQ(borderImagePainter.leftSlice_, 100);
213     EXPECT_EQ(borderImagePainter.rightSlice_, 100);
214     EXPECT_EQ(borderImagePainter.topSlice_, 100);
215     EXPECT_EQ(borderImagePainter.bottomSlice_, 100);
216 }
217 
218 /**
219  * @tc.name: BorderImagePainter004
220  * @tc.desc: Test cast to BorderImagePainterTestNg
221  * @tc.type: FUNC
222  */
223 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter004, TestSize.Level1)
224 {
225     /**
226      * @tc.steps: step1. push widthProp != nullptr.
227      * @tc.steps: step1. Build a object borderImagePainter.
228      */
229     NG::BorderImageProperty borderImageProperty;
230     RSImage image;
231     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
232     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
233 
234     /**
235      * @tc.steps: step2. push borderImageProperty.propBorderImage is not null.
236      * @tc.steps: step2. call InitBorderImageWidth.
237      */
238     auto testBorderImage = MakeBorderImage();
239 
240     borderImageProperty.propBorderImage = std::move(testBorderImage);
241     borderImageProperty.propBorderImageSource = ImageSourceInfo(SRC_IMAGES);
242     borderImageProperty.propHasBorderImageWidth = true;
243 
244     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
245     borderImagePainter.InitBorderImageWidth();
246 
247     auto borderImage = borderImagePainter.borderImageProperty_.GetBorderImageValue();
248     BorderImageEdge imageLeft = borderImage->GetBorderImageEdge(DIRECTION_LEFT);
249     BorderImageEdge imageTop = borderImage->GetBorderImageEdge(DIRECTION_RIGHT);
250     BorderImageEdge imageRight = borderImage->GetBorderImageEdge(DIRECTION_TOP);
251     BorderImageEdge imageBottom = borderImage->GetBorderImageEdge(DIRECTION_BOTTOM);
252 
253     /**
254      * @tc.expected: the imageLeft.GetBorderImageWidth() is expected results.
255      * @tc.expected: the imageTop.GetBorderImageWidth() is expected results.
256      */
257     EXPECT_EQ(imageLeft.GetBorderImageWidth(), DIMENSION_WIDTH);
258     EXPECT_EQ(imageTop.GetBorderImageWidth(), DIMENSION_WIDTH);
259     EXPECT_EQ(imageRight.GetBorderImageWidth(), DIMENSION_WIDTH);
260     EXPECT_EQ(imageBottom.GetBorderImageWidth(), DIMENSION_WIDTH);
261 }
262 
263 /**
264  * @tc.name: BorderImagePainter005
265  * @tc.desc: Test cast to BorderImagePainterTestNg
266  * @tc.type: FUNC
267  */
268 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter005, TestSize.Level1)
269 {
270     /**
271      * @tc.steps: step1. push widthProp != nullptr.
272      * @tc.steps: step1. Build a object borderImagePainter.
273      */
274     NG::BorderImageProperty borderImageProperty;
275     RSImage image;
276     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
277     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
278 
279     /**
280      * @tc.steps: step2. push borderImageProperty.propBorderImage is not null.
281      * @tc.steps: step2. call InitBorderImageOutset.
282      */
283     auto testBorderImage = MakeBorderImage();
284 
285     borderImageProperty.propBorderImage = std::move(testBorderImage);
286     borderImageProperty.propBorderImageSource = ImageSourceInfo(SRC_IMAGES);
287     borderImageProperty.propHasBorderImageOutset = true;
288 
289     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
290     borderImagePainter.InitBorderImageOutset();
291 
292     auto borderImage = borderImagePainter.borderImageProperty_.GetBorderImageValue();
293     BorderImageEdge imageLeft = borderImage->GetBorderImageEdge(DIRECTION_LEFT);
294     BorderImageEdge imageTop = borderImage->GetBorderImageEdge(DIRECTION_RIGHT);
295     BorderImageEdge imageRight = borderImage->GetBorderImageEdge(DIRECTION_TOP);
296     BorderImageEdge imageBottom = borderImage->GetBorderImageEdge(DIRECTION_BOTTOM);
297 
298     /**
299      * @tc.expected: the imageLeft.GetBorderImageOutset() is expected results.
300      * @tc.expected: the imageTop.GetBorderImageOutset() is expected results.
301      */
302     EXPECT_EQ(imageLeft.GetBorderImageOutset(), DIMENSION_OUTSET);
303     EXPECT_EQ(imageTop.GetBorderImageOutset(), DIMENSION_OUTSET);
304     EXPECT_EQ(imageRight.GetBorderImageOutset(), DIMENSION_OUTSET);
305     EXPECT_EQ(imageBottom.GetBorderImageOutset(), DIMENSION_OUTSET);
306 }
307 
308 /**
309  * @tc.name: BorderImagePainter006
310  * @tc.desc: Test cast to BorderImagePainterTestNg
311  * @tc.type: FUNC
312  */
313 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter006, TestSize.Level1)
314 {
315     /**
316      * @tc.steps: step1. push widthProp = nullptr.
317      * @tc.steps: step1. Build a object borderImagePainter.
318      */
319     NG::BorderImageProperty borderImageProperty;
320     RSImage image;
321     std::unique_ptr<NG::BorderWidthProperty> widthProp;
322     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
323 
324     /**
325      * @tc.steps: step2. push borderImageProperty.propBorderImage is null.
326      * @tc.steps: step2. push propHasBorderImageWidth and propHasBorderImageOutset is true.
327      * @tc.steps: step2. call InitBorderImageWidth and InitBorderImageOutset.
328      */
329     borderImageProperty.propBorderImage = AceType::MakeRefPtr<BorderImage>();
330     borderImageProperty.propBorderImageSource = ImageSourceInfo(SRC_IMAGES);
331     borderImageProperty.propHasBorderImageWidth = true;
332     borderImageProperty.propHasBorderImageOutset = true;
333 
334     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
335     borderImagePainter.InitBorderImageWidth();
336     borderImagePainter.InitBorderImageOutset();
337 
338     /**
339      * @tc.expected: the borderImagePainter.borderCenterWidth_ is expected results.
340      * @tc.expected: the borderImagePainter.imageCenterWidth_ is expected results.
341      */
342     auto result = borderImagePainter.widthProp_;
343     EXPECT_EQ(result.leftDimen, std::nullopt);
344     EXPECT_EQ(result.topDimen, std::nullopt);
345     EXPECT_EQ(result.rightDimen, std::nullopt);
346     EXPECT_EQ(result.bottomDimen, std::nullopt);
347 }
348 
349 /**
350  * @tc.name: BorderImagePainter007
351  * @tc.desc: Test cast to BorderImagePainterTestNg
352  * @tc.type: FUNC
353  */
354 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter007, TestSize.Level1)
355 {
356     /**
357      * @tc.steps: step1. push widthProp = nullptr.
358      * @tc.steps: step1. Build a object borderImagePainter.
359      */
360     NG::BorderImageProperty borderImageProperty;
361     RSImage image;
362     Testing::MockCanvas canvas;
363     CallBack(canvas);
364     std::unique_ptr<NG::BorderWidthProperty> widthProp;
365     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
366 
367     /**
368      * @tc.steps: step2. call PaintBorderImage .
369      * @tc.expected: the borderImagePainter.imageWidth_ is 100.
370      */
371     borderImagePainter.PaintBorderImage(OFFSET_F, canvas);
372     EXPECT_EQ(borderImagePainter.imageWidth_, 100);
373     EXPECT_EQ(borderImagePainter.imageHeight_, 100);
374 
375     /**
376      * @tc.steps: step3. push borderImageProperty.propBorderImage is default value.
377      * @tc.steps: step3. push paintCornersOnly_ is true, call PaintBorderImage.
378      * @tc.expected: the borderImagePainter.hasWidthProp_ is false.
379      */
380     borderImageProperty.propBorderImage = AceType::MakeRefPtr<BorderImage>();
381     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
382     borderImagePainter.paintCornersOnly_ = true;
383     borderImagePainter.PaintBorderImage(OFFSET_F, canvas);
384     EXPECT_EQ(borderImagePainter.hasWidthProp_, false);
385 }
386 
387 /**
388  * @tc.name: BorderImagePainter008
389  * @tc.desc: Test cast to BorderImagePainterTestNg
390  * @tc.type: FUNC
391  */
392 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter008, TestSize.Level1)
393 {
394     /**
395      * @tc.steps: step1. push widthProp != nullptr.
396      * @tc.steps: step1. Build a object borderImagePainter.
397      */
398     NG::BorderImageProperty borderImageProperty;
399     RSImage image;
400     Testing::MockCanvas canvas;
401     CallBack(canvas);
402     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
403     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
404 
405     /**
406      * @tc.steps: step3. push borderImagePainter.borderImageProperty_.GetBorderImageValue() is new value.
407      * @tc.steps: step3. push paintCornersOnly_ is true, call PaintBorderImage.
408      * @tc.expected: Return expected results.
409      */
410     auto testBorderImage = MakeBorderImage();
411 
412     for (int32_t id = 0; id < 5; id++) {
413         auto state = static_cast<BorderImageRepeat>(id);
414         testBorderImage->repeatMode_ = state;
415         borderImageProperty.propBorderImage = std::move(testBorderImage);
416         borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
417         borderImagePainter.PaintBorderImage(OFFSET_F, canvas);
418 
419         switch (borderImagePainter.borderImageProperty_.GetBorderImageValue()->GetRepeatMode()) {
420             case BorderImageRepeat::STRETCH:
421             case BorderImageRepeat::SPACE:
422             case BorderImageRepeat::ROUND:
423             case BorderImageRepeat::REPEAT:
424                 EXPECT_EQ(borderImagePainter.imageWidth_, 100);
425                 EXPECT_EQ(borderImagePainter.imageHeight_, 100);
426                 break;
427             default:
428                 LOGE("Unsupported Border Image repeat mode");
429         }
430     }
431 }
432 
433 /**
434  * @tc.name: BorderImagePainter009
435  * @tc.desc: Test cast to BorderImagePainterTestNg
436  * @tc.type: FUNC
437  */
438 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter009, TestSize.Level1)
439 {
440     /**
441      * @tc.steps: step1. push widthProp != nullptr.
442      * @tc.steps: step1. Build a object borderImagePainter.
443      */
444     NG::BorderImageProperty borderImageProperty;
445     RSImage image;
446     Testing::MockCanvas canvas;
447     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
448     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
449 
450     /**
451      * @tc.steps: step2. push borderImagePainter.borderImageProperty_.GetBorderImageValue() is new value.
452      * @tc.steps: step2. push borderCenterWidth_ is FIVE, imageCenterWidth_ is ONE.
453      */
454     auto testBorderImage = MakeBorderImage();
455     borderImageProperty.propBorderImage = std::move(testBorderImage);
456 
457     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
458     borderImagePainter.borderCenterWidth_ = FIVE;
459     borderImagePainter.borderCenterHeight_ = FIVE;
460     borderImagePainter.imageCenterWidth_ = ONE;
461     borderImagePainter.imageCenterHeight_ = ONE;
462 
463     /**
464      * @tc.steps: step3. call PaintBorderImageRound PaintBorderImageSpace and PaintBorderImageRepeat.
465      * @tc.expected: expected the widthCount and heightCount is 0.
466      */
467     borderImagePainter.PaintBorderImageRound(OFFSET_F, canvas);
468     borderImagePainter.PaintBorderImageSpace(OFFSET_F, canvas);
469     borderImagePainter.PaintBorderImageRepeat(OFFSET_F, canvas);
470     auto widthCount = fmod(borderImagePainter.borderCenterWidth_, borderImagePainter.imageCenterWidth_);
471     auto heightCount = fmod(borderImagePainter.borderCenterHeight_, borderImagePainter.imageCenterHeight_);
472     EXPECT_EQ(widthCount, 0);
473     EXPECT_EQ(heightCount, 0);
474 }
475 
476 /**
477  * @tc.name: BorderImagePainter010
478  * @tc.desc: Test cast to BorderImagePainterTestNg
479  * @tc.type: FUNC
480  */
481 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter010, TestSize.Level1)
482 {
483     /**
484      * @tc.steps: step1. push widthProp != nullptr.
485      * @tc.steps: step1. Build a object borderImagePainter.
486      */
487     NG::BorderImageProperty borderImageProperty;
488     RSImage image;
489     Testing::MockCanvas canvas;
490     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
491     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
492 
493     /**
494      * @tc.steps: step2. push borderImagePainter.borderImageProperty_.GetBorderImageValue() is new value.
495      * @tc.steps: step2. push borderCenterWidth_ is TWO, imageCenterWidth_ is FIVE.
496      */
497     auto testBorderImage = MakeBorderImage();
498     borderImageProperty.propBorderImage = std::move(testBorderImage);
499 
500     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
501     borderImagePainter.borderCenterWidth_ = TWO;
502     borderImagePainter.borderCenterHeight_ = TWO;
503     borderImagePainter.imageCenterWidth_ = FIVE;
504     borderImagePainter.imageCenterHeight_ = FIVE;
505 
506     /**
507      * @tc.steps: step3. call PaintBorderImageRound PaintBorderImageSpace and PaintBorderImageRepeat.
508      * @tc.expected: expected the widthCount and heightCount is 2.
509      */
510     borderImagePainter.PaintBorderImageRepeat(OFFSET_F, canvas);
511     auto widthCount = fmod(borderImagePainter.borderCenterWidth_, borderImagePainter.imageCenterWidth_);
512     auto heightCount = fmod(borderImagePainter.borderCenterHeight_, borderImagePainter.imageCenterHeight_);
513     EXPECT_EQ(widthCount, 2);
514     EXPECT_EQ(heightCount, 2);
515 }
516 
517 /**
518  * @tc.name: BorderImagePainter011
519  * @tc.desc: Test cast to BorderImagePainterTestNg
520  * @tc.type: FUNC
521  */
522 HWTEST_F(BorderImagePainterTestNg, BorderImagePainter011, TestSize.Level1)
523 {
524     /**
525      * @tc.steps: step1. push widthProp != nullptr.
526      * @tc.steps: step1. Build a object borderImagePainter.
527      */
528     NG::BorderImageProperty borderImageProperty;
529     RSImage image;
530     Testing::MockCanvas canvas;
531     std::unique_ptr<NG::BorderWidthProperty> widthProp { std::make_unique<NG::BorderWidthProperty>(BORDER_WIDTH_TEST) };
532     NG::BorderImagePainter borderImagePainter(borderImageProperty, widthProp, PAINTSIZE, image, DIPSCALE);
533 
534     /**
535      * @tc.steps: step2. push borderImagePainter.borderImageProperty_.GetBorderImageValue() is new value.
536      * @tc.steps: step2. push borderCenterWidth_ is minus, imageCenterWidth_ is TWO.
537      */
538     double minus = -1.0;
539     auto testBorderImage = MakeBorderImage();
540     borderImageProperty.propBorderImage = std::move(testBorderImage);
541 
542     borderImagePainter.borderImageProperty_ = std::move(borderImageProperty);
543     borderImagePainter.borderCenterWidth_ = minus;
544     borderImagePainter.borderCenterHeight_ = minus;
545     borderImagePainter.imageCenterWidth_ = TWO;
546     borderImagePainter.imageCenterHeight_ = TWO;
547 
548     /**
549      * @tc.steps: step3. call PaintBorderImageRepeat.
550      * @tc.expected: expected the widthCount and heightCount is minus.
551      */
552     borderImagePainter.PaintBorderImageRepeat(OFFSET_F, canvas);
553     auto widthCount = fmod(borderImagePainter.borderCenterWidth_, borderImagePainter.imageCenterWidth_);
554     auto heightCount = fmod(borderImagePainter.borderCenterHeight_, borderImagePainter.imageCenterHeight_);
555     EXPECT_EQ(widthCount, minus);
556     EXPECT_EQ(heightCount, minus);
557 
558     /**
559      * @tc.steps: step4. push value is minus, call ParseNegativeNumberToZeroOrCeil.
560      * @tc.expected: expected the minus = ZERO_TEST.
561      */
562     borderImagePainter.ParseNegativeNumberToZeroOrCeil(minus);
563     EXPECT_EQ(minus, ZERO_TEST);
564 }
565 } // namespace OHOS::Ace
566