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 #include "ui/base/ace_type.h"
18
19 using namespace testing;
20 using namespace testing::ext;
21
22 namespace OHOS::Ace::NG {
23 class RecognizerTestNgIssue : public GesturesCommonTestNg {
24 public:
25 static void SetUpTestSuite();
26 static void TearDownTestSuite();
27 };
28
SetUpTestSuite()29 void RecognizerTestNgIssue::SetUpTestSuite()
30 {
31 MockPipelineContext::SetUp();
32 }
33
TearDownTestSuite()34 void RecognizerTestNgIssue::TearDownTestSuite()
35 {
36 MockPipelineContext::TearDown();
37 }
38
39 /**
40 * @tc.name: LongPressRecognizerIssue001
41 * @tc.desc: Test LongPressRecognizer function: OnAccepted OnRejected
42 * @tc.type: FUNC
43 */
44 HWTEST_F(RecognizerTestNgIssue, LongPressRecognizerIssue001, TestSize.Level1)
45 {
46 /**
47 * @tc.steps: step1. create LongPressRecognizer.
48 */
49 RefPtr<LongPressRecognizer> longPressRecognizer =
50 AceType::MakeRefPtr<LongPressRecognizer>(LONG_PRESS_DURATION, FINGER_NUMBER, false);
51
52 /**
53 * @tc.steps: step2. call GetLongPressActionFunc function and compare result.
54 * @tc.steps: case1: normal case
55 * @tc.expected: step2. result equals.
56 */
57 TouchEvent downEvent;
58 downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::MOUSE);
59 longPressRecognizer->HandleTouchDownEvent(downEvent);
60 int64_t time = 0;
__anon4f0ae2820102(GestureEvent& info) 61 auto onAction = [&time](GestureEvent& info) { time = info.GetTimeStamp().time_since_epoch().count(); };
62 longPressRecognizer->SetOnAction(onAction);
63 longPressRecognizer->OnAccepted();
64 EXPECT_NE(time, 0);
65 }
66
67 /**
68 * @tc.name: LongPressRecognizerIssue002
69 * @tc.desc: Test LongPressRecognizer function: OnAccepted OnRejected
70 * @tc.type: FUNC
71 */
72 HWTEST_F(RecognizerTestNgIssue, LongPressRecognizerIssue002, TestSize.Level1)
73 {
74 /**
75 * @tc.steps: step1. create LongPressRecognizer.
76 */
77 RefPtr<LongPressRecognizer> longPressRecognizer =
78 AceType::MakeRefPtr<LongPressRecognizer>(LONG_PRESS_DURATION, COUNT, false);
79
80 /**
81 * @tc.steps: step2. call GetLongPressActionFunc function and compare result.
82 * @tc.steps: case1: normal case
83 * @tc.expected: step2. result equals.
84 */
85 TouchEvent downEvent;
86 downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::TOUCH);
87 longPressRecognizer->HandleTouchDownEvent(downEvent);
88 TouchEvent downFingerOneEvent;
89 downFingerOneEvent.SetId(1).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::TOUCH);
90 longPressRecognizer->touchPoints_[1] = downFingerOneEvent;
91 TouchEvent moveEvent;
92 std::chrono::nanoseconds nanoseconds(GetSysTimestamp());
93 moveEvent.SetId(0)
94 .SetType(TouchType::MOVE)
95 .SetX(100.0f)
96 .SetY(100.0f)
97 .SetSourceType(SourceType::TOUCH)
98 .SetTime(TimeStamp(nanoseconds));
99 longPressRecognizer->HandleTouchMoveEvent(moveEvent);
100 int64_t touchTime = 0;
101 int64_t mouseTime = 0;
__anon4f0ae2820202(GestureEvent& info) 102 auto onAction = [&touchTime, &mouseTime](GestureEvent& info) {
103 if (info.GetSourceDevice() == SourceType::MOUSE) {
104 mouseTime = info.GetTimeStamp().time_since_epoch().count();
105 } else {
106 touchTime = info.GetTimeStamp().time_since_epoch().count();
107 }
108 };
109 longPressRecognizer->SetOnAction(onAction);
110 longPressRecognizer->OnAccepted();
111 longPressRecognizer->ResetStatus();
112 downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::MOUSE);
113 longPressRecognizer->HandleTouchDownEvent(downEvent);
114 longPressRecognizer->OnAccepted();
115 EXPECT_NE(touchTime, mouseTime);
116 }
117
118 /**
119 * @tc.name: LongPressRecognizerIssue003
120 * @tc.desc: Test LongPressRecognizer callback info
121 * @tc.type: FUNC
122 */
123 HWTEST_F(RecognizerTestNgIssue, LongPressRecognizerIssue003, TestSize.Level1)
124 {
125 /**
126 * @tc.steps: step1. create LongPressRecognizer and set onAction.
127 */
128 RefPtr<LongPressRecognizer> longPressRecognizer =
129 AceType::MakeRefPtr<LongPressRecognizer>(LONG_PRESS_DURATION, 1, false);
130 GestureEvent eventInfo;
__anon4f0ae2820302(GestureEvent& info) 131 auto onActionStart = [&eventInfo](GestureEvent& info) { eventInfo = info; };
132 longPressRecognizer->SetOnAction(onActionStart);
133
134 /**
135 * @tc.steps: step2. DispatchTouchEvent and compare callback info.
136 * @tc.expected: step2. result equals.
137 */
138 TouchEvent downEvent;
139 downEvent.SetId(0)
140 .SetType(TouchType::DOWN)
141 .SetX(100.0f)
142 .SetY(100.0f)
143 .SetSourceType(SourceType::TOUCH)
144 .SetDeviceId(2);
145 longPressRecognizer->HandleEvent(downEvent);
146 TouchEvent downFingerOneEvent;
147 downFingerOneEvent.SetId(1)
148 .SetType(TouchType::DOWN)
149 .SetX(100.0f)
150 .SetY(100.0f)
151 .SetSourceType(SourceType::TOUCH)
152 .SetDeviceId(2);
153 longPressRecognizer->touchPoints_[1] = downFingerOneEvent;
154 TouchEvent moveEvent;
155 auto moveTime = GetSysTimestamp();
156 std::chrono::nanoseconds nanoseconds(moveTime);
157 moveEvent.SetId(0)
158 .SetType(TouchType::MOVE)
159 .SetX(100.0f)
160 .SetY(100.0f)
161 .SetScreenX(200.0f)
162 .SetScreenY(200.0f)
163 .SetSourceType(SourceType::TOUCH)
164 .SetSourceTool(SourceTool::FINGER)
165 .SetTime(TimeStamp(nanoseconds))
166 .SetForce(100.0f)
167 .SetTiltX(10.0f)
168 .SetTiltY(10.0f)
169 .SetTargetDisplayId(2);
170 longPressRecognizer->HandleEvent(moveEvent);
171 longPressRecognizer->OnAccepted();
172 EXPECT_EQ(eventInfo.GetTimeStamp().time_since_epoch().count(), moveTime);
173 EXPECT_EQ(eventInfo.GetRepeat(), false);
174 EXPECT_EQ(eventInfo.GetFingerList().size(), 2);
175 EXPECT_EQ(eventInfo.GetSourceDevice(), SourceType::TOUCH);
176 EXPECT_EQ(eventInfo.GetDeviceId(), 2);
177 EXPECT_EQ(eventInfo.GetGlobalPoint().GetX(), 100.0f);
178 EXPECT_EQ(eventInfo.GetGlobalPoint().GetY(), 100.0f);
179 EXPECT_EQ(eventInfo.GetScreenLocation().GetX(), 200.0f);
180 EXPECT_EQ(eventInfo.GetScreenLocation().GetY(), 200.0f);
181 EXPECT_EQ(eventInfo.GetGlobalLocation().GetX(), 100.0f);
182 EXPECT_EQ(eventInfo.GetGlobalLocation().GetY(), 100.0f);
183 EXPECT_EQ(eventInfo.GetLocalLocation().GetX(), 100.0f);
184 EXPECT_EQ(eventInfo.GetLocalLocation().GetY(), 100.0f);
185 EXPECT_EQ(eventInfo.GetForce(), 100.0f);
186 EXPECT_EQ(eventInfo.GetTiltX(), 10.0f);
187 EXPECT_EQ(eventInfo.GetTiltY(), 10.0f);
188 EXPECT_EQ(eventInfo.GetSourceTool(), SourceTool::FINGER);
189 EXPECT_EQ(eventInfo.GetInputEventType(), InputEventType::TOUCH_SCREEN);
190 }
191
192 /**
193 * @tc.name: PanRecognizerIssue001
194 * @tc.desc: Test PanRecognizer: Test the finger information of the current recognizer in the case of setting a single
195 * finger by pressing multiple fingers and lifting them.
196 * @tc.type: FUNC
197 */
198 HWTEST_F(RecognizerTestNgIssue, PanRecognizerIssue001, TestSize.Level1)
199 {
200 /**
201 * @tc.steps: step1. create PanRecognizer.
202 */
203 RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
204 panGestureOption->SetFingers(1);
205 PanDirection panDirection;
206 panDirection.type = PanDirection::ALL;
207 panGestureOption->SetDirection(panDirection);
208 panGestureOption->SetDistance(10.0f);
209 RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
210 /**
211 * @tc.steps: step2. DispatchTouchEvent with two different fingers and dispatch two up events.
212 * @tc.expected: step2. fingersId_ empty.
213 */
214 TouchEvent zeroDownEvent;
215 zeroDownEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
216 TouchEvent oneDownEvent;
217 oneDownEvent.SetId(1).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
218 panRecognizer->HandleEvent(zeroDownEvent);
219 panRecognizer->HandleEvent(oneDownEvent);
220 TouchEvent zeroUpEvent;
221 zeroUpEvent.SetId(0).SetType(TouchType::UP).SetX(100.0f).SetY(100.0f);
222 TouchEvent oneUpEvent;
223 oneUpEvent.SetId(1).SetType(TouchType::UP).SetX(100.0f).SetY(100.0f);
224 panRecognizer->HandleEvent(zeroUpEvent);
225 panRecognizer->HandleEvent(oneUpEvent);
226 EXPECT_TRUE(panRecognizer->fingersId_.empty());
227 }
228
229 /**
230 * @tc.name: RotationRecognizerIssue001
231 * @tc.desc: Test the rotating gesture by pressing two fingers, and when the gesture fails, lift finger number one and
232 * finger number one is cleared from activeFingers_ correctly.
233 * @tc.type: FUNC
234 */
235 HWTEST_F(RecognizerTestNgIssue, RotationRecognizerIssue001, TestSize.Level1)
236 {
237 /**
238 * @tc.steps: step1. create RotationRecognizer.
239 */
240 auto rotationRecognizer = AceType::MakeRefPtr<RotationRecognizer>(2, ROTATION_GESTURE_ANGLE);
241 /**
242 * @tc.steps: step2. DispatchTouchEvent with two different fingers and dispatch two up events.
243 * @tc.expected: step2. fingersId_ empty.
244 */
245 TouchEvent zeroDownEvent;
246 zeroDownEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
247 TouchEvent oneDownEvent;
248 oneDownEvent.SetId(1).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
249 rotationRecognizer->HandleEvent(zeroDownEvent);
250 rotationRecognizer->HandleEvent(oneDownEvent);
251 TouchEvent oneUpEvent;
252 oneUpEvent.SetId(1).SetType(TouchType::UP).SetX(100.0f).SetY(100.0f);
253 rotationRecognizer->HandleEvent(oneUpEvent);
254 EXPECT_EQ(std::find(rotationRecognizer->activeFingers_.begin(), rotationRecognizer->activeFingers_.end(), 1),
255 rotationRecognizer->activeFingers_.end());
256 EXPECT_EQ(rotationRecognizer->refereeState_, RefereeState::FAIL);
257 }
258
259 /**
260 * @tc.name: PinchRecognizerIssue001
261 * @tc.desc: Test the pinch gesture by pressing two fingers, and when the gesture fails, lift finger number one and
262 * finger number one is cleared from activeFingers_ correctly.
263 * @tc.type: FUNC
264 */
265 HWTEST_F(RecognizerTestNgIssue, PinchRecognizerIssue001, TestSize.Level1)
266 {
267 /**
268 * @tc.steps: step1. create PinchRecognizer.
269 */
270 auto pinchRecognizer = AceType::MakeRefPtr<PinchRecognizer>(2, PINCH_GESTURE_DISTANCE);
271 /**
272 * @tc.steps: step2. DispatchTouchEvent with two different fingers and dispatch two up events.
273 * @tc.expected: step2. fingersId_ empty.
274 */
275 TouchEvent zeroDownEvent;
276 zeroDownEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
277 TouchEvent oneDownEvent;
278 oneDownEvent.SetId(1).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
279 pinchRecognizer->HandleEvent(zeroDownEvent);
280 pinchRecognizer->HandleEvent(oneDownEvent);
281 TouchEvent oneUpEvent;
282 oneUpEvent.SetId(1).SetType(TouchType::UP).SetX(100.0f).SetY(100.0f);
283 pinchRecognizer->HandleEvent(oneUpEvent);
284 EXPECT_EQ(std::find(pinchRecognizer->activeFingers_.begin(), pinchRecognizer->activeFingers_.end(), 1),
285 pinchRecognizer->activeFingers_.end());
286 EXPECT_EQ(pinchRecognizer->refereeState_, RefereeState::FAIL);
287 }
288
289 /**
290 * @tc.name: TargetDisplayId001
291 * @tc.desc: Test SetTargetDisplayId GetTargetDisplayId
292 * @tc.type: FUNC
293 */
294 HWTEST_F(RecognizerTestNgIssue, TargetDisplayId001, TestSize.Level1)
295 {
296 RefPtr<LongPressRecognizer> longPressRecognizer =
297 AceType::MakeRefPtr<LongPressRecognizer>(LONG_PRESS_DURATION, 1, false);
298 GestureEvent eventInfo;
__anon4f0ae2820402(GestureEvent& info) 299 auto onActionStart = [&eventInfo](GestureEvent& info) { eventInfo = info; };
300 longPressRecognizer->SetOnAction(onActionStart);
301
302 TouchEvent downEvent;
303 downEvent.SetId(0)
304 .SetType(TouchType::DOWN)
305 .SetX(100.0f)
306 .SetY(100.0f)
307 .SetSourceType(SourceType::TOUCH)
308 .SetDeviceId(2);
309 longPressRecognizer->HandleEvent(downEvent);
310 TouchEvent downFingerOneEvent;
311 downFingerOneEvent.SetId(1)
312 .SetType(TouchType::DOWN)
313 .SetX(100.0f)
314 .SetY(100.0f)
315 .SetSourceType(SourceType::TOUCH)
316 .SetDeviceId(2);
317 longPressRecognizer->touchPoints_[1] = downFingerOneEvent;
318 TouchEvent moveEvent;
319 auto moveTime = GetSysTimestamp();
320 std::chrono::nanoseconds nanoseconds(moveTime);
321 moveEvent.SetId(0)
322 .SetType(TouchType::MOVE)
323 .SetX(100.0f)
324 .SetY(100.0f)
325 .SetScreenX(200.0f)
326 .SetScreenY(200.0f)
327 .SetSourceType(SourceType::TOUCH)
328 .SetSourceTool(SourceTool::FINGER)
329 .SetTime(TimeStamp(nanoseconds))
330 .SetForce(100.0f)
331 .SetTiltX(10.0f)
332 .SetTiltY(10.0f)
333 .SetTargetDisplayId(2);
334 longPressRecognizer->HandleEvent(moveEvent);
335 longPressRecognizer->OnAccepted();
336 EXPECT_EQ(eventInfo.GetTargetDisplayId(), 2);
337 }
338 } // namespace OHOS::Ace::NG