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/event/ace_events.h"
21
22 using namespace testing;
23 using namespace testing::ext;
24
25 namespace OHOS::Ace::NG {
26
27 struct AxisInputInfo {
28 PointF startPoint;
29 SourceTool sourceTool;
30 PanQuadrantDirection direction;
31 ComparationResult compare;
AxisInputInfoOHOS::Ace::NG::AxisInputInfo32 AxisInputInfo(
33 PointF startPoint, SourceTool sourceTool, PanQuadrantDirection direction, ComparationResult compare)
34 : startPoint(startPoint), sourceTool(sourceTool), direction(direction), compare(compare)
35 {}
36 };
37
38 struct PanAxisTestCase {
39 int32_t fingers = 0;
40 float distance = 0.0f;
41 PanDirection direction;
42 AxisInputInfo info;
43 RefereeState expectResult;
PanAxisTestCaseOHOS::Ace::NG::PanAxisTestCase44 PanAxisTestCase(
45 int32_t fingers, float distance, PanDirection direction, AxisInputInfo info, RefereeState expectResult)
46 : fingers(fingers), distance(distance), direction(direction), info(info), expectResult(expectResult)
47 {}
48 };
49
50 const std::vector<PanAxisTestCase> AXIS_TEST_CASES = {
51 PanAxisTestCase(2, 10.0f, { PanDirection::ALL },
52 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
53 ComparationResult::GREAT),
54 RefereeState::FAIL), // case 0
55 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
56 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
57 ComparationResult::LESS),
58 RefereeState::DETECTING), // case 1
59 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
60 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_TWO,
61 ComparationResult::LESS),
62 RefereeState::DETECTING), // case 2
63 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
64 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_FOUR,
65 ComparationResult::GREAT),
66 RefereeState::DETECTING), // case 3
67 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
68 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_SIX,
69 ComparationResult::GREAT),
70 RefereeState::SUCCEED), // case 4
71 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
72 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_TWO,
73 ComparationResult::EQUAL),
74 RefereeState::SUCCEED), // case 5
75 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
76 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_FOUR,
77 ComparationResult::EQUAL),
78 RefereeState::DETECTING), // case 6
79 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
80 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
81 ComparationResult::LESS),
82 RefereeState::DETECTING), // case 7
83 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
84 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_SIX,
85 ComparationResult::GREAT),
86 RefereeState::SUCCEED), // case 8
87 PanAxisTestCase(1, 10.0f, { PanDirection::VERTICAL },
88 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
89 ComparationResult::EQUAL),
90 RefereeState::SUCCEED), // case 9
91 PanAxisTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
92 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
93 ComparationResult::GREAT),
94 RefereeState::SUCCEED), // case 10
95 PanAxisTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
96 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_TWO,
97 ComparationResult::GREAT),
98 RefereeState::DETECTING), // case 11
99 PanAxisTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
100 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
101 ComparationResult::GREAT),
102 RefereeState::SUCCEED), // case 12
103 PanAxisTestCase(1, 10.0f, { PanDirection::HORIZONTAL },
104 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_SIX,
105 ComparationResult::GREAT),
106 RefereeState::SUCCEED), // case 13
107 PanAxisTestCase(1, 10.0f, { PanDirection::ALL },
108 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
109 ComparationResult::GREAT),
110 RefereeState::SUCCEED), // case 14
111 PanAxisTestCase(1, 10.0f, { PanDirection::ALL },
112 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_TWO,
113 ComparationResult::GREAT),
114 RefereeState::SUCCEED), // case 15
115 PanAxisTestCase(1, 10.0f, { PanDirection::ALL },
116 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_FOUR,
117 ComparationResult::GREAT),
118 RefereeState::DETECTING), // case 16
119 PanAxisTestCase(1, 10.0f, { PanDirection::ALL },
120 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_SIX,
121 ComparationResult::GREAT),
122 RefereeState::SUCCEED), // case 17
123 PanAxisTestCase(1, 10.0f, { PanDirection::LEFT },
124 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
125 ComparationResult::GREAT),
126 RefereeState::FAIL), // case 18
127 PanAxisTestCase(1, 10.0f, { PanDirection::LEFT },
128 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_FOUR,
129 ComparationResult::GREAT),
130 RefereeState::SUCCEED), // case 19
131 PanAxisTestCase(1, 10.0f, { PanDirection::LEFT },
132 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
133 ComparationResult::GREAT),
134 RefereeState::SUCCEED), // case 20
135 PanAxisTestCase(1, 10.0f, { PanDirection::RIGHT },
136 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
137 ComparationResult::GREAT),
138 RefereeState::SUCCEED), // case 21
139 PanAxisTestCase(1, 10.0f, { PanDirection::RIGHT },
140 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_FOUR,
141 ComparationResult::GREAT),
142 RefereeState::FAIL), // case 22
143 PanAxisTestCase(1, 10.0f, { PanDirection::RIGHT },
144 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
145 ComparationResult::GREAT),
146 RefereeState::FAIL), // case 23
147 PanAxisTestCase(1, 10.0f, { PanDirection::UP },
148 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_TWO,
149 ComparationResult::GREAT),
150 RefereeState::SUCCEED), // case 24
151 PanAxisTestCase(1, 10.0f, { PanDirection::UP },
152 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_SIX,
153 ComparationResult::GREAT),
154 RefereeState::FAIL), // case 25
155 PanAxisTestCase(1, 10.0f, { PanDirection::UP },
156 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
157 ComparationResult::GREAT),
158 RefereeState::SUCCEED), // case 26
159 PanAxisTestCase(1, 10.0f, { PanDirection::UP },
160 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_SIX,
161 ComparationResult::GREAT),
162 RefereeState::FAIL), // case 27
163 PanAxisTestCase(1, 10.0f, { PanDirection::DOWN },
164 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_TWO,
165 ComparationResult::GREAT),
166 RefereeState::FAIL), // case 28
167 PanAxisTestCase(1, 10.0f, { PanDirection::DOWN },
168 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_SIX,
169 ComparationResult::GREAT),
170 RefereeState::SUCCEED), // case 29
171 PanAxisTestCase(1, 10.0f, { PanDirection::DOWN },
172 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
173 ComparationResult::GREAT),
174 RefereeState::FAIL), // case 30
175 PanAxisTestCase(1, 10.0f, { PanDirection::DOWN },
176 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_SIX,
177 ComparationResult::GREAT),
178 RefereeState::SUCCEED), // case 31
179 PanAxisTestCase(1, 10.0f, { PanDirection::NONE },
180 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::TOUCHPAD, PanQuadrantDirection::LINE_ZERO,
181 ComparationResult::GREAT),
182 RefereeState::FAIL), // case 32
183 PanAxisTestCase(1, 10.0f, { PanDirection::NONE },
184 AxisInputInfo(PointF { 100.0f, 100.0f }, SourceTool::MOUSE, PanQuadrantDirection::LINE_TWO,
185 ComparationResult::GREAT),
186 RefereeState::FAIL), // case 33
187 };
188
189 namespace {
CalculateAxisValue(float distance,PanQuadrantDirection direction,SourceTool sourceTool,float & horizontalAxis,float & verticalAxis)190 void CalculateAxisValue(
191 float distance, PanQuadrantDirection direction, SourceTool sourceTool, float& horizontalAxis, float& verticalAxis)
192 {
193 float step = 0.0f;
194 if (sourceTool == SourceTool::TOUCHPAD) {
195 step = distance / STEP_COUNT;
196 } else {
197 step = distance / (MOUSE_RATIO * STEP_COUNT);
198 }
199 switch (direction) {
200 case PanQuadrantDirection::LINE_ZERO:
201 horizontalAxis = -step;
202 break;
203 case PanQuadrantDirection::LINE_TWO:
204 verticalAxis = step;
205 break;
206 case PanQuadrantDirection::LINE_FOUR:
207 horizontalAxis = step;
208 break;
209 case PanQuadrantDirection::LINE_SIX:
210 verticalAxis = -step;
211 break;
212 default:
213 break;
214 }
215 }
216
CreateAxisEvents(const AxisInputInfo & info,float distance,std::vector<AxisEvent> & moveEvents)217 void CreateAxisEvents(const AxisInputInfo& info, float distance, std::vector<AxisEvent>& moveEvents)
218 {
219 switch (info.compare) {
220 case ComparationResult::LESS:
221 distance /= 2;
222 break;
223 case ComparationResult::EQUAL:
224 break;
225 case ComparationResult::GREAT:
226 distance *= 2;
227 break;
228 default:
229 break;
230 }
231 float horizontalAxis = 0.0f;
232 float verticalAxis = 0.0f;
233 CalculateAxisValue(distance, info.direction, info.sourceTool, horizontalAxis, verticalAxis);
234 for (int32_t num = 1; num <= STEP_COUNT; num++) {
235 AxisEvent moveEvent;
236 moveEvent.x = info.startPoint.GetX();
237 moveEvent.y = info.startPoint.GetY();
238 moveEvent.action = AxisAction::UPDATE;
239 moveEvent.horizontalAxis = horizontalAxis;
240 moveEvent.verticalAxis = verticalAxis;
241 moveEvent.sourceTool = info.sourceTool;
242 moveEvents.emplace_back(moveEvent);
243 }
244 }
245
246 } // namespace
247
248 class PanRecognizerAxisBaseTestNg : public GesturesCommonTestNg {
249 public:
250 static void SetUpTestSuite();
251 static void TearDownTestSuite();
252 };
253
SetUpTestSuite()254 void PanRecognizerAxisBaseTestNg::SetUpTestSuite()
255 {
256 MockPipelineContext::SetUp();
257 }
258
TearDownTestSuite()259 void PanRecognizerAxisBaseTestNg::TearDownTestSuite()
260 {
261 MockPipelineContext::TearDown();
262 }
263
264 /**
265 * @tc.name: PanRecognizerAxisBaseTest001
266 * @tc.desc: Test PanRecognizer function: OnAccepted OnRejected
267 * @tc.type: FUNC
268 */
269 HWTEST_F(PanRecognizerAxisBaseTestNg, PanRecognizerAxisBaseTest001, TestSize.Level1)
270 {
271 int32_t caseNum = 0;
272 for (const auto& testCase : AXIS_TEST_CASES) {
273 /**
274 * @tc.steps: step1. create PanRecognizer.
275 */
276 RefPtr<PanGestureOption> panGestureOption = AceType::MakeRefPtr<PanGestureOption>();
277 panGestureOption->SetFingers(testCase.fingers);
278 panGestureOption->SetDirection(testCase.direction);
279 panGestureOption->SetDistance(testCase.distance);
280 RefPtr<PanRecognizer> panRecognizer = AceType::MakeRefPtr<PanRecognizer>(panGestureOption);
281 /**
282 * @tc.steps: step2. DispatchTouchEvent.
283 * @tc.expected: step2. refereeState_ equals.
284 */
285 AxisEvent downEvent;
286 downEvent.action = AxisAction::BEGIN;
287 downEvent.x = testCase.info.startPoint.GetX();
288 downEvent.y = testCase.info.startPoint.GetY();
289 downEvent.sourceTool = testCase.info.sourceTool;
290 std::vector<AxisEvent> moveEvents;
291 CreateAxisEvents(testCase.info, testCase.distance, moveEvents);
292 panRecognizer->HandleEvent(downEvent);
293 for (const auto& item : moveEvents) {
294 panRecognizer->HandleEvent(item);
295 }
296 EXPECT_TRUE(IsRecognizerStateEqual(caseNum, panRecognizer->refereeState_, testCase.expectResult));
297 caseNum++;
298 }
299 }
300
301 } // namespace OHOS::Ace::NG