1 /*
2 * Copyright (c) 2024 Huawei Device 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 <cstddef>
17 #include <optional>
18 #include <memory>
19
20 #include "gtest/gtest.h"
21
22 #define protected public
23 #define private public
24
25 #include "mock/mock_form_utils.h"
26 #include "mock/mock_sub_container.h"
27 #include "test/mock/core/common/mock_container.h"
28 #include "test/mock/core/pipeline/mock_pipeline_context.h"
29 #include "test/mock/core/render/mock_render_context.h"
30
31 #include "core/components_ng/base/view_stack_processor.h"
32 #include "core/components_ng/pattern/form/form_node.h"
33 #include "core/components_ng/pattern/form/form_pattern.h"
34
35 using namespace testing;
36 using namespace testing::ext;
37 namespace OHOS::Ace::NG {
38 class FormNodeTest : public testing::Test {
39 public:
40 static void SetUpTestSuite();
41 static void TearDownTestSuite();
42 protected:
43 static RefPtr<FormNode> CreateFromNode();
44 };
45
SetUpTestSuite()46 void FormNodeTest::SetUpTestSuite()
47 {
48 MockPipelineContext::SetUp();
49 MockContainer::SetUp();
50 }
51
TearDownTestSuite()52 void FormNodeTest::TearDownTestSuite()
53 {
54 MockPipelineContext::TearDown();
55 MockContainer::TearDown();
56 }
57
CreateFromNode()58 RefPtr<FormNode> FormNodeTest::CreateFromNode()
59 {
60 auto* stack = ViewStackProcessor::GetInstance();
61 auto formNode = FormNode::GetOrCreateFormNode(
62 "FormComponent", stack->ClaimNodeId(), []() { return AceType::MakeRefPtr<FormPattern>(); });
63 auto pattern = formNode->GetPattern<FormPattern>();
64 pattern->frameNode_ = formNode;
65 return formNode;
66 }
67
68 /**
69 * @tc.name: FormNodeTest_001
70 * @tc.desc: TouchTest
71 * @tc.type: FUNC
72 */
73 HWTEST_F(FormNodeTest, FormNodeTest_001, TestSize.Level1)
74 {
75 PointF globalPoint;
76 PointF parentLocalPoint;
77 PointF parentRevertPoint;
78 TouchRestrict touchRestrict;
79 touchRestrict.hitTestType = SourceType::MOUSE;
80 TouchTestResult result;
81 int32_t touchId = 0;
82 ResponseLinkResult responseLinkResult;
83 bool isDispatch = false;
84 auto formNode = CreateFromNode();
85 auto res = formNode->TouchTest(globalPoint, parentLocalPoint,
86 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
87 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
88
89 touchRestrict.hitTestType = SourceType::NONE;
90 res = formNode->TouchTest(globalPoint, parentLocalPoint,
91 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
92 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
93
94 PipelineContext* contextBak = formNode->GetContext();
95 formNode->context_ = nullptr;
96 res = formNode->TouchTest(globalPoint, parentLocalPoint,
97 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
98 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
99 formNode->context_ = contextBak;
100
101 auto patternBak = formNode->GetPattern<FormPattern>();
102 formNode->pattern_ = nullptr;
103 res = formNode->TouchTest(globalPoint, parentLocalPoint,
104 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
105 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
106 formNode->pattern_ = patternBak;
107
108 auto pattern = formNode->GetPattern<FormPattern>();
109 WeakPtr<PipelineContext> context = WeakPtr<PipelineContext>();
110 auto subContainer = AceType::MakeRefPtr<MockSubContainer>(context);
111 ASSERT_NE(subContainer, nullptr);
112 subContainer->instanceId_ = 0;
113
114 EXPECT_EQ(pattern->subContainer_, nullptr);
115 res = formNode->TouchTest(globalPoint, parentLocalPoint,
116 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
117 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
118 pattern->subContainer_ = subContainer;
119
120 FrontendType uiSyntaxBak = FrontendType::JS_CARD;
121 pattern->subContainer_->uiSyntax_ = FrontendType::ETS_CARD;
122 res = formNode->TouchTest(globalPoint, parentLocalPoint,
123 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
124 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
125 pattern->subContainer_->uiSyntax_ = uiSyntaxBak;
126
127 res = formNode->TouchTest(globalPoint, parentLocalPoint,
128 parentRevertPoint, touchRestrict, result, touchId, responseLinkResult, isDispatch);
129 EXPECT_EQ(res, HitTestResult::OUT_OF_REGION);
130 }
131
132 /**
133 * @tc.name: FormNodeTest_002
134 * @tc.desc: OnAccessibilityDumpChildInfo
135 * @tc.type: FUNC
136 */
137 HWTEST_F(FormNodeTest, FormNodeTest_002, TestSize.Level1)
138 {
139 RefPtr<FrameNode> formNode = CreateFromNode();
140 auto pattern = formNode->GetPattern<FormPattern>();
141 ASSERT_NE(pattern, nullptr);
142
143 std::vector<std::string> params;
144 std::vector<std::string> info;
145 pattern->OnAccessibilityDumpChildInfo(params, info);
146 ASSERT_NE(pattern->formManagerBridge_, nullptr);
147 pattern->UpdateStaticCard();
148 auto retRef = pattern->GetAccessibilitySessionAdapter();
149 ASSERT_NE(retRef, nullptr);
150 }
151
152 /**
153 * @tc.name: FormNodeTest_003
154 * @tc.desc: GetFormOffset
155 * @tc.type: FUNC
156 */
157 HWTEST_F(FormNodeTest, FormNodeTest_003, TestSize.Level1)
158 {
159 auto formNode = CreateFromNode();
160 EXPECT_NE(formNode, nullptr);
161
162 auto pattern = formNode->GetPattern<FormPattern>();
163 ASSERT_NE(pattern, nullptr);
164 WeakPtr<PipelineBase> context = WeakPtr<PipelineBase>();
165 formNode->renderContext_ = nullptr;
166 pattern->frameNode_ = formNode;
167
168 OffsetF res = formNode->GetFormOffset();
169 EXPECT_EQ(res, OffsetF());
170 }
171
172 /**
173 * @tc.name: FormNodeTest_004
174 * @tc.desc: OnAccessibilityChildTreeRegister and OnAccessibilityChildTreeDeregister
175 * @tc.type: FUNC
176 */
177 HWTEST_F(FormNodeTest, FormNodeTest_004, TestSize.Level1)
178 {
179 RefPtr<FormNode> formNode = CreateFromNode();
180 auto pattern = formNode->GetPattern<FormPattern>();
181 ASSERT_NE(pattern, nullptr);
182
183 std::vector<std::string> infos;
184 std::string tmpStr = "action";
185 infos.emplace_back(tmpStr);
186 pattern->SetFormLinkInfos(infos);
187 uint32_t windowId = 0;
188 int32_t treeId = 0;
189 formNode->OnAccessibilityChildTreeRegister(windowId, treeId);
190 ASSERT_NE(pattern->formManagerBridge_, nullptr);
191
192 formNode->OnAccessibilityChildTreeDeregister();
193 ASSERT_NE(pattern->formManagerBridge_, nullptr);
194 }
195
196 /**
197 * @tc.name: FormNodeTest_005
198 * @tc.desc: OnDetachFromMainTree
199 * @tc.type: FUNC
200 */
201 HWTEST_F(FormNodeTest, FormNodeTest_005, TestSize.Level1)
202 {
203 auto formNode = CreateFromNode();
204 auto focusHub = formNode->GetFocusHub();
205 EXPECT_EQ(focusHub, nullptr);
206
207 auto formNode1 = CreateFromNode();
208 formNode->AddChild(formNode1);
209 formNode1->OnDetachFromMainTree(true);
210 auto root = formNode1->GetParent();
211 EXPECT_EQ(root, 1);
212
213 auto formNode2 = CreateFromNode();
214 formNode->AddChild(formNode2);
215 formNode2->OnDetachFromMainTree(false);
216 root = formNode2->GetParent();
217 EXPECT_NE(root, 0);
218 }
219
220 /**
221 * @tc.name: FormNodeTest_006
222 * @tc.desc: OnSetAccessibilityChildTree
223 * @tc.type: FUNC
224 */
225 HWTEST_F(FormNodeTest, FormNodeTest_006, TestSize.Level1)
226 {
227 auto formNode = CreateFromNode();
228 int32_t childWindowId = 1;
229 int32_t childTreeId = 2;
230 formNode->OnSetAccessibilityChildTree(childWindowId, childTreeId);
231 auto accessibilityProperty = formNode->GetAccessibilityProperty<AccessibilityProperty>();
232 ASSERT_NE(accessibilityProperty, nullptr);
233 EXPECT_EQ(accessibilityProperty->GetChildWindowId(), childWindowId);
234 EXPECT_EQ(accessibilityProperty->GetChildTreeId(), childTreeId);
235 }
236
237 /**
238 * @tc.name: FormNodeTest_007
239 * @tc.desc: OnAccessibilityDumpChildInfo
240 * @tc.type: FUNC
241 */
242 HWTEST_F(FormNodeTest, FormNodeTest_007, TestSize.Level1)
243 {
244 RefPtr<FrameNode> formNode = CreateFromNode();
245 auto pattern = formNode->GetPattern<FormPattern>();
246 ASSERT_NE(pattern, nullptr);
247
248 std::vector<std::string> params;
249 std::vector<std::string> info;
250 pattern->OnAccessibilityDumpChildInfo(params, info);
251 ASSERT_NE(pattern->formManagerBridge_, nullptr);
252 }
253 } // namespace OHOS::Ace::NG