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