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
16 #include <optional>
17
18 #include "gtest/gtest.h"
19
20 #include "base/utils/utils.h"
21 #define protected public
22 #define private public
23
24 #include "base/utils/utils.h"
25 #include "core/components_ng/layout/layout_wrapper_builder.h"
26 #include "core/components_ng/layout/layout_wrapper_node.h"
27 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
28 #include "core/components_ng/syntax/lazy_for_each_model.h"
29 #include "core/components_ng/syntax/lazy_layout_wrapper_builder.h"
30 #include "test/unittest/core/syntax/mock_lazy_for_each_builder.h"
31 #undef private
32 #undef protected
33
34 using namespace testing;
35 using namespace testing::ext;
36
37 namespace OHOS::Ace::NG {
38 namespace {
39 const int32_t INDEX = 1;
40 constexpr int32_t NODE_ID_0 = 0;
41 constexpr int32_t NODE_ID_1 = 1;
42
CreateWrapperBuilder()43 RefPtr<LazyLayoutWrapperBuilder> CreateWrapperBuilder()
44 {
45 RefPtr<LazyForEachActuator> actuator = AceType::MakeRefPtr<LazyForEachActuator>();
46 auto builder = AceType::DynamicCast<LazyForEachBuilder>(actuator);
47 RefPtr<LazyForEachNode> host = AceType::MakeRefPtr<LazyForEachNode>(INDEX, builder);
48 RefPtr<LazyLayoutWrapperBuilder> wrapperBuilder = AceType::MakeRefPtr<LazyLayoutWrapperBuilder>(builder, host);
49 return wrapperBuilder;
50 }
51
CreateLayoutWrapper()52 RefPtr<LayoutWrapperNode> CreateLayoutWrapper()
53 {
54 auto rowFrameNode = FrameNode::CreateFrameNode("test", 0, AceType::MakeRefPtr<LinearLayoutPattern>(false));
55 RefPtr<GeometryNode> geometryNode = AceType::MakeRefPtr<GeometryNode>();
56 RefPtr<LayoutWrapperNode> layoutWrapper =
57 AceType::MakeRefPtr<LayoutWrapperNode>(rowFrameNode, geometryNode, rowFrameNode->GetLayoutProperty());
58 return layoutWrapper;
59 }
60 } // namespace
61
62 class LayoutWrapperBuildTestNg : public testing::Test {};
63
64 /**
65 * @tc.name: LayoutPropertyTest0001
66 * @tc.desc: Test the operation of layout_property.
67 * @tc.type: FUNC
68 */
69 HWTEST_F(LayoutWrapperBuildTestNg, LayoutWrapperBuildGetOrCreateWrapperByIndex, TestSize.Level1)
70 {
71 /**
72 * @tc.steps: step1. create a wrapperBuilder.
73 */
74 RefPtr<LazyLayoutWrapperBuilder> wrapperBuilder = CreateWrapperBuilder();
75
76 /**
77 * @tc.steps: step2. callback GetOrCreateWrapperByIndex
78 * @tc.expected: expect Return GetOrCreateWrapperByIndex is null.
79 */
80 wrapperBuilder->OnExpandChildLayoutWrapper();
81 auto test = wrapperBuilder->GetOrCreateWrapperByIndex(INDEX);
82 EXPECT_EQ(test, nullptr);
83
84 /**
85 * @tc.steps: step3. create a layoutWrapper for putting wrapperMap_.
86 */
87 wrapperBuilder->wrapperMap_ = std::unordered_map<int32_t, RefPtr<LayoutWrapper>>(
88 { { 1, CreateLayoutWrapper() }, { 2, CreateLayoutWrapper() } });
89
90 /**
91 * @tc.steps: step4. callback GetOrCreateWrapperByIndex
92 * @tc.expected: expect Return GetOrCreateWrapperByIndex is not null.
93 */
94 auto test1 = wrapperBuilder->GetOrCreateWrapperByIndex(INDEX);
95 ASSERT_NE(test1, nullptr);
96 }
97
98 /**
99 * @tc.name: LayoutPropertyTest0002
100 * @tc.desc: Test the operation of layout_property.
101 * @tc.type: FUNC
102 */
103 HWTEST_F(LayoutWrapperBuildTestNg, LayoutWrapperBuildExpandAllChildWrappers, TestSize.Level1)
104 {
105 /**
106 * @tc.steps: step1. create a wrapperBuilder and callback ExpandAllChildWrappers.
107 * @tc.expected: expect wrapperBuilder is not null.
108 */
109 RefPtr<LazyLayoutWrapperBuilder> wrapperBuilder = CreateWrapperBuilder();
110 wrapperBuilder->ExpandAllChildWrappers();
111 ASSERT_NE(wrapperBuilder, nullptr);
112 }
113
114 /**
115 * @tc.name: LayoutPropertyTest0003
116 * @tc.desc: Test the operation of layout_property.
117 * @tc.type: FUNC
118 */
119 HWTEST_F(LayoutWrapperBuildTestNg, LayoutWrapperBuildRemoveAllChildInRenderTree, TestSize.Level1)
120 {
121 /**
122 * @tc.steps: step1. create a wrapperBuilder and callback RemoveAllChildInRenderTree.
123 * @tc.expected: expect wrapperBuilder is not null.
124 */
125 RefPtr<LazyLayoutWrapperBuilder> wrapperBuilder = CreateWrapperBuilder();
126 wrapperBuilder->RemoveAllChildInRenderTree();
127 ASSERT_NE(wrapperBuilder, nullptr);
128
129 /**
130 * @tc.steps: step3. callback RemoveAllChildInRenderTree and build a std::unordered_map.
131 * @tc.expected: expect wrapperBuilder->wrapperMap_ is not null.
132 */
133 wrapperBuilder->wrapperMap_ = std::unordered_map<int32_t, RefPtr<LayoutWrapper>>(
134 { { 1, CreateLayoutWrapper() }, { 2, CreateLayoutWrapper() } });
135 wrapperBuilder->RemoveAllChildInRenderTree();
136 EXPECT_EQ(wrapperBuilder->wrapperMap_.size(), 2);
137 }
138
139 /**
140 * @tc.name: LayoutWrapperBuildTest0001
141 * @tc.desc: Test the operation of GetOrCreateWrapperByIndex.
142 * @tc.type: FUNC
143 */
144 HWTEST_F(LayoutWrapperBuildTestNg, LayoutWrapperBuildTest0001, TestSize.Level1)
145 {
146 /**
147 * @tc.steps: step1. create a wrapperBuilder.
148 */
149 RefPtr<LazyLayoutWrapperBuilder> wrapperBuilder = CreateWrapperBuilder();
150
151 /**
152 * @tc.steps: step2. callback GetOrCreateWrapperByIndex
153 * @tc.expected: expect Return GetOrCreateWrapperByIndex is null.
154 */
155 wrapperBuilder->OnExpandChildLayoutWrapper();
156 auto test = wrapperBuilder->GetOrCreateWrapperByIndex(INDEX);
157 EXPECT_EQ(test, nullptr);
158
159 /**
160 * @tc.steps: step2. add cachedItems_
161 * @tc.expected: add Successful.
162 */
163 RefPtr<LazyForEachBuilder> lazyEach = AceType::MakeRefPtr<Framework::MockLazyForEachBuilder>();
164 auto node = FrameNode::CreateFrameNode(OHOS::Ace::V2::FLEX_ETS_TAG, NODE_ID_0, AceType::MakeRefPtr<Pattern>());
165 auto node2 = FrameNode::CreateFrameNode(OHOS::Ace::V2::FLEX_ETS_TAG, NODE_ID_1, AceType::MakeRefPtr<Pattern>());
166 lazyEach->cachedItems_[INDEX] = std::make_pair("test1", node);
167 lazyEach->cachedItems_[INDEX + 1] = std::make_pair("test2", node2);
168 wrapperBuilder->builder_ = lazyEach;
169 EXPECT_EQ(lazyEach->GetTotalCount(), 2);
170
171 /**
172 * @tc.steps: step3. callback GetOrCreateWrapperByIndex
173 * @tc.expected: expect Return GetOrCreateWrapperByIndex is not null.
174 */
175 test = wrapperBuilder->GetOrCreateWrapperByIndex(INDEX);
176 EXPECT_NE(test, nullptr);
177 }
178 } // namespace OHOS::Ace::NG
179