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 "gtest/gtest.h"
16 #include "gmock/gmock.h"
17 
18 #include "base/utils/utils.h"
19 #define protected public
20 #define private public
21 #include "test/mock/core/pipeline/mock_pipeline_context.h"
22 
23 #include "core/components_ng/render/debug_boundary_painter.h"
24 #include "core/components_ng/render/render_context.h"
25 #include "core/components_ng/base/frame_node.h"
26 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
27 
28 #undef private
29 #undef protected
30 
31 using namespace testing;
32 using namespace testing::ext;
33 
34 namespace OHOS::Ace {
35 namespace {
36 const NG::InspectorFilter filter;
37 std::string srcimages = "test";
38 constexpr char TAG_ROOT[] = "root";
39 const std::string MATRIX_STRING1 = "1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,";
40 const std::string MATRIX_STRING2 = "0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,";
41 const float VALUE = 1.0f;
42 const float MAXVALUE = 200.0f;
43 const Color RED = Color(0xffff0000);
44 const Color BLACK = Color(0xff000000);
45 const Color WHITE = Color(0xffffffff);
46 
47 constexpr Dimension ZERO_TEST {0.0f, DimensionUnit::PX};
48 constexpr Dimension LEFT_TEST {10.0f, DimensionUnit::PX};
49 constexpr Dimension TOP_TEST {20.0f, DimensionUnit::PX};
50 constexpr Dimension RIGHT_TEST {30.0f, DimensionUnit::PX};
51 constexpr Dimension BOTTOM_TEST {40.0f, DimensionUnit::PX};
52 
CreateProgressMaskProperty()53 RefPtr<NG::ProgressMaskProperty> CreateProgressMaskProperty()
54 {
55     RefPtr<NG::ProgressMaskProperty> progressMaskProperty = AceType::MakeRefPtr<NG::ProgressMaskProperty>();
56     progressMaskProperty->SetMaxValue(MAXVALUE);
57     progressMaskProperty->SetColor(RED);
58     progressMaskProperty->SetValue(VALUE);
59     return progressMaskProperty;
60 };
61 
MakeProperty(NG::RenderContext & renderContext)62 void MakeProperty(NG::RenderContext& renderContext)
63 {
64     renderContext.propBorder_ = std::make_unique<NG::BorderProperty>();
65     renderContext.propOuterBorder_ = std::make_unique<NG::OuterBorderProperty>();
66     renderContext.propBdImage_ = std::make_unique<NG::BorderImageProperty>();
67     renderContext.propOverlay_ = std::make_unique<NG::OverlayProperty>();
68     renderContext.propPositionProperty_ = std::make_unique<NG::RenderPositionProperty>();
69     renderContext.propBackground_ = std::make_unique<NG::BackgroundProperty>();
70     renderContext.propGraphics_ = std::make_unique<NG::GraphicsProperty>();
71     renderContext.propGradient_ = std::make_unique<NG::GradientProperty>();
72     renderContext.propTransform_ = std::make_unique<NG::TransformProperty>();
73     renderContext.propClip_ = std::make_unique<NG::ClipProperty>();
74 };
75 }
76 
77 class RenderContextTestNg : public testing::Test {
78 public:
79     void SetUp() override;
80     void TearDown() override;
81 };
82 
SetUp()83 void RenderContextTestNg::SetUp()
84 {
85     NG::MockPipelineContext::SetUp();
86 }
87 
TearDown()88 void RenderContextTestNg::TearDown()
89 {
90     NG::MockPipelineContext::TearDown();
91 }
92 
93 /**
94  * @tc.name: RenderContextTest001
95  * @tc.desc: Test cast to RenderContextTestNg
96  * @tc.type: FUNC
97  */
98 HWTEST_F(RenderContextTestNg, RenderContextTest001, TestSize.Level1)
99 {
100     /**
101      * @tc.steps: step1. Build a object renderContext.
102      */
103     NG::RenderContext renderContext;
__anon21dffd8c0202() 104     auto requestFrame = []() {
105         srcimages = "common/images/mmm.jpg";
106     };
107 
108     /**
109      * @tc.steps: step2. callback SetRequestFrame.
110      * @tc.expected: step2. The renderContext.requestFrame_ is not null.
111      */
112     renderContext.SetRequestFrame(requestFrame);
113     EXPECT_EQ(srcimages, "test");
114     ASSERT_NE(renderContext.requestFrame_, nullptr);
115 }
116 
117 /**
118  * @tc.name: RenderContextTest002
119  * @tc.desc: Test cast to RenderContextTestNg
120  * @tc.type: FUNC
121  */
122 HWTEST_F(RenderContextTestNg, RenderContextTest002, TestSize.Level1)
123 {
124     /**
125      * @tc.steps: step1. Build a object renderContext.
126      */
127     NG::RenderContext renderContext;
__anon21dffd8c0302() 128     auto requestFrame = []() {
129         srcimages = "common/images/mmm.jpg";
130     };
131 
132     /**
133      * @tc.steps: step2. callback RequestNextFrame.
134      * @tc.expected: step2. The renderContext.requestFrame_ is null.
135      */
136     renderContext.RequestNextFrame();
137     EXPECT_EQ(srcimages, "test");
138     EXPECT_EQ(renderContext.requestFrame_, nullptr);
139 
140     /**
141      * @tc.steps: step3. callback RequestNextFrame.
142      * @tc.expected: step3. The renderContext.requestFrame_ is not null.
143      */
144     renderContext.SetRequestFrame(requestFrame);
145     renderContext.RequestNextFrame();
146     EXPECT_EQ(srcimages, "common/images/mmm.jpg");
147     ASSERT_NE(renderContext.requestFrame_, nullptr);
148 }
149 
150 /**
151  * @tc.name: RenderContextTest003
152  * @tc.desc: Test cast to RenderContextTestNg
153  * @tc.type: FUNC
154  */
155 HWTEST_F(RenderContextTestNg, RenderContextTest003, TestSize.Level1)
156 {
157     /**
158      * @tc.steps: step1. Build a object renderContext.
159      */
160     NG::RenderContext renderContext;
161     auto rowFrameNode =
162         NG::FrameNode::CreateFrameNode(TAG_ROOT, 0, AceType::MakeRefPtr<NG::LinearLayoutPattern>(false));
163 
164     /**
165      * @tc.steps: step2. callback GetHost.
166      * @tc.expected: step2. expected result is null.
167      */
168     RefPtr<NG::FrameNode> result = renderContext.GetHost();
169     EXPECT_EQ(result, nullptr);
170 
171     /**
172      * @tc.steps: step2. callback SetHostNode.
173      * @tc.expected: step2. The renderContext.host_ = rowFrameNode.
174      * @tc.expected: step2. The renderContext.host_.Upgrade() is not null.
175      */
176     renderContext.SetHostNode(rowFrameNode);
177     EXPECT_EQ(renderContext.host_, rowFrameNode);
178     ASSERT_NE(renderContext.host_.Upgrade(), nullptr);
179 
180     /**
181      * @tc.steps: step3. callback GetHost.
182      * @tc.expected: step3. expected results is not null.
183      */
184     RefPtr<NG::FrameNode> results = renderContext.GetHost();
185     ASSERT_NE(results, nullptr);
186 }
187 
188 /**
189  * @tc.name: RenderContextTest004
190  * @tc.desc: Test cast to RenderContextTestNg
191  * @tc.type: FUNC
192  */
193 HWTEST_F(RenderContextTestNg, RenderContextTest004, TestSize.Level1)
194 {
195     /**
196      * @tc.steps: step1. Build a object renderContext.
197      */
198     NG::RenderContext renderContext;
199 
200     /**
201      * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is null.
202      * @tc.steps: step2. push propProgressMask_ is null.push propPixelStretchEffect_ is null.
203      */
204     auto json = JsonUtil::Create(true);
205     renderContext.ToJsonValue(json, filter);
206 
207     /**
208      * @tc.expected: Return expected results..
209      */
210     EXPECT_EQ(json->GetString("total"), "");
211     EXPECT_EQ(json->GetString("updateProgress"), "");
212     EXPECT_EQ(json->GetString("updateColor"), "");
213     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("left"), ZERO_TEST.ToString());
214     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("right"), ZERO_TEST.ToString());
215     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("top"), ZERO_TEST.ToString());
216     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("bottom"), ZERO_TEST.ToString());
217     EXPECT_EQ(json->GetString("backgroundColor"), "#00000000");
218     EXPECT_EQ(json->GetString("foregroundColor"), "#00000001");
219     EXPECT_EQ(json->GetString("transform"), "");
220     EXPECT_EQ(json->GetString("useEffect"), "false");
221     EXPECT_EQ(json->GetString("useEffectType"), "EffectType.DEFAULT");
222 }
223 
224 /**
225  * @tc.name: RenderContextTest005
226  * @tc.desc: Test cast to RenderContextTestNg
227  * @tc.type: FUNC
228  */
229 HWTEST_F(RenderContextTestNg, RenderContextTest005, TestSize.Level1)
230 {
231     /**
232      * @tc.steps: step1. Build a object renderContext.
233      */
234     NG::RenderContext renderContext;
235     auto json = JsonUtil::Create(true);
236 
237     /**
238      * @tc.steps: step2. callback ToJsonValue.push propProgressMask_ is not null.
239      */
240     MakeProperty(renderContext);
241     renderContext.propProgressMask_ = CreateProgressMaskProperty();
242     renderContext.ToJsonValue(json, filter);
243 
244     /**
245      * @tc.expected: Return expected results.
246      */
247     EXPECT_EQ(json->GetString("total"), "");
248     EXPECT_EQ(json->GetString("updateProgress"), "");
249     EXPECT_EQ(json->GetString("updateColor"), "#FFFF0000");
250 }
251 
252 /**
253  * @tc.name: RenderContextTest006
254  * @tc.desc: Test cast to RenderContextTestNg
255  * @tc.type: FUNC
256  */
257 HWTEST_F(RenderContextTestNg, RenderContextTest006, TestSize.Level1)
258 {
259     /**
260      * @tc.steps: step1. Build a object renderContext.
261      */
262     NG::RenderContext renderContext;
263     auto json = JsonUtil::Create(true);
264 
265     PixStretchEffectOption pixStretchEffectOption;
266     pixStretchEffectOption.bottom = BOTTOM_TEST;
267     pixStretchEffectOption.left = LEFT_TEST;
268     pixStretchEffectOption.right= RIGHT_TEST;
269     pixStretchEffectOption.top = TOP_TEST;
270 
271     /**
272      * @tc.steps: step2. callback ToJsonValue.push propPixelStretchEffect_ is not null.
273      */
274     MakeProperty(renderContext);
275     renderContext.propPixelStretchEffect_ = std::move(pixStretchEffectOption);
276     renderContext.ToJsonValue(json, filter);
277 
278     /**
279      * @tc.expected: Return expected results.
280      */
281     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("left"), LEFT_TEST.ToString());
282     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("right"), RIGHT_TEST.ToString());
283     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("top"), TOP_TEST.ToString());
284     EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("bottom"), BOTTOM_TEST.ToString());
285 }
286 
287 /**
288  * @tc.name: RenderContextTest007
289  * @tc.desc: Test cast to RenderContextTestNg
290  * @tc.type: FUNC
291  */
292 HWTEST_F(RenderContextTestNg, RenderContextTest007, TestSize.Level1)
293 {
294     /**
295      * @tc.steps: step1. Build a object renderContext.
296      */
297     NG::RenderContext renderContext;
298     auto json = JsonUtil::Create(true);
299 
300     /**
301      * @tc.steps: step2. callback ToJsonValue.push propBackgroundColor_ is BLACK.
302      * @tc.steps: step2. push propForegroundColor_ is WHITE.
303      */
304     MakeProperty(renderContext);
305     renderContext.propBackgroundColor_ = BLACK;
306     renderContext.propForegroundColor_ = WHITE;
307     renderContext.ToJsonValue(json, filter);
308 
309     /**
310      * @tc.expected: Return expected results.
311      */
312     EXPECT_EQ(json->GetString("backgroundColor"), "#FF000000");
313     EXPECT_EQ(json->GetString("foregroundColor"), "#FFFFFFFF");
314 }
315 
316 /**
317  * @tc.name: RenderContextTest008
318  * @tc.desc: Test cast to RenderContextTestNg
319  * @tc.type: FUNC
320  */
321 HWTEST_F(RenderContextTestNg, RenderContextTest008, TestSize.Level1)
322 {
323     /**
324      * @tc.steps: step1. Build a object renderContext.
325      */
326     NG::RenderContext renderContext;
327     auto json = JsonUtil::Create(true);
328 
329     /**
330      * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
331      */
332     MakeProperty(renderContext);
333     renderContext.propTransformMatrix_ = Matrix4::CreateIdentity();;
334     renderContext.ToJsonValue(json, filter);
335 
336     /**
337      * @tc.expected: Return expected results.
338      */
339     EXPECT_EQ(json->GetValue("transform")->GetString("type"), "matrix");
340     EXPECT_EQ(json->GetValue("transform")->GetString("matrix"), MATRIX_STRING1 + MATRIX_STRING2);
341 }
342 
343 /**
344  * @tc.name: RenderContextTest009
345  * @tc.desc: Test function RequestNextFrame
346  * @tc.type: FUNC
347  */
348 HWTEST_F(RenderContextTestNg, RenderContextTest009, TestSize.Level1)
349 {
350     /**
351      * @tc.steps: step1. create a frameNode ande update renderContext.
352      */
353     auto frameNode = NG::FrameNode::CreateFrameNode(TAG_ROOT, 0, AceType::MakeRefPtr<NG::LinearLayoutPattern>(false));
354     frameNode->UpdateInspectorId("123");
355     auto renderContext = frameNode->GetRenderContext();
__anon21dffd8c0402() 356     renderContext->requestFrame_ = []() {};
357     NG::BorderWidthProperty borderWidth = { 1.0_vp, 1.0_vp, 1.0_vp, 1.0_vp };
358     auto layoutProperty = AceType::MakeRefPtr<NG::LayoutProperty>();
359     layoutProperty->UpdateBorderWidth(borderWidth);
360     RefPtr<NG::LayoutWrapper> layoutWrapper = frameNode->CreateLayoutWrapper(true, true);
361     layoutWrapper->SetActive(true);
__anon21dffd8c0502() 362     auto builderFunc = []() -> RefPtr<NG::UINode> { return nullptr; };
363     frameNode->SetBackgroundFunction(builderFunc);
364     frameNode->SetLayoutProperty(layoutProperty);
365     frameNode->SwapDirtyLayoutWrapperOnMainThread(layoutWrapper);
366 
367     /**
368      * @tc.steps: step2. call the function RequestNextFrame.
369      */
370     renderContext->RequestNextFrame();
371     EXPECT_EQ(renderContext->GetBorderColor()->leftColor.value(), Color::BLACK);
372     EXPECT_NE(renderContext->GetUnsafeHost(), nullptr);
373     EXPECT_FALSE(renderContext->HasSharedTransition());
374 }
375 
376 /**
377  * @tc.name: RenderContextTest010
378  * @tc.desc: Test cast to RenderContextTestNg
379  * @tc.type: FUNC
380  */
381 HWTEST_F(RenderContextTestNg, RenderContextTest010, TestSize.Level1)
382 {
383     /**
384      * @tc.steps: step1. Build a object renderContext.
385      */
386     NG::RenderContext renderContext;
387     auto json = JsonUtil::Create(true);
388     NG::InspectorFilter testFilter;
389     testFilter.AddFilterAttr("focusable");
390 
391     /**
392      * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
393      */
394     MakeProperty(renderContext);
395     renderContext.propTransformMatrix_ = Matrix4::CreateIdentity();;
396     renderContext.ToJsonValue(json, testFilter);
397 
398     /**
399      * @tc.expected: Return expected results.
400      */
401     EXPECT_EQ(json->GetValue("transform")->GetString("type"), "");
402 }
403 
404 /**
405  * @tc.name: RenderContextTest011
406  * @tc.desc: Test cast to RenderContextTestNg
407  * @tc.type: FUNC
408  */
409 HWTEST_F(RenderContextTestNg, RenderContextTest011, TestSize.Level1)
410 {
411     /**
412      * @tc.steps: step1. Build a object renderContext.
413      */
414     NG::RenderContext renderContext;
415     auto json = JsonUtil::Create(true);
416     NG::DebugBoundaryPainter painter;
417     RSCanvas canvas;
418     painter.PaintDebugBoundary(canvas, NG::OffsetF(1.0, 1.0));
419     painter.PaintDebugCorner(canvas, NG::OffsetF(1.0, 1.0));
420     painter.PaintDebugMargin(canvas, NG::OffsetF(1.0, 1.0));
421 
422     /**
423      * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
424      */
425     MakeProperty(renderContext);
426     renderContext.propTransformMatrix_ = Matrix4::CreateIdentity();
427     ClickEffectInfo clickEffect;
428     clickEffect.level = ClickEffectLevel::LIGHT;
429     renderContext.UpdateClickEffectLevel(clickEffect);
430     std::vector<ObscuredReasons> obscuredReasons;
431     obscuredReasons.emplace_back(ObscuredReasons::PLACEHOLDER);
432     renderContext.UpdateObscured(obscuredReasons);
433     renderContext.ToJsonValue(json, filter);
434 
435     /**
436      * @tc.expected: Return expected results.
437      */
438     EXPECT_EQ(json->GetValue("transform")->GetString("type"), "matrix");
439     EXPECT_EQ(json->GetValue("transform")->GetString("matrix"), MATRIX_STRING1 + MATRIX_STRING2);
440 }
441 
442 /**
443  * @tc.name: RenderContextTest012
444  * @tc.desc: Test cast to RenderContextTestNg
445  * @tc.type: FUNC
446  */
447 HWTEST_F(RenderContextTestNg, RenderContextTest012, TestSize.Level1)
448 {
449     /**
450      * @tc.steps: step1. Build a object renderContext.
451      */
452     NG::RenderContext renderContextOne;
453     NG::RenderContext renderContextTwo;
454     NG::RenderContext renderContextThree;
455     auto jsonOne = JsonUtil::Create(true);
456     auto jsonTwo = JsonUtil::Create(true);
457     auto jsonThree = JsonUtil::Create(true);
458 
459     /**
460      * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
461      */
462     MakeProperty(renderContextOne);
463     MakeProperty(renderContextTwo);
464     MakeProperty(renderContextThree);
465     jsonOne->Put("clip", "false");
466     renderContextOne.FromJson(jsonOne);
467     EXPECT_FALSE(renderContextOne.GetClipEdge().value());
468     renderContextTwo.UpdateClipEdge(false);
469     jsonTwo->Put("clip", "normal");
470     renderContextTwo.FromJson(jsonTwo);
471     EXPECT_FALSE(renderContextTwo.GetClipEdge().value());
472     jsonThree->Put("clip", "true");
473     renderContextThree.FromJson(jsonThree);
474     EXPECT_TRUE(renderContextThree.GetClipEdge().value());
475 }
476 } // namespace OHOS::Ace
477