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