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
16 #include <cstddef>
17 #include <cstdint>
18 #include <map>
19 #include <sstream>
20 #include <unistd.h>
21 #include <vector>
22
23 #include "gtest/gtest.h"
24
25 #define private public
26 #define protected public
27
28 #include "frameworks/core/event/axis_event.h"
29 #include "test/mock/core/pipeline/mock_pipeline_context.h"
30
31 using namespace testing;
32 using namespace testing::ext;
33 namespace OHOS::Ace::NG {
34 namespace {
35 constexpr double DEFAULT_AXIS_ONE = 100.0;
36 constexpr double DEFAULT_AXIS_NEGATIVE_ONE = -100.0;
37 constexpr Dimension DEFAULT_AXIS_MOUSE_SCALE = LINE_HEIGHT_DESKTOP / MOUSE_WHEEL_DEGREES;
38 static std::map<AxisAction, std::string> AxisAction2String = {
39 { AxisAction::NONE, "AxisAction::NONE" },
40 { AxisAction::BEGIN, "AxisAction::BEGIN" },
41 { AxisAction::UPDATE, "AxisAction::UPDATE" },
42 { AxisAction::END, "AxisAction::END" },
43 { AxisAction::CANCEL, "AxisAction::CANCEL" },
44 };
45
46 struct AxisEventCheckerTestCase {
47 AxisAction currentAction { AxisAction::NONE };
48 AxisAction inputAction { AxisAction::NONE };
49 bool expectedResult { false };
50 AxisAction expectedPreActionOld { AxisAction::NONE };
51 AxisAction expectedPreActionNew { AxisAction::NONE };
52
ToStringOHOS::Ace::NG::__anona8fc72080111::AxisEventCheckerTestCase53 std::string ToString() const
54 {
55 std::stringstream out;
56 out << "{ " << AxisAction2String[currentAction] << ", " << AxisAction2String[inputAction] << ", "
57 << expectedResult << ", " << AxisAction2String[expectedPreActionOld] << ", "
58 << AxisAction2String[expectedPreActionNew] << " }";
59 return out.str();
60 }
61 };
62
63 struct AxisEventCalculateOffsetTestCase {
64 double verticalAxis = 0.0;
65 double horizontalAxis = 0.0;
66 bool isShiftKeyPressed = false;
67 bool hasDifferentDirectionGesture = false;
68 SourceTool sourceTool = SourceTool::MOUSE;
69 double exceptOffsetX = 0.0;
70 double exceptOffsetY = 0.0;
71 };
72 } // namespace
73
74 class AxisEventTestNg : public testing::Test {
75 public:
76 static void SetUpTestSuite();
77 static void TearDownTestSuite();
78 void SetUp() override;
79 void TearDown() override;
80 };
81
SetUpTestSuite()82 void AxisEventTestNg::SetUpTestSuite()
83 {
84 // do nothing
85 GTEST_LOG_(INFO) << "AxisEventTestNg SetUpTestSuite";
86 }
87
TearDownTestSuite()88 void AxisEventTestNg::TearDownTestSuite()
89 {
90 // do nothing
91 GTEST_LOG_(INFO) << "AxisEventTestNg TearDownTestSuite";
92 }
93
SetUp()94 void AxisEventTestNg::SetUp()
95 {
96 MockPipelineContext::SetUp();
97 }
98
TearDown()99 void AxisEventTestNg::TearDown()
100 {
101 MockPipelineContext::TearDown();
102 }
103
104 const static std::vector<AxisEventCheckerTestCase> axisEventCheckerTestCases = {
105 { AxisAction::NONE, AxisAction::NONE, false, AxisAction::NONE, AxisAction::NONE },
106 { AxisAction::NONE, AxisAction::BEGIN, true, AxisAction::NONE, AxisAction::BEGIN, },
107 { AxisAction::NONE, AxisAction::UPDATE, false, AxisAction::NONE, AxisAction::UPDATE },
108 { AxisAction::NONE, AxisAction::END, false, AxisAction::NONE, AxisAction::NONE },
109 { AxisAction::NONE, AxisAction::CANCEL, false, AxisAction::NONE, AxisAction::NONE },
110
111 { AxisAction::BEGIN, AxisAction::NONE, false, AxisAction::BEGIN, AxisAction::NONE },
112 { AxisAction::BEGIN, AxisAction::BEGIN, false, AxisAction::BEGIN, AxisAction::BEGIN },
113 { AxisAction::BEGIN, AxisAction::UPDATE, true, AxisAction::BEGIN, AxisAction::UPDATE },
114 { AxisAction::BEGIN, AxisAction::END, true, AxisAction::BEGIN, AxisAction::NONE },
115 { AxisAction::BEGIN, AxisAction::CANCEL, true, AxisAction::BEGIN, AxisAction::NONE },
116
117 { AxisAction::UPDATE, AxisAction::NONE, false, AxisAction::UPDATE, AxisAction::NONE },
118 { AxisAction::UPDATE, AxisAction::BEGIN, false, AxisAction::UPDATE, AxisAction::BEGIN },
119 { AxisAction::UPDATE, AxisAction::UPDATE, true, AxisAction::UPDATE, AxisAction::UPDATE },
120 { AxisAction::UPDATE, AxisAction::END, true, AxisAction::UPDATE, AxisAction::NONE },
121 { AxisAction::UPDATE, AxisAction::CANCEL, true, AxisAction::UPDATE, AxisAction::NONE },
122 };
123
124 const static std::vector<AxisEventCalculateOffsetTestCase> AxisEventCalculateOffsetTestCases = {
125 { DEFAULT_AXIS_ONE, DEFAULT_AXIS_NEGATIVE_ONE, false, false, SourceTool::MOUSE, DEFAULT_AXIS_NEGATIVE_ONE,
126 DEFAULT_AXIS_NEGATIVE_ONE },
127 { DEFAULT_AXIS_ONE, DEFAULT_AXIS_NEGATIVE_ONE, false, true, SourceTool::MOUSE, DEFAULT_AXIS_ONE,
128 DEFAULT_AXIS_NEGATIVE_ONE },
129 { DEFAULT_AXIS_ONE, DEFAULT_AXIS_NEGATIVE_ONE, true, false, SourceTool::MOUSE, DEFAULT_AXIS_NEGATIVE_ONE,
130 DEFAULT_AXIS_ONE },
131 { DEFAULT_AXIS_ONE, DEFAULT_AXIS_NEGATIVE_ONE, true, true, SourceTool::MOUSE, DEFAULT_AXIS_NEGATIVE_ONE,
132 DEFAULT_AXIS_ONE },
133 { DEFAULT_AXIS_ONE, DEFAULT_AXIS_NEGATIVE_ONE, false, false, SourceTool::TOUCHPAD, DEFAULT_AXIS_ONE,
134 DEFAULT_AXIS_NEGATIVE_ONE },
135 };
136
137 /**
138 * @tc.name: AxisEventChecker001
139 * @tc.desc: Create AxisEventChecker and execute its functions.
140 * @tc.type: FUNC
141 */
142 HWTEST_F(AxisEventTestNg, AxisEventChecker001, TestSize.Level1)
143 {
144 const static SourceType sourceTypes[] = { SourceType::MOUSE };
145 for (auto& sourceType : sourceTypes) {
146 for (auto& testCase : axisEventCheckerTestCases) {
147
148 /**
149 * @tc.steps: step1. Create AxisEventChecker and set preActionNew_
150 */
151 AxisEventChecker checker;
152 checker.preActionNew_ = testCase.currentAction;
153
154 /**
155 * @tc.steps: step2. Create AxisEvent and set action and sourceType
156 */
157 AxisEvent axisEvent;
158 axisEvent.action = testCase.inputAction;
159 axisEvent.sourceType = sourceType;
160
161 /**
162 * @tc.steps: step3. Execute IsAxisEventSequenceCorrect
163 * @tc.expected: IsAxisEventSequenceCorrect is equal to expectedResult
164 * @tc.expected: GetPreAction is equal to expectedPreActionOld
165 * @tc.expected: preActionNew_ is equal to expectedPreActionNew
166 */
167 GTEST_LOG_(INFO) << testCase.ToString().c_str() << std::endl;
168 EXPECT_EQ(checker.IsAxisEventSequenceCorrect(axisEvent), testCase.expectedResult);
169 EXPECT_EQ(checker.GetPreAction(), testCase.expectedPreActionOld);
170 EXPECT_EQ(checker.preActionNew_, testCase.expectedPreActionNew);
171 }
172 }
173 }
174
175 /**
176 * @tc.name: AxisEventChecker001
177 * @tc.desc: Create AxisEventChecker and execute its functions not work for other sourceType
178 * @tc.type: FUNC
179 */
180 HWTEST_F(AxisEventTestNg, AxisEventChecker002, TestSize.Level1)
181 {
182 const static SourceType sourceTypes[] = { SourceType::NONE, SourceType::TOUCH, SourceType::KEYBOARD,
183 SourceType::TOUCH_PAD };
184
185 for (auto& sourceType : sourceTypes) {
186 for (auto& testCase : axisEventCheckerTestCases) {
187 /**
188 * @tc.steps: step1. Create AxisEventChecker and set preActionNew_
189 */
190 AxisEventChecker checker;
191 checker.preActionNew_ = testCase.inputAction;
192 checker.preActionOld_ = AxisAction::NONE;
193
194 /**
195 * @tc.steps: step2. Create AxisEvent and set action and sourceType
196 */
197 AxisEvent axisEvent;
198 axisEvent.action = testCase.currentAction;
199 axisEvent.sourceType = sourceType;
200
201 /**
202 * @tc.steps: step3. Execute IsAxisEventSequenceCorrect
203 * @tc.expected: IsAxisEventSequenceCorrect is equal to true
204 * @tc.expected: GetPreAction is equal to AxisAction::NONE
205 */
206 GTEST_LOG_(INFO) << testCase.ToString().c_str() << std::endl;
207 EXPECT_EQ(checker.IsAxisEventSequenceCorrect(axisEvent), true);
208 EXPECT_EQ(checker.GetPreAction(), AxisAction::NONE);
209 }
210 }
211 }
212
213 /**
214 * @tc.name: AxisEventConvertToOffsetTest001
215 * @tc.desc: Create AxisEvent and output current offset
216 * @tc.type: FUNC
217 */
218 HWTEST_F(AxisEventTestNg, AxisEventConvertToOffsetTest001, TestSize.Level1)
219 {
220 auto pipelineContext = PipelineContext::GetCurrentContext();
221 ASSERT_NE(pipelineContext, nullptr);
222 pipelineContext->dipScale_ = 1.0f;
223 for (auto& testCase : AxisEventCalculateOffsetTestCases) {
224 /**
225 * @tc.steps: step1. Create AxisEvent and set info.
226 */
227 AxisEvent axisEvent;
228 axisEvent.verticalAxis = testCase.verticalAxis;
229 axisEvent.horizontalAxis = testCase.horizontalAxis;
230 axisEvent.sourceTool = testCase.sourceTool;
231
232 /**
233 * @tc.steps: step2. Get Offset
234 * @tc.expected: offset is equal to testCase offset.
235 */
236 auto offset = axisEvent.ConvertToOffset(testCase.isShiftKeyPressed, testCase.hasDifferentDirectionGesture);
237 double mouseScale = 1.0f;
238 if (testCase.sourceTool == SourceTool::MOUSE) {
239 mouseScale = DEFAULT_AXIS_MOUSE_SCALE.ConvertToPx();
240 }
241 EXPECT_EQ(offset.GetX(), testCase.exceptOffsetX * mouseScale);
242 EXPECT_EQ(offset.GetY(), testCase.exceptOffsetY * mouseScale);
243 }
244 }
245 } // namespace OHOS::Ace::NG