1 /*
2 * Copyright (c) 2022 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 #include "display_cutout_controller.h"
18 #include "display_manager_service_inner.h"
19 #include "display_manager_service.h"
20 #include "dm_common.h"
21
22 using namespace testing;
23 using namespace testing::ext;
24
25 namespace OHOS {
26 namespace Rosen {
27 class DisplayCutoutControllerTest : public testing::Test {
28 public:
29 static void SetUpTestCase();
30 static void TearDownTestCase();
31 void SetUp() override;
32 void TearDown() override;
33 };
34
SetUpTestCase()35 void DisplayCutoutControllerTest::SetUpTestCase()
36 {
37 }
38
TearDownTestCase()39 void DisplayCutoutControllerTest::TearDownTestCase()
40 {
41 }
42
SetUp()43 void DisplayCutoutControllerTest::SetUp()
44 {
45 }
46
TearDown()47 void DisplayCutoutControllerTest::TearDown()
48 {
49 }
50
51 namespace {
52 /**
53 * @tc.name: SetCurvedScreenBoundary
54 * @tc.desc: SetCurvedScreenBoundary size < 4
55 * @tc.type: FUNC
56 */
57 HWTEST_F(DisplayCutoutControllerTest, SetCurvedScreenBoundary, Function | SmallTest | Level1)
58 {
59 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
60 std::vector<int> curvedScreenBoundary;
61 curvedScreenBoundary.emplace_back(2);
62 controller->SetCurvedScreenBoundary(curvedScreenBoundary);
63 ASSERT_EQ(controller->curvedScreenBoundary_.size(), 4);
64 }
65
66 /**
67 * @tc.name: SetCutoutSvgPath
68 * @tc.desc: SetCutoutSvgPath
69 * @tc.type: FUNC
70 */
71 HWTEST_F(DisplayCutoutControllerTest, SetCutoutSvgPath, Function | SmallTest | Level1)
72 {
73 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
74 DisplayId displayId = 1;
75 std::string svgPath = "m10";
76 controller->SetCutoutSvgPath(displayId, svgPath);
77 controller->SetCutoutSvgPath(displayId, svgPath);
78 ASSERT_EQ(controller->svgPaths_.size(), 1);
79 ASSERT_EQ(controller->svgPaths_[displayId].size(), 2);
80 }
81
82 /**
83 * @tc.name: GetCutoutInfo
84 * @tc.desc: GetCutoutInfo
85 * @tc.type: FUNC
86 */
87 HWTEST_F(DisplayCutoutControllerTest, GetCutoutInfo, Function | SmallTest | Level1)
88 {
89 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
90 DisplayId displayId = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId();
91 std::string svgPath = "m10";
92 controller->SetCutoutSvgPath(displayId, svgPath);
93 controller->SetIsWaterfallDisplay(true);
94 sptr<CutoutInfo> cutoutInfo = controller->GetCutoutInfo(displayId);
95 ASSERT_NE(cutoutInfo, nullptr);
96 }
97
98 /**
99 * @tc.name: CalcBuiltInDisplayWaterfallRects
100 * @tc.desc: CalcBuiltInDisplayWaterfallRects
101 * @tc.type: FUNC
102 */
103 HWTEST_F(DisplayCutoutControllerTest, CalcBuiltInDisplayWaterfallRects, Function | SmallTest | Level1)
104 {
105 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
106 controller->SetIsWaterfallDisplay(true);
107 std::vector<int> curvedScreenBoundary;
108 controller->SetCurvedScreenBoundary(curvedScreenBoundary);
109 controller->CalcBuiltInDisplayWaterfallRects();
110 ASSERT_TRUE(controller->waterfallDisplayAreaRects_.isUninitialized());
111 curvedScreenBoundary.emplace_back(1);
112 curvedScreenBoundary.emplace_back(2);
113 curvedScreenBoundary.emplace_back(3);
114 curvedScreenBoundary.emplace_back(4);
115 controller->SetCurvedScreenBoundary(curvedScreenBoundary);
116 controller->CalcBuiltInDisplayWaterfallRects();
117 ASSERT_TRUE(controller->waterfallDisplayAreaRects_.isUninitialized());
118 }
119
120 /**
121 * @tc.name: CalcBuiltInDisplayWaterfallRectsByRotation
122 * @tc.desc: CalcBuiltInDisplayWaterfallRectsByRotation
123 * @tc.type: FUNC
124 */
125 HWTEST_F(DisplayCutoutControllerTest, CalcBuiltInDisplayWaterfallRectsByRotation, Function | SmallTest | Level1)
126 {
127 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
128 uint32_t displayHeight = 300;
129 uint32_t displayWidth = 300;
130 std::vector<int> curvedScreenBoundary;
131 curvedScreenBoundary.emplace_back(0);
132 curvedScreenBoundary.emplace_back(0);
133 curvedScreenBoundary.emplace_back(500);
134 curvedScreenBoundary.emplace_back(500);
135 controller->SetCurvedScreenBoundary(curvedScreenBoundary);
136 controller->CalcBuiltInDisplayWaterfallRectsByRotation(Rotation::ROTATION_270, displayHeight, displayWidth);
137 controller->CalcBuiltInDisplayWaterfallRectsByRotation(Rotation::ROTATION_180, displayHeight, displayWidth);
138 controller->CalcBuiltInDisplayWaterfallRectsByRotation(Rotation::ROTATION_90, displayHeight, displayWidth);
139 controller->CalcBuiltInDisplayWaterfallRectsByRotation(Rotation::ROTATION_0, displayHeight, displayWidth);
140 controller->CalcBuiltInDisplayWaterfallRectsByRotation(static_cast<Rotation>(10), displayHeight, displayWidth);
141 ASSERT_FALSE(controller->waterfallDisplayAreaRects_.isUninitialized());
142 }
143
144 /**
145 * @tc.name: CheckBoundingRectsBoundary01
146 * @tc.desc: CheckBoundingRectsBoundary
147 * @tc.type: FUNC
148 */
149 HWTEST_F(DisplayCutoutControllerTest, CheckBoundingRectsBoundary01, Function | SmallTest | Level1)
150 {
151 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
152 DisplayId displayId = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId();
153 std::vector<DMRect> boundingRects;
154 controller->CheckBoundingRectsBoundary(displayId, boundingRects);
155 ASSERT_TRUE(boundingRects.empty());
156 }
157
158 /**
159 * @tc.name: CheckBoundingRectsBoundary02
160 * @tc.desc: CheckBoundingRectsBoundary
161 * @tc.type: FUNC
162 */
163 HWTEST_F(DisplayCutoutControllerTest, CheckBoundingRectsBoundary02, Function | SmallTest | Level1)
164 {
165 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
166 DisplayId displayId = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId();
167 std::vector<DMRect> boundingRects;
168 DMRect rect1 = {0, 0, 100, 100};
169 DMRect rect2 = {50, 50, 50, 50};
170 boundingRects.push_back(rect1);
171 boundingRects.push_back(rect2);
172 controller->CheckBoundingRectsBoundary(displayId, boundingRects);
173 ASSERT_FALSE(boundingRects.empty());
174 }
175
176 /**
177 * @tc.name: CheckBoundingRectsBoundary03
178 * @tc.desc: CheckBoundingRectsBoundary
179 * @tc.type: FUNC
180 */
181 HWTEST_F(DisplayCutoutControllerTest, CheckBoundingRectsBoundary03, Function | SmallTest | Level1)
182 {
183 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
184 DisplayId displayId = 0;
185 std::vector<DMRect> boundingRects;
186 DMRect rect = {-1, -1, 100, 100};
187 boundingRects.push_back(rect);
188 controller->CheckBoundingRectsBoundary(displayId, boundingRects);
189 ASSERT_FALSE(boundingRects.empty());
190 }
191
192 /**
193 * @tc.name: CheckBoundingRectsBoundary04
194 * @tc.desc: CheckBoundingRectsBoundary
195 * @tc.type: FUNC
196 */
197 HWTEST_F(DisplayCutoutControllerTest, CheckBoundingRectsBoundary04, Function | SmallTest | Level1)
198 {
199 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
200 DisplayId displayId = DisplayManagerServiceInner::GetInstance().GetDefaultDisplayId();
201 std::vector<DMRect> boundingRects;
202 DMRect rect1 = {-1, -1, 100, 100};
203 DMRect rect2 = {50, 50, 50, 50};
204 boundingRects.push_back(rect1);
205 boundingRects.push_back(rect2);
206 controller->CheckBoundingRectsBoundary(displayId, boundingRects);
207 ASSERT_FALSE(boundingRects.empty());
208 }
209
210 /**
211 * @tc.name: CalcCutoutBoundingRect
212 * @tc.desc: CalcCutoutBoundingRect success
213 * @tc.type: FUNC
214 */
215 HWTEST_F(DisplayCutoutControllerTest, CalcCutoutBoundingRect, Function | SmallTest | Level1)
216 {
217 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
218 std::string svgPath = "M 100,100 m -75,0 a 75,75 0 1,0 150,0 a 75,75 0 1,0 -150,0 z";
219 DMRect rect = controller->CalcCutoutBoundingRect(svgPath);
220 DMRect emptyRect = {0, 0, 0, 0};
221 ASSERT_NE(rect, emptyRect);
222 }
223
224 /**
225 * @tc.name: TransferBoundingRectsByRotation01
226 * @tc.desc: TransferBoundingRectsByRotation empty
227 * @tc.type: FUNC
228 */
229 HWTEST_F(DisplayCutoutControllerTest, TransferBoundingRectsByRotation01, Function | SmallTest | Level1)
230 {
231 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
232 DisplayId id = 10;
233 std::vector<DMRect> boundingRects;
234 controller->TransferBoundingRectsByRotation(id, boundingRects);
235 ASSERT_TRUE(boundingRects.empty());
236 }
237
238 /**
239 * @tc.name: TransferBoundingRectsByRotation02
240 * @tc.desc: TransferBoundingRectsByRotation empty
241 * @tc.type: FUNC
242 */
243 HWTEST_F(DisplayCutoutControllerTest, TransferBoundingRectsByRotation02, Function | SmallTest | Level1)
244 {
245 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
246 DisplayId id = 10;
247 std::vector<DMRect> emptyRects;
248 controller->boundingRects_[id] = emptyRects;
249 std::vector<DMRect> boundingRects;
250 controller->TransferBoundingRectsByRotation(id, boundingRects);
251 ASSERT_TRUE(boundingRects.empty());
252 }
253
254 /**
255 * @tc.name: TransferBoundingRectsByRotation03
256 * @tc.desc: TransferBoundingRectsByRotation success
257 * @tc.type: FUNC
258 */
259 HWTEST_F(DisplayCutoutControllerTest, TransferBoundingRectsByRotation03, Function | SmallTest | Level1)
260 {
261 DisplayId id = 11;
262 ScreenId sid = 12;
263 std::string name = "abstract_display_test";
264 SupportedScreenModes modesInfo;
265 modesInfo.width_ = 2160;
266 modesInfo.height_ = 1600;
267 modesInfo.refreshRate_ = 60;
268 sptr<SupportedScreenModes> info = new SupportedScreenModes(modesInfo);
269 sptr<AbstractScreenController> absScreenController;
270 sptr<AbstractScreen> absScreen;
271 absScreenController = nullptr;
272 absScreen = new AbstractScreen(absScreenController, name, sid, 1);
273 auto displayController = DisplayManagerService::GetInstance().abstractDisplayController_;
274 ASSERT_NE(displayController, nullptr);
275
276 sptr<AbstractDisplay> absDisplay = new AbstractDisplay(id, info, absScreen);
277 absDisplay->RequestRotation(Rotation::ROTATION_0);
278 displayController->abstractDisplayMap_.insert((std::make_pair(id, absDisplay)));
279
280 sptr<DisplayCutoutController> controller = new DisplayCutoutController();
281 std::vector<DMRect> dmRects;
282 DMRect rect = {1, 1, 100, 100};
283 dmRects.emplace_back(rect);
284 controller->boundingRects_[id] = dmRects;
285 ASSERT_FALSE(controller->boundingRects_.count(id) == 0);
286 ASSERT_FALSE(controller->boundingRects_[id].empty());
287 ASSERT_NE(DisplayManagerServiceInner::GetInstance().GetDisplayById(id), nullptr);
288 std::vector<DMRect> boundingRects;
289 controller->TransferBoundingRectsByRotation(id, boundingRects);
290
291 absScreenController = DisplayManagerService::GetInstance().abstractScreenController_;
292 ASSERT_NE(absScreenController, nullptr);
293 absScreenController->dmsScreenMap_.insert(std::make_pair(sid, absScreen));
294 absScreen->modes_.emplace_back(info);
295 absDisplay->RequestRotation(Rotation::ROTATION_180);
296 controller->TransferBoundingRectsByRotation(id, boundingRects);
297
298 absDisplay->RequestRotation(Rotation::ROTATION_90);
299 controller->TransferBoundingRectsByRotation(id, boundingRects);
300
301 absDisplay->RequestRotation(Rotation::ROTATION_270);
302 controller->TransferBoundingRectsByRotation(id, boundingRects);
303 ASSERT_FALSE(boundingRects.empty());
304 displayController->abstractDisplayMap_.clear();
305 absScreenController->dmsScreenMap_.clear();
306 }
307 }
308 } // Rosen
309 } // OHOS
310