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 <gtest/gtest.h>
17
18 #include <parameter.h>
19 #include <parameters.h>
20 #include "screen_session_manager/include/fold_screen_controller/sensor_fold_state_manager/single_display_sensor_pocket_fold_state_manager.h"
21 #include "screen_session_manager/include/fold_screen_controller/single_display_pocket_fold_policy.h"
22 #include "fold_screen_state_internel.h"
23
24 using namespace testing;
25 using namespace testing::ext;
26
27 namespace OHOS {
28 namespace Rosen {
29 namespace {
30 constexpr uint32_t SLEEP_TIME_IN_US = 100000; // 100ms
31 std::recursive_mutex g_displayInfoMutex;
32 std::shared_ptr<TaskScheduler> screenPowerTaskScheduler_ = std::make_shared<TaskScheduler>("test");
33 sptr<SingleDisplayPocketFoldPolicy> g_policy;
34 }
35
36 class SingleDisplaySensorPocketFoldStateManagerTest : public testing::Test {
37 public:
38 static void SetUpTestCase();
39 static void TearDownTestCase();
40 void SetUp() override;
41 void TearDown() override;
42 };
43
SetUpTestCase()44 void SingleDisplaySensorPocketFoldStateManagerTest::SetUpTestCase()
45 {
46 g_policy = new SingleDisplayPocketFoldPolicy(g_displayInfoMutex, screenPowerTaskScheduler_);
47 }
48
TearDownTestCase()49 void SingleDisplaySensorPocketFoldStateManagerTest::TearDownTestCase()
50 {
51 usleep(SLEEP_TIME_IN_US);
52 }
53
SetUp()54 void SingleDisplaySensorPocketFoldStateManagerTest::SetUp()
55 {
56 }
57
TearDown()58 void SingleDisplaySensorPocketFoldStateManagerTest::TearDown()
59 {
60 }
61
62 namespace {
63 /**
64 * @tc.name: HandleAngleChange
65 * @tc.desc: test function : HandleAngleChange
66 * @tc.type: FUNC
67 */
68 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, HandleAngleChange, TestSize.Level1)
69 {
70 float angel = 0;
71 int hall = 0;
72 sptr<FoldScreenPolicy> foldScreenPolicy = nullptr;
73 SingleDisplaySensorPocketFoldStateManager manager;
74 manager.HandleAngleChange(angel, hall, foldScreenPolicy);
75 EXPECT_TRUE(true);
76 }
77
78 /**
79 * @tc.name: HandleHallChange
80 * @tc.desc: test function : HandleHallChange
81 * @tc.type: FUNC
82 */
83 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, HandleHallChange, TestSize.Level1)
84 {
85 float angel = 0;
86 int hall = 0;
87 sptr<FoldScreenPolicy> foldScreenPolicy = nullptr;
88 SingleDisplaySensorPocketFoldStateManager manager;
89 manager.HandleHallChange(angel, hall, foldScreenPolicy);
90 EXPECT_TRUE(true);
91 }
92
93 /**
94 * @tc.name: UpdateSwitchScreenBoundaryForLargeFoldDevice
95 * @tc.desc: test function : UpdateSwitchScreenBoundaryForLargeFoldDevice
96 * @tc.type: FUNC
97 */
98 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, UpdateSwitchScreenBoundaryForLargeFoldDevice,
99 TestSize.Level1)
100 {
101 float angel = 0;
102 int hall = 0;
103 SingleDisplaySensorPocketFoldStateManager manager;
104 manager.UpdateSwitchScreenBoundaryForLargeFoldDevice(angel, hall);
105 EXPECT_TRUE(true);
106
107 angel = 91.0F;
108 hall = 1;
109 manager.UpdateSwitchScreenBoundaryForLargeFoldDevice(angel, hall);
110 EXPECT_TRUE(true);
111 }
112
113 /**
114 * @tc.name: GetNextFoldState01
115 * @tc.desc: test function : GetNextFoldState
116 * @tc.type: FUNC
117 */
118 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, GetNextFoldState01, TestSize.Level1)
119 {
120 float angel = -0.1;
121 int hall = 0;
122 SingleDisplaySensorPocketFoldStateManager manager;
123 auto result1 = manager.GetNextFoldState(angel, hall);
124 EXPECT_EQ(static_cast<int>(result1), 0);
125
126 manager.allowUserSensorForLargeFoldDevice = 0;
127 angel = 90.0F;
128 hall = 1;
129 auto result2 = manager.GetNextFoldState(angel, hall);
130 EXPECT_EQ(static_cast<int>(result2), 3);
131
132 angel = 130.0F - 0.1;
133 hall = 1;
134 auto result3 = manager.GetNextFoldState(angel, hall);
135 EXPECT_EQ(static_cast<int>(result3), 3);
136
137 angel = 130.0F - 0.1;
138 hall = 0;
139 auto result4 = manager.GetNextFoldState(angel, hall);
140 EXPECT_EQ(static_cast<int>(result4), 3);
141
142 angel = 130.0F + 0.1;
143 hall = 0;
144 auto result5 = manager.GetNextFoldState(angel, hall);
145 EXPECT_EQ(static_cast<int>(result5), 3);
146
147 angel = 140.0F + 0.1;
148 hall = 0;
149 auto result6 = manager.GetNextFoldState(angel, hall);
150 EXPECT_EQ(static_cast<int>(result6), 3);
151
152 angel = 140.0F + 0.1;
153 hall = 1;
154 auto result7 = manager.GetNextFoldState(angel, hall);
155 EXPECT_EQ(static_cast<int>(result7), 1);
156 }
157
158 /**
159 * @tc.name: GetNextFoldState02
160 * @tc.desc: test function : GetNextFoldState
161 * @tc.type: FUNC
162 */
163 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, GetNextFoldState02, TestSize.Level1)
164 {
165 SingleDisplaySensorPocketFoldStateManager manager;
166 manager.allowUserSensorForLargeFoldDevice = 1;
167 float angel = 25.0F;
168 int hall = 1;
169 auto result1 = manager.GetNextFoldState(angel, hall);
170 EXPECT_EQ(static_cast<int>(result1), 0);
171
172 angel = 70.0F - 0.1;
173 auto result2 = manager.GetNextFoldState(angel, hall);
174 EXPECT_EQ(static_cast<int>(result2), 2);
175
176 angel = 70.0F + 0.1;
177 auto result3 = manager.GetNextFoldState(angel, hall);
178 EXPECT_EQ(static_cast<int>(result3), 3);
179
180 angel = 130.0F - 0.1;
181 auto result4 = manager.GetNextFoldState(angel, hall);
182 EXPECT_EQ(static_cast<int>(result4), 3);
183
184 angel = 130.0F + 0.1;
185 auto result5 = manager.GetNextFoldState(angel, hall);
186 EXPECT_EQ(static_cast<int>(result5), 3);
187
188 angel = 80.0F - 0.1;
189 auto result6 = manager.GetNextFoldState(angel, hall);
190 EXPECT_EQ(static_cast<int>(result6), 3);
191
192 angel = 70.0F + 0.1;
193 hall = 0;
194 auto result7 = manager.GetNextFoldState(angel, hall);
195 EXPECT_EQ(static_cast<int>(result7), 3);
196
197 angel = 130.0F + 0.1;
198 auto result8 = manager.GetNextFoldState(angel, hall);
199 EXPECT_EQ(static_cast<int>(result8), 3);
200 }
201
202 /**
203 * @tc.name: TriggerTentExit
204 * @tc.desc: test function : TriggerTentExit
205 * @tc.type: FUNC
206 */
207 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, TriggerTentExit, TestSize.Level1)
208 {
209 float angle = 0.0F;
210 int hall;
211 bool result;
212 SingleDisplaySensorPocketFoldStateManager mgr;
213
214 hall = 0;
215 result = mgr.TriggerTentExit(angle, hall);
216 EXPECT_EQ(result, true);
217
218 hall = 1;
219 angle = 176.0F;
220 result = mgr.TriggerTentExit(angle, hall);
221 EXPECT_EQ(result, true);
222
223 hall = 1;
224 angle = 4.0F;
225 result = mgr.TriggerTentExit(angle, hall);
226 EXPECT_EQ(result, true);
227
228 hall = 1;
229 angle = 90.0F;
230 result = mgr.TriggerTentExit(angle, hall);
231 EXPECT_EQ(result, false);
232 }
233
234 /**
235 * @tc.name: HandleTentChange
236 * @tc.desc: test function : HandleTentChange
237 * @tc.type: FUNC
238 */
239 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, HandleTentChange, TestSize.Level1)
240 {
241 if (!FoldScreenStateInternel::IsSuperFoldDisplayDevice()) {
242 GTEST_SKIP();
243 }
244 SingleDisplaySensorPocketFoldStateManager mgr;
245
246 ASSERT_EQ(mgr.IsTentMode(), false);
247
248 mgr.HandleTentChange(true, nullptr);
249 ASSERT_EQ(mgr.IsTentMode(), true);
250
251 mgr.HandleTentChange(true, nullptr);
252 ASSERT_EQ(mgr.IsTentMode(), true);
253
254 mgr.HandleTentChange(false, nullptr);
255 ASSERT_EQ(mgr.IsTentMode(), false);
256
257 mgr.HandleTentChange(false, nullptr);
258 ASSERT_EQ(mgr.IsTentMode(), false);
259
260 mgr.HandleTentChange(1, g_policy);
261 EXPECT_EQ(OHOS::system::GetParameter("persist.dms.device.status", "0"), "3");
262
263 mgr.HandleTentChange(0, g_policy);
264 EXPECT_EQ(OHOS::system::GetParameter("persist.dms.device.status", "0"), "1");
265
266 mgr.HandleTentChange(2, g_policy);
267 EXPECT_EQ(OHOS::system::GetParameter("persist.dms.device.status", "0"), "2");
268
269 mgr.allowUserSensorForLargeFoldDevice = 0;
270 mgr.currentAngle = 140.0F + 0.1;
271 mgr.HandleTentChange(0, g_policy, 1);
272 EXPECT_EQ(OHOS::system::GetParameter("persist.dms.device.status", "0"), "0");
273 }
274
275 /**
276 * @tc.name: TentModeHandleSensorChange
277 * @tc.desc: test function : TentModeHandleSensorChange
278 * @tc.type: FUNC
279 */
280 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, TentModeHandleSensorChange, TestSize.Level1)
281 {
282 SingleDisplaySensorPocketFoldStateManager stateManager;
283
284 stateManager.SetTentMode(true);
285 stateManager.TentModeHandleSensorChange(4.0F, 0, nullptr);
286 ASSERT_EQ(stateManager.IsTentMode(), false);
287 }
288
289 /**
290 * @tc.name: ReportTentStatusChange
291 * @tc.desc: test function : ReportTentStatusChange
292 * @tc.type: FUNC
293 */
294 HWTEST_F(SingleDisplaySensorPocketFoldStateManagerTest, ReportTentStatusChange, TestSize.Level1)
295 {
296 SingleDisplaySensorPocketFoldStateManager stateManager;
297 ReportTentModeStatus tentStatus = ReportTentModeStatus::NORMAL_ENTER_TENT_MODE;
298 stateManager.ReportTentStatusChange(tentStatus);
299 ASSERT_EQ(tentStatus, ReportTentModeStatus::NORMAL_ENTER_TENT_MODE);
300 }
301 }
302 } // namespace Rosen
303 } // namespace OHOS