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