• 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 
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::__anon15afd1aa0111::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