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 #include "gtest/gtest.h"
16 #include "test/unittest/core/gestures/gestures_common_test_ng.h"
17 
18 #include "core/components_ng/gestures/recognizers/click_recognizer.h"
19 #include "core/components_ng/gestures/recognizers/multi_fingers_recognizer.h"
20 #include "core/event/ace_events.h"
21 
22 using namespace testing;
23 using namespace testing::ext;
24 namespace OHOS::Ace::NG {
25 class MultiFingersRecognizerTestNg : public testing::Test {
26 public:
27     static void SetUpTestSuite();
28     static void TearDownTestSuite();
29 };
30 
SetUpTestSuite()31 void MultiFingersRecognizerTestNg::SetUpTestSuite()
32 {
33     MockPipelineContext::SetUp();
34 }
35 
TearDownTestSuite()36 void MultiFingersRecognizerTestNg::TearDownTestSuite()
37 {
38     MockPipelineContext::TearDown();
39 }
40 /**
41  * @tc.name: Test001
42  * @tc.desc: Test InitGlobalValue
43  * @tc.type: FUNC
44  */
45 HWTEST_F(MultiFingersRecognizerTestNg, Test001, TestSize.Level1)
46 {
47     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
48     auto clicRecognizerSecond = new ClickRecognizer(10, 5);
49     auto clicRecognizerThird = new ClickRecognizer(-1, 5);
50     clicRecognizerFirst->InitGlobalValue(SourceType::MOUSE);
51     clicRecognizerSecond->InitGlobalValue(SourceType::MOUSE);
52     clicRecognizerThird->InitGlobalValue(SourceType::MOUSE);
53     SUCCEED();
54 }
55 
56 /**
57  * @tc.name: Test002
58  * @tc.desc: Test IsNeedResetStatus
59  * @tc.type: FUNC
60  */
61 HWTEST_F(MultiFingersRecognizerTestNg, Test002, TestSize.Level1)
62 {
63     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
64     MultiFingersRecognizer* fingersRecognizer = clicRecognizerFirst;
65     auto status = fingersRecognizer->IsNeedResetStatus();
66     EXPECT_EQ(status, true);
67 }
68 
69 /**
70  * @tc.name: Test003
71  * @tc.desc: Test IsNeedResetStatus
72  * @tc.type: FUNC
73  */
74 HWTEST_F(MultiFingersRecognizerTestNg, Test003, TestSize.Level1)
75 {
76     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
77     MultiFingersRecognizer* fingersRecognizer = clicRecognizerFirst;
78     AxisEvent event;
79     event.id = 1;
80     event.x = 10.1;
81     event.y = 10.1;
82     event.screenX = 10.1;
83     event.screenY = 10.1;
84     event.sourceType = SourceType::MOUSE;
85     event.sourceTool = SourceTool::PEN;
86     event.originalId = 1;
87     fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
88     auto status = fingersRecognizer->IsNeedResetStatus();
89     EXPECT_EQ(status, true);
90 }
91 
92 template<class T>
93 class MockReferenced : public Referenced {
94 public:
95     MOCK_METHOD(RefPtr<T>, Claim, (T * rawPtr), ());
96 };
97 
98 /**
99  * @tc.name: Test004
100  * @tc.desc: Test IsNeedResetStatus
101  * @tc.type: FUNC
102  */
103 HWTEST_F(MultiFingersRecognizerTestNg, Test004, TestSize.Level1)
104 {
105     MockReferenced<MultiFingersRecognizer> test;
106     EXPECT_CALL(test, Claim(_)).WillRepeatedly(Return(nullptr));
107     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
108     MultiFingersRecognizer* fingersRecognizer = clicRecognizerFirst;
109     AxisEvent event;
110     event.id = 1;
111     event.x = 10.1;
112     event.y = 10.1;
113     event.screenX = 10.1;
114     event.screenY = 10.1;
115     event.sourceType = SourceType::MOUSE;
116     event.sourceTool = SourceTool::PEN;
117     event.originalId = 1;
118     fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
119     auto status = fingersRecognizer->IsNeedResetStatus();
120     EXPECT_EQ(status, true);
121 }
122 
123 class MockRecognizerGroup : public ClickRecognizer {
124 public:
125     MOCK_CONST_METHOD0(GetGroupRecognizer, const std::list<RefPtr<NGGestureRecognizer>>&());
126 };
127 
128 /**
129  * @tc.name: Test005
130  * @tc.desc: Test IsNeedResetStatus
131  * @tc.type: FUNC
132  */
133 HWTEST_F(MultiFingersRecognizerTestNg, Test005, TestSize.Level1)
134 {
135     std::list<RefPtr<NGGestureRecognizer>> listTest;
136     listTest.resize(10, nullptr);
137     MockRecognizerGroup groupTest;
138     EXPECT_CALL(groupTest, GetGroupRecognizer()).WillRepeatedly(ReturnRef(listTest));
139     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
140     MultiFingersRecognizer* fingersRecognizer = clicRecognizerFirst;
141     AxisEvent event;
142     event.id = 1;
143     event.x = 10.1;
144     event.y = 10.1;
145     event.screenX = 10.1;
146     event.screenY = 10.1;
147     event.sourceType = SourceType::MOUSE;
148     event.sourceTool = SourceTool::PEN;
149     event.originalId = 1;
150     fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
151     auto status = fingersRecognizer->IsNeedResetStatus();
152     EXPECT_EQ(status, true);
153 }
154 
155 class MockMultiFingersRecognizer : public MultiFingersRecognizer {
156 public:
157     MOCK_METHOD(void, OnFinishGestureReferee, (int32_t, bool), ());
158     MOCK_METHOD(bool, IsNeedResetStatus, (), ());
159     MOCK_METHOD(void, ResetStatusOnFinish, (bool isBlocked), ());
BatchAdjudicate(const RefPtr<NGGestureRecognizer> & recognizer,GestureDisposal disposal)160     void BatchAdjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal) {}
OnBeginGestureReferee(int32_t touchId,bool needUpdateChild=false)161     void OnBeginGestureReferee(int32_t touchId, bool needUpdateChild = false) {}
HandleTouchDownEvent(const TouchEvent & event)162     void HandleTouchDownEvent(const TouchEvent& event) {}
HandleTouchUpEvent(const TouchEvent & event)163     void HandleTouchUpEvent(const TouchEvent& event) {}
HandleTouchMoveEvent(const TouchEvent & event)164     void HandleTouchMoveEvent(const TouchEvent& event) {}
HandleTouchCancelEvent(const TouchEvent & event)165     void HandleTouchCancelEvent(const TouchEvent& event) {}
HandleTouchDownEvent(const AxisEvent & event)166     void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)167     void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)168     void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)169     void HandleTouchCancelEvent(const AxisEvent& event) {}
OnResetStatus()170     void OnResetStatus() {}
OnSucceedCancel()171     void OnSucceedCancel() {}
OnAccepted()172     void OnAccepted() {}
OnRejected()173     void OnRejected() {}
174 };
175 
176 class MockNGGestureRecognizer : public NGGestureRecognizer {
177 public:
178     MOCK_METHOD(void, ResetStatusOnFinish, (bool isBlocked), ());
BatchAdjudicate(const RefPtr<NGGestureRecognizer> & recognizer,GestureDisposal disposal)179     void BatchAdjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal) {}
OnBeginGestureReferee(int32_t touchId,bool needUpdateChild=false)180     void OnBeginGestureReferee(int32_t touchId, bool needUpdateChild = false) {}
HandleTouchDownEvent(const TouchEvent & event)181     void HandleTouchDownEvent(const TouchEvent& event) {}
HandleTouchUpEvent(const TouchEvent & event)182     void HandleTouchUpEvent(const TouchEvent& event) {}
HandleTouchMoveEvent(const TouchEvent & event)183     void HandleTouchMoveEvent(const TouchEvent& event) {}
HandleTouchCancelEvent(const TouchEvent & event)184     void HandleTouchCancelEvent(const TouchEvent& event) {}
HandleTouchDownEvent(const AxisEvent & event)185     void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)186     void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)187     void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)188     void HandleTouchCancelEvent(const AxisEvent& event) {}
OnResetStatus()189     void OnResetStatus() {}
OnSucceedCancel()190     void OnSucceedCancel() {}
OnAccepted()191     void OnAccepted() {}
OnRejected()192     void OnRejected() {}
CheckTouchId(int32_t touchId)193     bool CheckTouchId(int32_t touchId)
194     {
195         return false;
196     }
197 };
198 
199 /**
200  * @tc.name: Test006
201  * @tc.desc: Test UpdateTouchPointWithAxisEvent
202  * @tc.type: FUNC
203  */
204 HWTEST_F(MultiFingersRecognizerTestNg, Test006, TestSize.Level1)
205 {
206     std::list<RefPtr<NGGestureRecognizer>> listTest;
207     listTest.resize(10, nullptr);
208     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
209     MultiFingersRecognizer* fingersRecognizer = clicRecognizerFirst;
210     AxisEvent event;
211     event.id = 1;
212     event.x = 10.1;
213     event.y = 10.1;
214     event.screenX = 10.1;
215     event.screenY = 10.1;
216     event.sourceType = SourceType::MOUSE;
217     event.sourceTool = SourceTool::PEN;
218     event.originalId = 1;
219     fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
220     SUCCEED();
221 }
222 
223 /**
224  * @tc.name: Test007
225  * @tc.desc: Test CleanRecognizerState
226  * @tc.type: FUNC
227  */
228 HWTEST_F(MultiFingersRecognizerTestNg, Test007, TestSize.Level1)
229 {
230     auto clicRecognizerFirst = new ClickRecognizer(5, 5);
231     auto fingersRecognizer = AceType::DynamicCast<MultiFingersRecognizer>(clicRecognizerFirst);
232     fingersRecognizer->refereeState_ = RefereeState::SUCCEED;
233     fingersRecognizer->currentFingers_ = 0;
234     fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
235     SUCCEED();
236     fingersRecognizer->refereeState_ = RefereeState::FAIL;
237     fingersRecognizer->currentFingers_ = 0;
238     fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
239     SUCCEED();
240     fingersRecognizer->refereeState_ = RefereeState::DETECTING;
241     fingersRecognizer->currentFingers_ = 0;
242     fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
243     SUCCEED();
244     fingersRecognizer->refereeState_ = RefereeState::SUCCEED;
245     fingersRecognizer->currentFingers_ = 1;
246     fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
247     SUCCEED();
248 }
249 }; // namespace OHOS::Ace::NG