• 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/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