• 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 "test/unittest/core/gestures/pan_recognizer_test_utils.h"
18 #include "test/unittest/core/gestures/recognizer_test_utils.h"
19 
20 #include "core/components_ng/gestures/recognizers/gesture_recognizer.h"
21 #include "core/event/ace_events.h"
22 #include "core/gestures/gesture_info.h"
23 #include "core/pipeline/base/constants.h"
24 
25 using namespace testing;
26 using namespace testing::ext;
27 
28 namespace OHOS::Ace::NG {
29 
30 struct InputInfos {
31     PointF startPoint;
32     int32_t fingerId;
33     PanQuadrantDirection direction;
34     ComparationResult compare;
InputInfosOHOS::Ace::NG::InputInfos35     InputInfos(PointF startPoint, int32_t fingerId, PanQuadrantDirection direction, ComparationResult compare)
36         : startPoint(startPoint), fingerId(fingerId), direction(direction), compare(compare)
37     {}
38 };
39 
40 struct PanTestCase {
41     int32_t fingers = 0;
42     float distance = 0.0f;
43     PanDirection direction;
44     std::vector<InputInfos> infos;
45     RefereeState expectResult;
PanTestCaseOHOS::Ace::NG::PanTestCase46     PanTestCase(int32_t fingers, float distance, PanDirection direction, std::vector<InputInfos> infos,
47         RefereeState expectResult)
48         : fingers(fingers), distance(distance), direction(direction), infos(std::move(infos)),
49           expectResult(expectResult)
50     {}
51 };
52 
53 const std::vector<PanTestCase> TEST_CASES = {
54     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
55         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::LESS),
56             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::LESS) },
57         RefereeState::DETECTING), // case 0
58     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
59         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT),
60             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT) },
61         RefereeState::DETECTING), // case 1
62     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
63         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::GREAT),
64             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::GREAT) },
65         RefereeState::SUCCEED), // case 2
66     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
67         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_ONE, ComparationResult::GREAT),
68             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_ONE, ComparationResult::GREAT) },
69         RefereeState::SUCCEED), // case 3
70     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
71         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::LESS) },
72         RefereeState::DETECTING), // case 4
73     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
74         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT) },
75         RefereeState::DETECTING), // case 5
76     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
77         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::GREAT) },
78         RefereeState::SUCCEED), // case 6
79     PanTestCase(1, 10.0f, { PanDirection::VERTICAL },
80         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_ONE, ComparationResult::GREAT) },
81         RefereeState::SUCCEED), // case 7
82     PanTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
83         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
84         RefereeState::DETECTING), // case 8
85     PanTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
86         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT) },
87         RefereeState::SUCCEED), // case 9
88     PanTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
89         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_SEVEN, ComparationResult::GREAT) },
90         RefereeState::DETECTING), // case 10
91     PanTestCase(1, 15.0f, { PanDirection::ALL },
92         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_THREE, ComparationResult::GREAT) },
93         RefereeState::SUCCEED), // case 11
94     PanTestCase(1, 15.0f, { PanDirection::ALL },
95         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FOUR, ComparationResult::GREAT) },
96         RefereeState::SUCCEED), // case 12
97     PanTestCase(1, 15.0f, { PanDirection::LEFT },
98         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT) },
99         RefereeState::FAIL), // case 13
100     PanTestCase(1, 15.0f, { PanDirection::LEFT },
101         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_THREE, ComparationResult::GREAT) },
102         RefereeState::SUCCEED), // case 14
103     PanTestCase(1, 15.0f, { PanDirection::RIGHT },
104         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
105         RefereeState::DETECTING), // case 15
106     PanTestCase(1, 15.0f, { PanDirection::RIGHT },
107         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT) },
108         RefereeState::SUCCEED), // case 16
109     PanTestCase(1, 15.0f, { PanDirection::UP },
110         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT) },
111         RefereeState::SUCCEED), // case 17
112     PanTestCase(1, 15.0f, { PanDirection::UP },
113         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SIX, ComparationResult::GREAT) },
114         RefereeState::FAIL), // case 18
115     PanTestCase(1, 15.0f, { PanDirection::UP },
116         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_THREE, ComparationResult::GREAT) },
117         RefereeState::SUCCEED), // case 19
118     PanTestCase(1, 15.0f, { PanDirection::DOWN },
119         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
120         RefereeState::FAIL), // case 20
121     PanTestCase(1, 15.0f, { PanDirection::DOWN },
122         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::GREAT) },
123         RefereeState::SUCCEED), // case 21
124     PanTestCase(1, 15.0f, { PanDirection::DOWN },
125         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_FIVE, ComparationResult::GREAT) },
126         RefereeState::SUCCEED), // case 22
127     PanTestCase(1, 15.0f, { PanDirection::NONE },
128         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT) },
129         RefereeState::FAIL), // case 23
130     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
131         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT) },
132         RefereeState::READY), // case 24
133     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
134         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_SIX, ComparationResult::EQUAL),
135             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_SIX, ComparationResult::EQUAL),
136             InputInfos(PointF { 100.0f, 100.0f }, 2, PanQuadrantDirection::LINE_SIX, ComparationResult::EQUAL) },
137         RefereeState::SUCCEED), // case 25
138     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
139         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::LESS),
140             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::LESS) },
141         RefereeState::DETECTING), // case 26
142     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
143         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::LESS),
144             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::LESS) },
145         RefereeState::DETECTING), // case 27
146     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
147         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_ONE, ComparationResult::LESS),
148             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_ONE, ComparationResult::LESS) },
149         RefereeState::DETECTING), // case 28
150     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
151         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT),
152             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
153         RefereeState::SUCCEED), // case 29
154     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
155         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT),
156             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT) },
157         RefereeState::DETECTING), // case 30
158     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
159         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_SEVEN, ComparationResult::GREAT),
160             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_SEVEN, ComparationResult::GREAT) },
161         RefereeState::SUCCEED), // case 31
162     PanTestCase(2, 15.0f, { PanDirection::VERTICAL },
163         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_SIX, ComparationResult::EQUAL),
164             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_SIX, ComparationResult::EQUAL) },
165         RefereeState::SUCCEED), // case 32
166     PanTestCase(2, 15.0f, { PanDirection::HORIZONTAL },
167         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_FOUR, ComparationResult::GREAT),
168             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_FOUR, ComparationResult::GREAT),
169             InputInfos(PointF { 100.0f, 100.0f }, 2, PanQuadrantDirection::LINE_FOUR, ComparationResult::GREAT) },
170         RefereeState::SUCCEED), // case 33
171     PanTestCase(2, 15.0f, { PanDirection::HORIZONTAL },
172         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_ZERO, ComparationResult::EQUAL),
173             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_ZERO, ComparationResult::EQUAL),
174             InputInfos(PointF { 100.0f, 100.0f }, 2, PanQuadrantDirection::LINE_ZERO, ComparationResult::EQUAL) },
175         RefereeState::SUCCEED), // case 34
176     PanTestCase(2, 15.0f, { PanDirection::HORIZONTAL },
177         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_ZERO, ComparationResult::EQUAL),
178             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_ZERO, ComparationResult::EQUAL) },
179         RefereeState::SUCCEED), // case 35
180     PanTestCase(2, 15.0f, { PanDirection::HORIZONTAL },
181         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_TWO, ComparationResult::EQUAL),
182             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_TWO, ComparationResult::EQUAL) },
183         RefereeState::DETECTING), // case 36
184     PanTestCase(2, 15.0f, { PanDirection::HORIZONTAL },
185         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_FOUR, ComparationResult::GREAT),
186             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_FOUR, ComparationResult::GREAT) },
187         RefereeState::SUCCEED), // case 37
188     PanTestCase(2, 10.0f, { PanDirection::ALL },
189         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT),
190             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT),
191             InputInfos(PointF { 100.0f, 100.0f }, 2, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT) },
192         RefereeState::SUCCEED), // case 38
193     PanTestCase(2, 10.0f, { PanDirection::ALL },
194         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FOUR, ComparationResult::GREAT),
195             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_FOUR, ComparationResult::GREAT),
196             InputInfos(PointF { 100.0f, 100.0f }, 2, PanQuadrantDirection::QUADRANT_FOUR, ComparationResult::GREAT) },
197         RefereeState::SUCCEED), // case 39
198     PanTestCase(2, 10.0f, { PanDirection::ALL },
199         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT),
200             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
201         RefereeState::SUCCEED), // case 40
202     PanTestCase(2, 10.0f, { PanDirection::ALL },
203         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT),
204             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT) },
205         RefereeState::SUCCEED), // case 41
206     PanTestCase(2, 10.0f, { PanDirection::LEFT },
207         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT),
208             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ZERO, ComparationResult::GREAT) },
209         RefereeState::FAIL), // case 42
210     PanTestCase(2, 10.0f, { PanDirection::LEFT },
211         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_THREE, ComparationResult::GREAT),
212             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_THREE, ComparationResult::GREAT) },
213         RefereeState::SUCCEED), // case 43
214     PanTestCase(2, 10.0f, { PanDirection::RIGHT },
215         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT),
216             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
217         RefereeState::DETECTING), // case 44
218     PanTestCase(2, 10.0f, { PanDirection::RIGHT },
219         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT),
220             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_SEVEN, ComparationResult::GREAT) },
221         RefereeState::SUCCEED), // case 45
222     PanTestCase(2, 10.0f, { PanDirection::UP },
223         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT),
224             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT) },
225         RefereeState::SUCCEED), // case 46
226     PanTestCase(2, 10.0f, { PanDirection::UP },
227         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_SIX, ComparationResult::GREAT),
228             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_SIX, ComparationResult::GREAT) },
229         RefereeState::FAIL), // case 47
230     PanTestCase(2, 10.0f, { PanDirection::UP },
231         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_THREE, ComparationResult::GREAT),
232             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_THREE, ComparationResult::GREAT) },
233         RefereeState::SUCCEED), // case 48
234     PanTestCase(2, 10.0f, { PanDirection::DOWN },
235         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT),
236             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_TWO, ComparationResult::GREAT) },
237         RefereeState::FAIL), // case 49
238     PanTestCase(2, 10.0f, { PanDirection::DOWN },
239         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::GREAT),
240             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_FIVE, ComparationResult::GREAT) },
241         RefereeState::SUCCEED), // case 50
242     PanTestCase(2, 10.0f, { PanDirection::DOWN },
243         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::LINE_FIVE, ComparationResult::GREAT),
244             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::LINE_FIVE, ComparationResult::GREAT) },
245         RefereeState::SUCCEED), // case 51
246     PanTestCase(2, 10.0f, { PanDirection::NONE },
247         { InputInfos(PointF { 100.0f, 100.0f }, 0, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT),
248             InputInfos(PointF { 100.0f, 100.0f }, 1, PanQuadrantDirection::QUADRANT_ONE, ComparationResult::GREAT) },
249         RefereeState::FAIL), // case 52
250 };
251 
252 namespace {
DegreesToRadians(float degrees)253 float DegreesToRadians(float degrees)
254 {
255     return static_cast<float>(degrees * ACE_PI / HALF_CIRCLE);
256 }
257 
CalculateEndPoint(const PointF & startPoint,float distance,float angle,PointF & endPoint)258 void CalculateEndPoint(const PointF& startPoint, float distance, float angle, PointF& endPoint)
259 {
260     double radians = DegreesToRadians(angle);
261     endPoint.SetX(static_cast<float>(startPoint.GetX() + distance * cos(radians)));
262     endPoint.SetY(static_cast<float>(startPoint.GetY() - distance * sin(radians)));
263 }
264 
GetAngel(PanQuadrantDirection direction)265 float GetAngel(PanQuadrantDirection direction)
266 {
267     switch (direction) {
268         case PanQuadrantDirection::QUADRANT_ZERO:
269         case PanQuadrantDirection::QUADRANT_ONE:
270         case PanQuadrantDirection::QUADRANT_TWO:
271         case PanQuadrantDirection::QUADRANT_THREE:
272         case PanQuadrantDirection::QUADRANT_FOUR:
273         case PanQuadrantDirection::QUADRANT_FIVE:
274         case PanQuadrantDirection::QUADRANT_SIX:
275         case PanQuadrantDirection::QUADRANT_SEVEN:
276             return static_cast<float>(static_cast<int32_t>(direction) * FORTY_FIVE_DEGREES + TWENTY_DEGREES);
277         case PanQuadrantDirection::LINE_ZERO:
278         case PanQuadrantDirection::LINE_ONE:
279         case PanQuadrantDirection::LINE_TWO:
280         case PanQuadrantDirection::LINE_THREE:
281         case PanQuadrantDirection::LINE_FOUR:
282         case PanQuadrantDirection::LINE_FIVE:
283         case PanQuadrantDirection::LINE_SIX:
284         case PanQuadrantDirection::LINE_SEVEN:
285             return static_cast<float>((static_cast<int32_t>(direction) - QUADRANT_COUNT) * FORTY_FIVE_DEGREES);
286         default:
287             return 0.0f;
288     }
289 }
290 
CreateTouchEvents(const std::vector<InputInfos> & infos,float distance,std::vector<TouchEvent> & downEvents,std::unordered_map<int32_t,std::vector<TouchEvent>> & moveEvents)291 void CreateTouchEvents(const std::vector<InputInfos>& infos, float distance, std::vector<TouchEvent>& downEvents,
292     std::unordered_map<int32_t, std::vector<TouchEvent>>& moveEvents)
293 {
294     for (const auto& info : infos) {
295         PointF endPoint;
296         switch (info.compare) {
297             case ComparationResult::LESS:
298                 distance /= 2;
299                 break;
300             case ComparationResult::EQUAL:
301                 break;
302             case ComparationResult::GREAT:
303                 distance *= 2;
304                 break;
305             default:
306                 break;
307         }
308         CalculateEndPoint(info.startPoint, distance, GetAngel(info.direction), endPoint);
309         TouchEvent downEvent;
310         downEvent.SetId(info.fingerId)
311             .SetType(TouchType::DOWN)
312             .SetX(info.startPoint.GetX())
313             .SetY(info.startPoint.GetY());
314         downEvents.emplace_back(downEvent);
315         auto stepX = (endPoint.GetX() - info.startPoint.GetX()) / STEP_COUNT;
316         auto stepY = (endPoint.GetY() - info.startPoint.GetY()) / STEP_COUNT;
317         for (int32_t num = 1; num <= STEP_COUNT; num++) {
318             TouchEvent moveEvent;
319             moveEvent.SetId(info.fingerId)
320                 .SetType(TouchType::MOVE)
321                 .SetX(info.startPoint.GetX() + static_cast<float>(num) * stepX)
322                 .SetY(info.startPoint.GetY() + static_cast<float>(num) * stepY);
323             moveEvents[info.fingerId].emplace_back(moveEvent);
324         }
325     }
326 }
327 
CreateTouchMoveEvents(const PointF & startPoint,float inputDistance,std::vector<TouchEvent> & moveEvents)328 void CreateTouchMoveEvents(const PointF& startPoint, float inputDistance, std::vector<TouchEvent>& moveEvents)
329 {
330     PointF endPoint;
331     CalculateEndPoint(startPoint, inputDistance, GetAngel(PanQuadrantDirection::LINE_ZERO), endPoint);
332     auto stepX = (endPoint.GetX() - startPoint.GetX()) / STEP_COUNT;
333     auto stepY = (endPoint.GetY() - startPoint.GetY()) / STEP_COUNT;
334     for (int32_t num = 1; num <= STEP_COUNT; num++) {
335         TouchEvent moveEvent;
336         moveEvent.SetType(TouchType::MOVE)
337             .SetX(startPoint.GetX() + static_cast<float>(num) * stepX)
338             .SetY(startPoint.GetY() + static_cast<float>(num) * stepY);
339         moveEvents.emplace_back(moveEvent);
340     }
341 }
342 
343 } // namespace
344 
345 class PanRecognizerBaseTestNg : public GesturesCommonTestNg {
346 public:
347     static void SetUpTestSuite();
348     static void TearDownTestSuite();
349 };
350 
SetUpTestSuite()351 void PanRecognizerBaseTestNg::SetUpTestSuite()
352 {
353     MockPipelineContext::SetUp();
354 }
355 
TearDownTestSuite()356 void PanRecognizerBaseTestNg::TearDownTestSuite()
357 {
358     MockPipelineContext::TearDown();
359 }
360 
361 /**
362  * @tc.name: PanRecognizerBaseTest001
363  * @tc.desc: Test PanRecognizer: APITest
364  * @tc.type: FUNC
365  */
366 HWTEST_F(PanRecognizerBaseTestNg, PanRecognizerBaseTest001, TestSize.Level1)
367 {
368     /**
369      * @tc.steps: step1. create PanRecognizer with illegal fingers.
370      * @tc.expected: step1. fingers_ equals.
371      */
372     RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
373     panGestureOption->SetFingers(0);
374     RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
375     EXPECT_EQ(panRecognizer->fingers_, 1);
376     panGestureOption->SetFingers(10);
377     panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
378     EXPECT_EQ(panRecognizer->fingers_, 10);
379     panGestureOption->SetFingers(100);
380     panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
381     EXPECT_EQ(panRecognizer->fingers_, 1);
382     /**
383      * @tc.steps: step2. create PanRecognizer with illegal distance.
384      * @tc.expected: step2. distance_ equals.
385      */
386     panGestureOption->SetDistance(-1);
387     panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
388     EXPECT_EQ(panRecognizer->distanceMap_[SourceTool::UNKNOWN].ConvertToPx(), 5);
389     /**
390      * @tc.steps: step3. create PanRecognizer with illegal direction.
391      * @tc.expected: step3. direction_ equals.
392      */
393     panGestureOption->SetDirection({ 16 });
394     panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
395     EXPECT_EQ(panRecognizer->direction_.type, PanDirection::ALL);
396 }
397 
398 /**
399  * @tc.name: PanRecognizerBaseTest002
400  * @tc.desc: Test PanRecognizer: Basic function test
401  * @tc.type: FUNC
402  */
403 HWTEST_F(PanRecognizerBaseTestNg, PanRecognizerBaseTest002, TestSize.Level1)
404 {
405     int32_t caseNum = 0;
406     for (const auto& testCase : TEST_CASES) {
407         /**
408          * @tc.steps: step1. create PanRecognizer.
409          */
410         RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
411         panGestureOption->SetFingers(testCase.fingers);
412         panGestureOption->SetDirection(testCase.direction);
413         panGestureOption->SetDistance(testCase.distance);
414         RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
415         /**
416          * @tc.steps: step2. DispatchTouchEvent.
417          * @tc.expected: step2. refereeState_ equals.
418          */
419         std::vector<TouchEvent> downEvents;
420         std::unordered_map<int32_t, std::vector<TouchEvent>> moveEvents;
421         CreateTouchEvents(testCase.infos, testCase.distance, downEvents, moveEvents);
422         for (const auto& item : downEvents) {
423             panRecognizer->HandleEvent(item);
424         }
425         for (int32_t index = 0; index < STEP_COUNT; index++) {
426             for (const auto& item : moveEvents) {
427                 panRecognizer->HandleEvent((item.second)[index]);
428             }
429         }
430         EXPECT_TRUE(IsRecognizerStateEqual(caseNum, panRecognizer->refereeState_, testCase.expectResult));
431         caseNum++;
432     }
433 }
434 
435 /**
436  * @tc.name: PanRecognizerBaseTest003
437  * @tc.desc: Test PanRecognizer: Test for distance 0.
438  * @tc.type: FUNC
439  */
440 HWTEST_F(PanRecognizerBaseTestNg, PanRecognizerBaseTest003, TestSize.Level1)
441 {
442     /**
443      * @tc.steps: step1. create PanRecognizer with distance 0.
444      */
445     RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
446     panGestureOption->SetFingers(1);
447     PanDirection panDirection;
448     panDirection.type = PanDirection::ALL;
449     panGestureOption->SetDirection(panDirection);
450     panGestureOption->SetDistance(0.0f);
451     RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
452     /**
453      * @tc.steps: step2. DispatchTouchEvent.
454      * @tc.expected: step2. refereeState_ equals.
455      */
456     TouchEvent downEvent;
457     downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f);
458     TouchEvent moveEvent;
459     moveEvent.SetId(0).SetType(TouchType::MOVE).SetX(100.0f).SetY(100.0f);
460     panRecognizer->HandleEvent(downEvent);
461     panRecognizer->HandleEvent(moveEvent);
462     EXPECT_EQ(panRecognizer->refereeState_, RefereeState::SUCCEED);
463 }
464 
465 /**
466  * @tc.name: PanRecognizerBaseTest004
467  * @tc.desc: Test PanRecognizer: Test for mouseDistance.
468  * @tc.type: FUNC
469  */
470 HWTEST_F(PanRecognizerBaseTestNg, PanRecognizerBaseTest004, TestSize.Level1)
471 {
472     /**
473      * @tc.steps: step1. create PanRecognizer.
474      */
475     RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
476     panGestureOption->SetFingers(1);
477     PanDirection panDirection;
478     panDirection.type = PanDirection::ALL;
479     panGestureOption->SetDirection(panDirection);
480     panGestureOption->SetDistance(10.0f);
481     RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
482     panRecognizer->SetMouseDistance(1.0f);
483     /**
484      * @tc.steps: step2. DispatchTouchEvent with touch source type.
485      * @tc.expected: step2. refereeState_ equals.
486      */
487     TouchEvent downEvent;
488     downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::TOUCH);
489     std::vector<TouchEvent> moveEvents;
490     CreateTouchMoveEvents(PointF { 100.0f, 100.0f }, 5.0f, moveEvents);
491     panRecognizer->HandleEvent(downEvent);
492     for (auto& item : moveEvents) {
493         item.sourceType = SourceType::TOUCH;
494         panRecognizer->HandleEvent(item);
495     }
496     EXPECT_EQ(panRecognizer->refereeState_, RefereeState::DETECTING);
497     /**
498      * @tc.steps: step3. Reset and dispatchTouchEvent with touch-pad source type.
499      * @tc.expected: step3. refereeState_ equals.
500      */
501     panRecognizer->OnResetStatus();
502     downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::TOUCH_PAD);
503     CreateTouchMoveEvents(PointF { 100.0f, 100.0f }, 5.0f, moveEvents);
504     panRecognizer->HandleEvent(downEvent);
505     for (auto& item : moveEvents) {
506         item.sourceType = SourceType::TOUCH_PAD;
507         panRecognizer->HandleEvent(item);
508     }
509     EXPECT_EQ(panRecognizer->refereeState_, RefereeState::DETECTING);
510     /**
511      * @tc.steps: step4. Reset and dispatchTouchEvent with touch-pad source type.
512      * @tc.expected: step4. refereeState_ equals.
513      */
514     panRecognizer->OnResetStatus();
515     downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::KEYBOARD);
516     CreateTouchMoveEvents(PointF { 100.0f, 100.0f }, 5.0f, moveEvents);
517     panRecognizer->HandleEvent(downEvent);
518     for (auto& item : moveEvents) {
519         item.sourceType = SourceType::KEYBOARD;
520         panRecognizer->HandleEvent(item);
521     }
522     EXPECT_EQ(panRecognizer->refereeState_, RefereeState::DETECTING);
523     /**
524      * @tc.steps: step5. Reset and dispatchTouchEvent with none source type.
525      * @tc.expected: step5. refereeState_ equals.
526      */
527     panRecognizer->OnResetStatus();
528     downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f).SetSourceType(SourceType::NONE);
529     CreateTouchMoveEvents(PointF { 100.0f, 100.0f }, 5.0f, moveEvents);
530     panRecognizer->HandleEvent(downEvent);
531     for (auto& item : moveEvents) {
532         item.sourceType = SourceType::NONE;
533         panRecognizer->HandleEvent(item);
534     }
535     EXPECT_EQ(panRecognizer->refereeState_, RefereeState::DETECTING);
536     /**
537      * @tc.steps: step5. Reset and dispatchTouchEvent with mouse source type.
538      * @tc.expected: step5. refereeState_ equals.
539      */
540     panRecognizer->OnResetStatus();
541     downEvent.SetId(0).SetType(TouchType::DOWN).SetX(100.0f).SetY(100.0f)
542         .SetSourceType(SourceType::MOUSE).SetSourceTool(SourceTool::MOUSE);
543     CreateTouchMoveEvents(PointF { 100.0f, 100.0f }, 5.0f, moveEvents);
544     panRecognizer->HandleEvent(downEvent);
545     for (auto& item : moveEvents) {
546         item.sourceType = SourceType::MOUSE;
547         panRecognizer->HandleEvent(item);
548     }
549     EXPECT_EQ(panRecognizer->refereeState_, RefereeState::SUCCEED);
550 }
551 
552 /**
553  * @tc.name: PanRecognizerBaseTest005
554  * @tc.desc: Test PanRecognizer: Test for TriggerGestureJudgeCallback.
555  * @tc.type: FUNC
556  */
557 HWTEST_F(PanRecognizerBaseTestNg, PanRecognizerBaseTest005, TestSize.Level1)
558 {
559     /**
560      * @tc.steps: step1. create PanRecognizer.
561      */
562     RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
563     panGestureOption->SetFingers(1);
564     PanDirection panDirection;
565     panDirection.type = PanDirection::ALL;
566     panGestureOption->SetDirection(panDirection);
567     panGestureOption->SetDistance(10.0f);
568     RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
569     panRecognizer->SetMouseDistance(1.0f);
570     RefPtr<NG::TargetComponent> targetComponent = AceType::MakeRefPtr<NG::TargetComponent>();
571     auto judgeFunc1 = [](const std::shared_ptr<BaseGestureEvent>& info, const RefPtr<NGGestureRecognizer>& current,
__anon25225cf40202(const std::shared_ptr<BaseGestureEvent>& info, const RefPtr<NGGestureRecognizer>& current, const std::list<RefPtr<NGGestureRecognizer>>& others) 572                      const std::list<RefPtr<NGGestureRecognizer>>& others) -> GestureJudgeResult {
573         return GestureJudgeResult::REJECT;
574     };
575     auto judgeFunc2 = [](const RefPtr<GestureInfo>& gestureInfo,
__anon25225cf40302(const RefPtr<GestureInfo>& gestureInfo, const std::shared_ptr<BaseGestureEvent>& info) 576                      const std::shared_ptr<BaseGestureEvent>& info) -> GestureJudgeResult {
577         return GestureJudgeResult::REJECT;
578     };
579     targetComponent->SetOnGestureRecognizerJudgeBegin(std::move(judgeFunc1));
580     targetComponent->onGestureJudgeBegin_ = judgeFunc2;
581     panRecognizer->SetTargetComponent(targetComponent);
582     /**
583      * @tc.steps: step2. TriggerGestureJudgeCallback with inputEventType::AXIS.
584      * @tc.expected: step2. result equals.
585      */
586     AxisEvent axisEvent;
587     panRecognizer->inputEventType_ = InputEventType::AXIS;
588     panRecognizer->lastAxisEvent_ = axisEvent;
589     EXPECT_EQ(panRecognizer->TriggerGestureJudgeCallback(), GestureJudgeResult::REJECT);
590 
591     /**
592      * @tc.steps: step3. TriggerGestureJudgeCallback with inputEventType::TOUCH_SCREEN.
593      * @tc.expected: step3. result equals.
594      */
595     TouchEvent touchEvent;
596     panRecognizer->inputEventType_ = InputEventType::TOUCH_SCREEN;
597     panRecognizer->lastTouchEvent_ = touchEvent;
598     EXPECT_EQ(panRecognizer->TriggerGestureJudgeCallback(), GestureJudgeResult::REJECT);
599 }
600 } // namespace OHOS::Ace::NG