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