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 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
48 RefPtr<ClickRecognizer> clicRecognizerSecond = AceType::MakeRefPtr<ClickRecognizer>(10, 5);
49 RefPtr<ClickRecognizer> clicRecognizerThird = AceType::MakeRefPtr<ClickRecognizer>(-1, 5);
50 clicRecognizerFirst->InitGlobalValue(SourceType::MOUSE);
51 clicRecognizerSecond->InitGlobalValue(SourceType::MOUSE);
52 clicRecognizerThird->InitGlobalValue(SourceType::MOUSE);
53 EXPECT_NE(clicRecognizerFirst, clicRecognizerSecond);
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 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
64 RefPtr<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 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
77 RefPtr<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.globalDisplayX = 10.1;
85 event.globalDisplayY = 10.1;
86 event.sourceType = SourceType::MOUSE;
87 event.sourceTool = SourceTool::PEN;
88 event.originalId = 1;
89 fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
90 auto status = fingersRecognizer->IsNeedResetStatus();
91 EXPECT_EQ(status, true);
92 }
93
94 template<class T>
95 class MockReferenced : public Referenced {
96 public:
97 MOCK_METHOD(RefPtr<T>, Claim, (T * rawPtr), ());
98 };
99
100 /**
101 * @tc.name: Test004
102 * @tc.desc: Test IsNeedResetStatus
103 * @tc.type: FUNC
104 */
105 HWTEST_F(MultiFingersRecognizerTestNg, Test004, TestSize.Level1)
106 {
107 MockReferenced<MultiFingersRecognizer> test;
108 EXPECT_CALL(test, Claim(_)).WillRepeatedly(Return(nullptr));
109 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
110 RefPtr<MultiFingersRecognizer> fingersRecognizer = clicRecognizerFirst;
111 AxisEvent event;
112 event.id = 1;
113 event.x = 10.1;
114 event.y = 10.1;
115 event.screenX = 10.1;
116 event.screenY = 10.1;
117 event.sourceType = SourceType::MOUSE;
118 event.sourceTool = SourceTool::PEN;
119 event.originalId = 1;
120 fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
121 auto status = fingersRecognizer->IsNeedResetStatus();
122 EXPECT_EQ(status, true);
123 }
124
125 class MockRecognizerGroup : public ClickRecognizer {
126 public:
127 MOCK_CONST_METHOD0(GetGroupRecognizer, const std::list<RefPtr<NGGestureRecognizer>>&());
128 };
129
130 /**
131 * @tc.name: Test005
132 * @tc.desc: Test IsNeedResetStatus
133 * @tc.type: FUNC
134 */
135 HWTEST_F(MultiFingersRecognizerTestNg, Test005, TestSize.Level1)
136 {
137 std::list<RefPtr<NGGestureRecognizer>> listTest;
138 listTest.resize(10, nullptr);
139 MockRecognizerGroup groupTest;
140 EXPECT_CALL(groupTest, GetGroupRecognizer()).WillRepeatedly(ReturnRef(listTest));
141 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
142 RefPtr<MultiFingersRecognizer> fingersRecognizer = clicRecognizerFirst;
143 AxisEvent event;
144 event.id = 1;
145 event.x = 10.1;
146 event.y = 10.1;
147 event.screenX = 10.1;
148 event.screenY = 10.1;
149 event.sourceType = SourceType::MOUSE;
150 event.sourceTool = SourceTool::PEN;
151 event.originalId = 1;
152 fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
153 auto status = fingersRecognizer->IsNeedResetStatus();
154 EXPECT_EQ(status, true);
155 }
156
157 class MockMultiFingersRecognizer : public MultiFingersRecognizer {
158 public:
159 MOCK_METHOD(void, OnFinishGestureReferee, (int32_t, bool), ());
160 MOCK_METHOD(bool, IsNeedResetStatus, (), ());
161 MOCK_METHOD(void, ResetStatusOnFinish, (bool isBlocked), ());
BatchAdjudicate(const RefPtr<NGGestureRecognizer> & recognizer,GestureDisposal disposal)162 void BatchAdjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal) {}
OnBeginGestureReferee(int32_t touchId,bool needUpdateChild=false)163 void OnBeginGestureReferee(int32_t touchId, bool needUpdateChild = false) {}
HandleTouchDownEvent(const TouchEvent & event)164 void HandleTouchDownEvent(const TouchEvent& event) {}
HandleTouchUpEvent(const TouchEvent & event)165 void HandleTouchUpEvent(const TouchEvent& event) {}
HandleTouchMoveEvent(const TouchEvent & event)166 void HandleTouchMoveEvent(const TouchEvent& event) {}
HandleTouchCancelEvent(const TouchEvent & event)167 void HandleTouchCancelEvent(const TouchEvent& event) {}
HandleTouchDownEvent(const AxisEvent & event)168 void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)169 void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)170 void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)171 void HandleTouchCancelEvent(const AxisEvent& event) {}
OnResetStatus()172 void OnResetStatus() {}
OnSucceedCancel()173 void OnSucceedCancel() {}
OnAccepted()174 void OnAccepted() {}
OnRejected()175 void OnRejected() {}
176 };
177
178 class MockNGGestureRecognizer : public NGGestureRecognizer {
179 public:
180 MOCK_METHOD(void, ResetStatusOnFinish, (bool isBlocked), ());
BatchAdjudicate(const RefPtr<NGGestureRecognizer> & recognizer,GestureDisposal disposal)181 void BatchAdjudicate(const RefPtr<NGGestureRecognizer>& recognizer, GestureDisposal disposal) {}
OnBeginGestureReferee(int32_t touchId,bool needUpdateChild=false)182 void OnBeginGestureReferee(int32_t touchId, bool needUpdateChild = false) {}
HandleTouchDownEvent(const TouchEvent & event)183 void HandleTouchDownEvent(const TouchEvent& event) {}
HandleTouchUpEvent(const TouchEvent & event)184 void HandleTouchUpEvent(const TouchEvent& event) {}
HandleTouchMoveEvent(const TouchEvent & event)185 void HandleTouchMoveEvent(const TouchEvent& event) {}
HandleTouchCancelEvent(const TouchEvent & event)186 void HandleTouchCancelEvent(const TouchEvent& event) {}
HandleTouchDownEvent(const AxisEvent & event)187 void HandleTouchDownEvent(const AxisEvent& event) {}
HandleTouchUpEvent(const AxisEvent & event)188 void HandleTouchUpEvent(const AxisEvent& event) {}
HandleTouchMoveEvent(const AxisEvent & event)189 void HandleTouchMoveEvent(const AxisEvent& event) {}
HandleTouchCancelEvent(const AxisEvent & event)190 void HandleTouchCancelEvent(const AxisEvent& event) {}
OnResetStatus()191 void OnResetStatus() {}
OnSucceedCancel()192 void OnSucceedCancel() {}
OnAccepted()193 void OnAccepted() {}
OnRejected()194 void OnRejected() {}
CheckTouchId(int32_t touchId)195 bool CheckTouchId(int32_t touchId)
196 {
197 return false;
198 }
GetTouchPoints()199 std::map<int32_t, TouchEvent> GetTouchPoints()
200 {
201 std::map<int32_t, TouchEvent> emptyTouchPoints;
202 return emptyTouchPoints;
203 }
204 };
205
206 /**
207 * @tc.name: Test006
208 * @tc.desc: Test UpdateTouchPointWithAxisEvent
209 * @tc.type: FUNC
210 */
211 HWTEST_F(MultiFingersRecognizerTestNg, Test006, TestSize.Level1)
212 {
213 std::list<RefPtr<NGGestureRecognizer>> listTest;
214 listTest.resize(10, nullptr);
215 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
216 RefPtr<MultiFingersRecognizer> fingersRecognizer = clicRecognizerFirst;
217 AxisEvent event;
218 event.id = 1;
219 event.x = 10.1;
220 event.y = 10.1;
221 event.screenX = 10.1;
222 event.screenY = 10.1;
223 event.sourceType = SourceType::MOUSE;
224 event.sourceTool = SourceTool::PEN;
225 event.originalId = 1;
226 fingersRecognizer->UpdateTouchPointWithAxisEvent(event);
227 EXPECT_EQ(event.originalId, 1);
228 }
229
230 /**
231 * @tc.name: Test007
232 * @tc.desc: Test CleanRecognizerState
233 * @tc.type: FUNC
234 */
235 HWTEST_F(MultiFingersRecognizerTestNg, Test007, TestSize.Level1)
236 {
237 RefPtr<ClickRecognizer> clicRecognizerFirst = AceType::MakeRefPtr<ClickRecognizer>(5, 5);
238 RefPtr<MultiFingersRecognizer> fingersRecognizer = clicRecognizerFirst;
239 fingersRecognizer->refereeState_ = RefereeState::SUCCEED;
240 fingersRecognizer->currentFingers_ = 0;
241 fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
242 fingersRecognizer->refereeState_ = RefereeState::FAIL;
243 fingersRecognizer->currentFingers_ = 0;
244 fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
245 fingersRecognizer->refereeState_ = RefereeState::DETECTING;
246 fingersRecognizer->currentFingers_ = 0;
247 fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
248 fingersRecognizer->refereeState_ = RefereeState::SUCCEED;
249 fingersRecognizer->currentFingers_ = 1;
250 fingersRecognizer->MultiFingersRecognizer::CleanRecognizerState();
251 EXPECT_EQ(fingersRecognizer->currentFingers_, 1);
252 }
253 }; // namespace OHOS::Ace::NG