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