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;
__anond7ff4d540202() 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;
__anond7ff4d540302() 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 }
221
222 /**
223 * @tc.name: RenderContextTest005
224 * @tc.desc: Test cast to RenderContextTestNg
225 * @tc.type: FUNC
226 */
227 HWTEST_F(RenderContextTestNg, RenderContextTest005, TestSize.Level1)
228 {
229 /**
230 * @tc.steps: step1. Build a object renderContext.
231 */
232 NG::RenderContext renderContext;
233 auto json = JsonUtil::Create(true);
234
235 /**
236 * @tc.steps: step2. callback ToJsonValue.push propProgressMask_ is not null.
237 */
238 MakeProperty(renderContext);
239 renderContext.propProgressMask_ = CreateProgressMaskProperty();
240 renderContext.ToJsonValue(json, filter);
241
242 /**
243 * @tc.expected: Return expected results.
244 */
245 EXPECT_EQ(json->GetString("total"), "");
246 EXPECT_EQ(json->GetString("updateProgress"), "");
247 EXPECT_EQ(json->GetString("updateColor"), "#FFFF0000");
248 }
249
250 /**
251 * @tc.name: RenderContextTest006
252 * @tc.desc: Test cast to RenderContextTestNg
253 * @tc.type: FUNC
254 */
255 HWTEST_F(RenderContextTestNg, RenderContextTest006, TestSize.Level1)
256 {
257 /**
258 * @tc.steps: step1. Build a object renderContext.
259 */
260 NG::RenderContext renderContext;
261 auto json = JsonUtil::Create(true);
262
263 PixStretchEffectOption pixStretchEffectOption;
264 pixStretchEffectOption.bottom = BOTTOM_TEST;
265 pixStretchEffectOption.left = LEFT_TEST;
266 pixStretchEffectOption.right= RIGHT_TEST;
267 pixStretchEffectOption.top = TOP_TEST;
268
269 /**
270 * @tc.steps: step2. callback ToJsonValue.push propPixelStretchEffect_ is not null.
271 */
272 MakeProperty(renderContext);
273 renderContext.propPixelStretchEffect_ = std::move(pixStretchEffectOption);
274 renderContext.ToJsonValue(json, filter);
275
276 /**
277 * @tc.expected: Return expected results.
278 */
279 EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("left"), LEFT_TEST.ToString());
280 EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("right"), RIGHT_TEST.ToString());
281 EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("top"), TOP_TEST.ToString());
282 EXPECT_EQ(json->GetValue("pixelStretchEffect")->GetString("bottom"), BOTTOM_TEST.ToString());
283 }
284
285 /**
286 * @tc.name: RenderContextTest007
287 * @tc.desc: Test cast to RenderContextTestNg
288 * @tc.type: FUNC
289 */
290 HWTEST_F(RenderContextTestNg, RenderContextTest007, TestSize.Level1)
291 {
292 /**
293 * @tc.steps: step1. Build a object renderContext.
294 */
295 NG::RenderContext renderContext;
296 auto json = JsonUtil::Create(true);
297
298 /**
299 * @tc.steps: step2. callback ToJsonValue.push propBackgroundColor_ is BLACK.
300 * @tc.steps: step2. push propForegroundColor_ is WHITE.
301 */
302 MakeProperty(renderContext);
303 renderContext.propBackgroundColor_ = BLACK;
304 renderContext.propForegroundColor_ = WHITE;
305 renderContext.ToJsonValue(json, filter);
306
307 /**
308 * @tc.expected: Return expected results.
309 */
310 EXPECT_EQ(json->GetString("backgroundColor"), "#FF000000");
311 EXPECT_EQ(json->GetString("foregroundColor"), "#FFFFFFFF");
312 }
313
314 /**
315 * @tc.name: RenderContextTest008
316 * @tc.desc: Test cast to RenderContextTestNg
317 * @tc.type: FUNC
318 */
319 HWTEST_F(RenderContextTestNg, RenderContextTest008, TestSize.Level1)
320 {
321 /**
322 * @tc.steps: step1. Build a object renderContext.
323 */
324 NG::RenderContext renderContext;
325 auto json = JsonUtil::Create(true);
326
327 /**
328 * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
329 */
330 MakeProperty(renderContext);
331 renderContext.propTransformMatrix_ = Matrix4::CreateIdentity();;
332 renderContext.ToJsonValue(json, filter);
333
334 /**
335 * @tc.expected: Return expected results.
336 */
337 EXPECT_EQ(json->GetValue("transform")->GetString("type"), "matrix");
338 EXPECT_EQ(json->GetValue("transform")->GetString("matrix"), MATRIX_STRING1 + MATRIX_STRING2);
339 }
340
341 /**
342 * @tc.name: RenderContextTest009
343 * @tc.desc: Test function RequestNextFrame
344 * @tc.type: FUNC
345 */
346 HWTEST_F(RenderContextTestNg, RenderContextTest009, TestSize.Level1)
347 {
348 /**
349 * @tc.steps: step1. create a frameNode ande update renderContext.
350 */
351 auto frameNode = NG::FrameNode::CreateFrameNode(TAG_ROOT, 0, AceType::MakeRefPtr<NG::LinearLayoutPattern>(false));
352 frameNode->UpdateInspectorId("123");
353 auto renderContext = frameNode->GetRenderContext();
__anond7ff4d540402() 354 renderContext->requestFrame_ = []() {};
355 NG::BorderWidthProperty borderWidth = { 1.0_vp, 1.0_vp, 1.0_vp, 1.0_vp };
356 auto layoutProperty = AceType::MakeRefPtr<NG::LayoutProperty>();
357 layoutProperty->UpdateBorderWidth(borderWidth);
358 RefPtr<NG::LayoutWrapper> layoutWrapper = frameNode->CreateLayoutWrapper(true, true);
359 layoutWrapper->SetActive(true);
__anond7ff4d540502() 360 auto builderFunc = []() -> RefPtr<NG::UINode> { return nullptr; };
361 frameNode->SetBackgroundFunction(builderFunc);
362 frameNode->SetLayoutProperty(layoutProperty);
363 frameNode->SwapDirtyLayoutWrapperOnMainThread(layoutWrapper);
364
365 /**
366 * @tc.steps: step2. call the function RequestNextFrame.
367 */
368 renderContext->RequestNextFrame();
369 EXPECT_EQ(renderContext->GetBorderColor()->leftColor.value(), Color::BLACK);
370 EXPECT_NE(renderContext->GetUnsafeHost(), nullptr);
371 EXPECT_FALSE(renderContext->HasSharedTransition());
372 }
373
374 /**
375 * @tc.name: RenderContextTest010
376 * @tc.desc: Test cast to RenderContextTestNg
377 * @tc.type: FUNC
378 */
379 HWTEST_F(RenderContextTestNg, RenderContextTest010, TestSize.Level1)
380 {
381 /**
382 * @tc.steps: step1. Build a object renderContext.
383 */
384 NG::RenderContext renderContext;
385 auto json = JsonUtil::Create(true);
386 NG::InspectorFilter testFilter;
387 testFilter.AddFilterAttr("focusable");
388
389 /**
390 * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
391 */
392 MakeProperty(renderContext);
393 renderContext.propTransformMatrix_ = Matrix4::CreateIdentity();;
394 renderContext.ToJsonValue(json, testFilter);
395
396 /**
397 * @tc.expected: Return expected results.
398 */
399 EXPECT_EQ(json->GetValue("transform")->GetString("type"), "");
400 }
401
402 /**
403 * @tc.name: RenderContextTest011
404 * @tc.desc: Test cast to RenderContextTestNg
405 * @tc.type: FUNC
406 */
407 HWTEST_F(RenderContextTestNg, RenderContextTest011, TestSize.Level1)
408 {
409 /**
410 * @tc.steps: step1. Build a object renderContext.
411 */
412 NG::RenderContext renderContext;
413 auto json = JsonUtil::Create(true);
414 NG::DebugBoundaryPainter painter;
415 RSCanvas canvas;
416 painter.PaintDebugBoundary(canvas, NG::OffsetF(1.0, 1.0));
417 painter.PaintDebugCorner(canvas, NG::OffsetF(1.0, 1.0));
418 painter.PaintDebugMargin(canvas, NG::OffsetF(1.0, 1.0));
419
420 /**
421 * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
422 */
423 MakeProperty(renderContext);
424 renderContext.propTransformMatrix_ = Matrix4::CreateIdentity();
425 ClickEffectInfo clickEffect;
426 clickEffect.level = ClickEffectLevel::LIGHT;
427 renderContext.UpdateClickEffectLevel(clickEffect);
428 std::vector<ObscuredReasons> obscuredReasons;
429 obscuredReasons.emplace_back(ObscuredReasons::PLACEHOLDER);
430 renderContext.UpdateObscured(obscuredReasons);
431 renderContext.ToJsonValue(json, filter);
432
433 /**
434 * @tc.expected: Return expected results.
435 */
436 EXPECT_EQ(json->GetValue("transform")->GetString("type"), "matrix");
437 EXPECT_EQ(json->GetValue("transform")->GetString("matrix"), MATRIX_STRING1 + MATRIX_STRING2);
438 }
439
440 /**
441 * @tc.name: RenderContextTest012
442 * @tc.desc: Test cast to RenderContextTestNg
443 * @tc.type: FUNC
444 */
445 HWTEST_F(RenderContextTestNg, RenderContextTest012, TestSize.Level1)
446 {
447 /**
448 * @tc.steps: step1. Build a object renderContext.
449 */
450 NG::RenderContext renderContextOne;
451 NG::RenderContext renderContextTwo;
452 NG::RenderContext renderContextThree;
453 auto jsonOne = JsonUtil::Create(true);
454 auto jsonTwo = JsonUtil::Create(true);
455 auto jsonThree = JsonUtil::Create(true);
456
457 /**
458 * @tc.steps: step2. callback ToJsonValue.push propTransformMatrix_ is CreateIdentity.
459 */
460 MakeProperty(renderContextOne);
461 MakeProperty(renderContextTwo);
462 MakeProperty(renderContextThree);
463 jsonOne->Put("clip", "false");
464 renderContextOne.FromJson(jsonOne);
465 EXPECT_FALSE(renderContextOne.GetClipEdge().value());
466 renderContextTwo.UpdateClipEdge(false);
467 jsonTwo->Put("clip", "normal");
468 renderContextTwo.FromJson(jsonTwo);
469 EXPECT_FALSE(renderContextTwo.GetClipEdge().value());
470 jsonThree->Put("clip", "true");
471 renderContextThree.FromJson(jsonThree);
472 EXPECT_TRUE(renderContextThree.GetClipEdge().value());
473 }
474 } // namespace OHOS::Ace
475