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