• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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