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 <map>
18 #include "display_manager.h"
19 #include "iremote_object_mocker.h"
20 #include "mock_rs_iwindow_animation_controller.h"
21 #include "remote_animation.h"
22 #include "starting_window.h"
23 #include "window_controller.h"
24
25 using namespace testing;
26 using namespace testing::ext;
27
28 namespace OHOS {
29 namespace Rosen {
30 class WindowControllerTest : public testing::Test {
31 public:
32 static void SetUpTestCase();
33 static void TearDownTestCase();
34 void SetUp() override;
35 void TearDown() override;
36
37 static sptr<WindowController> windowController_;
38 static sptr<WindowRoot> windowRoot_;
39 static sptr<InputWindowMonitor> inputWindowMonitor_;
40 static sptr<WindowNode> node_;
41 static sptr<WindowTransitionInfo> transitionInfo_;
42 };
43
44 sptr<WindowController> WindowControllerTest::windowController_ = nullptr;
45 sptr<WindowRoot> WindowControllerTest::windowRoot_ = nullptr;
46 sptr<InputWindowMonitor> WindowControllerTest::inputWindowMonitor_ = nullptr;
47 sptr<WindowNode> WindowControllerTest::node_ = nullptr;
48 sptr<WindowTransitionInfo> WindowControllerTest::transitionInfo_ = nullptr;
49
RootCallback(Event event,const sptr<IRemoteObject> & remoteObject)50 void RootCallback(Event event, const sptr<IRemoteObject>& remoteObject)
51 {
52 return;
53 }
54
SetUpTestCase()55 void WindowControllerTest::SetUpTestCase()
56 {
57 windowRoot_ = new WindowRoot(RootCallback);
58 windowRoot_->displayIdMap_[0].push_back(0);
59 inputWindowMonitor_ = new InputWindowMonitor(windowRoot_);
60 windowController_ = new WindowController(windowRoot_, inputWindowMonitor_);
61 transitionInfo_ = new WindowTransitionInfo();
62 transitionInfo_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
63 node_ = StartingWindow::CreateWindowNode(transitionInfo_, 101); // 101 is windowId
64 node_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
65 }
66
TearDownTestCase()67 void WindowControllerTest::TearDownTestCase()
68 {
69 }
70
SetUp()71 void WindowControllerTest::SetUp()
72 {
73 }
74
TearDown()75 void WindowControllerTest::TearDown()
76 {
77 }
78
79 namespace {
80 /**
81 * @tc.name: StartingWindow
82 * @tc.desc: Window controller starting window
83 * @tc.type: FUNC
84 */
85 HWTEST_F(WindowControllerTest, StartingWindow, Function | SmallTest | Level3)
86 {
87 windowRoot_->windowNodeMap_.clear();
88 windowController_->StartingWindow(nullptr, nullptr, 0, false);
89 ASSERT_EQ(0, windowRoot_->windowNodeMap_.size());
90
91 transitionInfo_->SetWindowMode(WindowMode::WINDOW_MODE_UNDEFINED);
92 windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
93 ASSERT_EQ(0, windowRoot_->windowNodeMap_.size());
94
95 sptr<IRemoteObject> abilityTokenMocker = new IRemoteObjectMocker();
96 transitionInfo_->SetAbilityToken(abilityTokenMocker);
97 windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
98 windowController_->StartingWindow(transitionInfo_, nullptr, 0, true);
99 ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
100
101 windowRoot_->windowNodeMap_.clear();
102 sptr<IRemoteObject> iRemoteObjectMocker = new IRemoteObjectMocker();
103 RemoteAnimation::windowAnimationController_ = iface_cast<RSIWindowAnimationController>(iRemoteObjectMocker);
104 windowController_->StartingWindow(transitionInfo_, nullptr, 0, true);
105 ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
106
107 windowRoot_->windowNodeMap_.clear();
108 windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
109 node_->abilityToken_ = abilityTokenMocker;
110 node_->stateMachine_.currState_ = WindowNodeState::SHOW_ANIMATION_PLAYING;
111 windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
112 ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
113
114 node_->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
115 windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
116 transitionInfo_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
117 windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
118 transitionInfo_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
119 node_->property_->modeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
120 windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
121 ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
122
123 // Cancel starting window
124 windowController_->CancelStartingWindow(nullptr);
125 windowController_->CancelStartingWindow(abilityTokenMocker);
126
127 node_->startingWindowShown_ = true;
128 windowController_->CancelStartingWindow(abilityTokenMocker);
129 ASSERT_EQ(0, windowRoot_->windowNodeMap_.size());
130
131 windowRoot_->windowNodeMap_.clear();
132 RemoteAnimation::windowAnimationController_ = nullptr;
133 }
134 /**
135 * @tc.name: NotifyWindowTransition
136 * @tc.desc: Window controller notify window transtition
137 * @tc.type: FUNC
138 */
139 HWTEST_F(WindowControllerTest, NotifyWindowTransition, Function | SmallTest | Level3)
140 {
141 sptr<WindowTransitionInfo> srcInfo = nullptr;
142 sptr<WindowTransitionInfo> dstInfo = nullptr;
143 ASSERT_EQ(WMError::WM_ERROR_NO_REMOTE_ANIMATION, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
144
145 srcInfo = new WindowTransitionInfo();
146 sptr<IRemoteObject> srcAbilityTokenMocker = new IRemoteObjectMocker();
147 srcInfo->SetAbilityToken(srcAbilityTokenMocker);
148 sptr<WindowNode> srcNode = StartingWindow::CreateWindowNode(srcInfo, 102); // 102 is windowId
149 srcNode->property_->modeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
150
151 dstInfo = new WindowTransitionInfo();
152 sptr<IRemoteObject> dstAbilityTokenMocker = new IRemoteObjectMocker();
153 dstInfo->SetAbilityToken(dstAbilityTokenMocker);
154 sptr<WindowNode> dstNode = StartingWindow::CreateWindowNode(dstInfo, 103); // 103 is windowId
155 dstNode->property_->modeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
156
157 windowRoot_->windowNodeMap_.clear();
158 windowRoot_->windowNodeMap_.insert(std::make_pair(srcNode->GetWindowId(), srcNode));
159 windowRoot_->windowNodeMap_.insert(std::make_pair(dstNode->GetWindowId(), dstNode));
160
161 sptr<DisplayInfo> displayInfo = new DisplayInfo();
162 sptr<WindowNodeContainer> container = new WindowNodeContainer(displayInfo, 0);
163 windowRoot_->windowNodeContainerMap_.insert(std::make_pair(0, container));
164
165 sptr<MockRSIWindowAnimationController> mock = new MockRSIWindowAnimationController();
166 RemoteAnimation::windowAnimationController_ = mock;
167 RemoteAnimation::windowRoot_ = windowRoot_;
168 RemoteAnimation::animationFirst_ = true;
169
170 srcInfo->SetTransitionReason(TransitionReason::MINIMIZE);
171 srcNode->stateMachine_.currState_ = WindowNodeState::HIDDEN;
172 ASSERT_EQ(WMError::WM_ERROR_NO_REMOTE_ANIMATION, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
173
174 srcInfo->SetTransitionReason(TransitionReason::MINIMIZE);
175 srcNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
176 EXPECT_CALL(*mock, OnMinimizeWindow(_, _)).Times(1);
177 ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
178
179 srcInfo->SetTransitionReason(TransitionReason::CLOSE);
180 srcNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
181 EXPECT_CALL(*mock, OnCloseWindow(_, _)).Times(1);
182 ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
183
184 srcInfo->SetTransitionReason(TransitionReason::BACK_TRANSITION);
185 srcNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
186 EXPECT_CALL(*mock, OnAppBackTransition(_, _, _)).Times(1);
187 ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
188
189 srcInfo->SetTransitionReason(TransitionReason::ABILITY_TRANSITION);
190 dstNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
191 dstNode->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
192 dstNode->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
193 EXPECT_CALL(*mock, OnStartApp(_, _, _)).Times(1);
194 ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
195
196 dstNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
197 dstNode->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
198 EXPECT_CALL(*mock, OnStartApp(_, _, _)).Times(1);
199 ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
200
201 windowRoot_->windowNodeContainerMap_.clear();
202 RemoteAnimation::windowAnimationController_ = nullptr;
203 }
204 /**
205 * @tc.name: FocusWindow
206 * @tc.desc: Window controller focus window
207 * @tc.type: FUNC
208 */
209 HWTEST_F(WindowControllerTest, FocusWindow, Function | SmallTest | Level3)
210 {
211 sptr<IRemoteObject> abilityToken = nullptr;
212 windowController_->GetFocusWindowInfo(abilityToken);
213
214 sptr<DisplayInfo> displayInfo = new DisplayInfo();
215 sptr<WindowNodeContainer> container = new WindowNodeContainer(displayInfo, 0);
216 windowRoot_->windowNodeContainerMap_.insert(std::make_pair(0, container));
217
218 sptr<WindowNode> windowNode;
219 ASSERT_EQ(WMError::WM_ERROR_INVALID_WINDOW, windowController_->GetFocusWindowNode(0, windowNode));
220
221 windowRoot_->windowNodeMap_.clear();
222 windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
223 container->focusedWindow_ = node_->GetWindowId();
224 node_->currentVisibility_ = false;
225 ASSERT_EQ(WMError::WM_ERROR_INVALID_WINDOW, windowController_->GetFocusWindowNode(0, windowNode));
226
227 node_->currentVisibility_ = true;
228 ASSERT_EQ(WMError::WM_OK, windowController_->GetFocusWindowNode(0, windowNode));
229 windowRoot_->windowNodeContainerMap_.clear();
230 }
231 /**
232 * @tc.name: CreateWindow
233 * @tc.desc: Window controller create window
234 * @tc.type: FUNC
235 */
236 HWTEST_F(WindowControllerTest, CreateWindow, Function | SmallTest | Level3)
237 {
238 windowRoot_->windowNodeMap_.clear();
239 sptr<IWindow> window;
240 sptr<WindowProperty> property = new WindowProperty();
241 std::shared_ptr<RSSurfaceNode> surfaceNode = nullptr;
242
243 sptr<WindowProperty> property2 = new WindowProperty();
244 property2->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
245 sptr<WindowNode> windowNode = new WindowNode(property2);
246 windowRoot_->windowNodeMap_.insert(std::make_pair(1,windowNode));
247 sptr<WindowProperty> property3 = new WindowProperty();
248 property3->SetWindowType(WindowType::BELOW_APP_SYSTEM_WINDOW_BASE);
249 sptr<WindowNode> windowNode2 = new WindowNode(property3);
250 windowRoot_->windowNodeMap_.insert(std::make_pair(2,windowNode2));
251
252 uint32_t windowId;
253 property->SetParentId(INVALID_WINDOW_ID);
254 ASSERT_EQ(WMError::WM_ERROR_NULLPTR,
255 windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
256 struct RSSurfaceNodeConfig surfaceNodeConfig;
257 surfaceNodeConfig.SurfaceNodeName = "SurfaceNode";
258 surfaceNode = RSSurfaceNode::Create(surfaceNodeConfig, RSSurfaceNodeType::DEFAULT);
259 ASSERT_EQ(WMError::WM_OK, windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
260
261 property->SetParentId(1);
262 property->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
263 ASSERT_EQ(WMError::WM_ERROR_INVALID_PARENT,
264 windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
265
266 property->SetWindowType(WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
267 ASSERT_EQ(WMError::WM_OK, windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
268
269 property->SetParentId(2);
270 property->SetWindowType(WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW);
271 ASSERT_EQ(WMError::WM_OK, windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
272 windowRoot_->windowNodeMap_.clear();
273
274 sptr<IRemoteObject> abilityTokenMocker = new IRemoteObjectMocker();
275 node_->abilityToken_ = abilityTokenMocker;
276
277 property->SetParentId(INVALID_WINDOW_ID);
278 property->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
279 ASSERT_EQ(WMError::WM_OK,
280 windowController_->CreateWindow(window, property, surfaceNode, windowId, abilityTokenMocker, 0, 0));
281
282 property->SetWindowType(WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
283 ASSERT_EQ(WMError::WM_ERROR_INVALID_PARENT,
284 windowController_->CreateWindow(window, property, surfaceNode, windowId, abilityTokenMocker, 0, 0));
285
286 property->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
287 node_->startingWindowShown_ = false;
288 ASSERT_EQ(WMError::WM_OK,
289 windowController_->CreateWindow(window, property, surfaceNode, windowId, abilityTokenMocker, 0, 0));
290 windowRoot_->windowNodeMap_.clear();
291 }
292 /**
293 * @tc.name: NotifyAfterAddWindow
294 * @tc.desc: Window controller notify after add window
295 * @tc.type: FUNC
296 */
297 HWTEST_F(WindowControllerTest, NotifyAfterAddWindow, Function | SmallTest | Level3)
298 {
299 ASSERT_NE(nullptr, windowController_);
300 sptr<WindowNode> node0 = new WindowNode();
301 windowController_->NotifyAfterAddWindow(node0);
302 ASSERT_EQ(0, node0->children_.size());
303
304 sptr<WindowNode> node1 = new WindowNode();
305 node1->currentVisibility_ = false;
306 sptr<WindowNode> node2= new WindowNode();
307 node2->currentVisibility_ = true;
308
309 node0->children_.push_back(node1);
310 node0->children_.push_back(node2);
311 windowController_->NotifyAfterAddWindow(node0);
312 ASSERT_EQ(2, node0->children_.size());
313 ASSERT_EQ(nullptr, node0->children_[0]->abilityToken_);
314 }
315 /**
316 * @tc.name: AddWindowNode
317 * @tc.desc: Window controller add window node
318 * @tc.type: FUNC
319 */
320 HWTEST_F(WindowControllerTest, AddWindowNode, Function | SmallTest | Level3)
321 {
322 sptr<WindowProperty> property = new WindowProperty();
323 property->SetWindowId(0);
324 ASSERT_EQ(WMError::WM_ERROR_NULLPTR, windowController_->AddWindowNode(property));
325
326 windowRoot_->windowNodeMap_.clear();
327 windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
328 property->SetWindowId(node_->GetWindowId());
329 node_->currentVisibility_ = true;
330 node_->startingWindowShown_ = false;
331 ASSERT_EQ(WMError::WM_ERROR_INVALID_OPERATION, windowController_->AddWindowNode(property));
332 windowRoot_->windowNodeMap_.clear();
333 }
334 /**
335 * @tc.name: InputCallingWindow
336 * @tc.desc: Window controller input calling window
337 * @tc.type: FUNC
338 */
339 HWTEST_F(WindowControllerTest, InputCallingWindow, Function | SmallTest | Level3)
340 {
341 windowController_->callingWindowId_ = 0;
342 windowRoot_->windowNodeMap_.clear();
343 sptr<WindowNode> node = new WindowNode();
344 node->property_->callingWindow_ = 0;
345 node->property_->displayId_ = DISPLAY_ID_INVALID;
346 windowController_->ResizeSoftInputCallingWindowIfNeed(node);
347 ASSERT_EQ(0, windowController_->callingWindowId_);
348
349 sptr<DisplayInfo> displayInfo = new DisplayInfo();
350 sptr<WindowNodeContainer> container = new WindowNodeContainer(displayInfo, 0);
351 windowRoot_->windowNodeContainerMap_.insert(std::make_pair(0, container));
352 node->property_->displayId_ = 0;
353 windowController_->ResizeSoftInputCallingWindowIfNeed(node);
354 ASSERT_EQ(0, windowController_->callingWindowId_);
355
356 windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
357 container->focusedWindow_ = node_->GetWindowId();
358 node_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
359 node_->currentVisibility_ = false;
360 windowController_->ResizeSoftInputCallingWindowIfNeed(node);
361 ASSERT_EQ(0, windowController_->callingWindowId_);
362
363 node_->currentVisibility_ = true;
364 node_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
365 windowController_->ResizeSoftInputCallingWindowIfNeed(node);
366
367 node_->currentVisibility_ = true;
368 node_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
369 windowController_->ResizeSoftInputCallingWindowIfNeed(node);
370 ASSERT_EQ(0, windowController_->callingWindowId_);
371
372 windowController_->callingWindowId_ = node_->GetWindowId();
373 windowController_->callingWindowRestoringRect_ = {0, 0, 0, 0};
374 windowController_->RestoreCallingWindowSizeIfNeed();
375 ASSERT_EQ(0, windowController_->callingWindowId_);
376
377 windowController_->callingWindowRestoringRect_ = {0, 0, 1, 1};
378 windowController_->callingWindowId_ = 0;
379 windowController_->RestoreCallingWindowSizeIfNeed();
380
381 windowController_->callingWindowId_ = node_->GetWindowId();
382 windowController_->RestoreCallingWindowSizeIfNeed();
383 ASSERT_EQ(0, windowController_->callingWindowId_);
384
385 windowController_->callingWindowId_ = node_->GetWindowId();
386 node_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
387 windowController_->RestoreCallingWindowSizeIfNeed();
388 ASSERT_EQ(0, windowController_->callingWindowId_);
389
390 windowRoot_->windowNodeMap_.clear();
391 windowRoot_->windowNodeContainerMap_.clear();
392 }
393 /**
394 * @tc.name: SetDefaultDisplayInfo
395 * @tc.desc: Window controller set default display info
396 * @tc.type: FUNC
397 */
398 HWTEST_F(WindowControllerTest, SetDefaultDisplayInfo, Function | SmallTest | Level3)
399 {
400 const int32_t displayWidth = 100;
401 const int32_t displayHeight = 200;
402 windowController_->defaultDisplayRect_ = { 0, 0, 0, 0 };
403
404 sptr<DisplayInfo> displayInfo = nullptr;
405 windowController_->SetDefaultDisplayInfo(0, displayInfo);
406 ASSERT_EQ(0, windowController_->defaultDisplayRect_.width_);
407 ASSERT_EQ(0, windowController_->defaultDisplayRect_.height_);
408
409 displayInfo = new DisplayInfo();
410 displayInfo->id_ = 1;
411 displayInfo->width_ = displayWidth;
412 displayInfo->height_ = displayHeight;
413
414 windowController_->SetDefaultDisplayInfo(0, displayInfo);
415 ASSERT_EQ(0, windowController_->defaultDisplayRect_.width_);
416 ASSERT_EQ(0, windowController_->defaultDisplayRect_.height_);
417
418 displayInfo->id_ = 0;
419 windowController_->SetDefaultDisplayInfo(0, displayInfo);
420 ASSERT_EQ(displayWidth, windowController_->defaultDisplayRect_.width_);
421 ASSERT_EQ(displayHeight, windowController_->defaultDisplayRect_.height_);
422 }
423 /**
424 * @tc.name: ProcessDisplayCompression
425 * @tc.desc: Window controller process display compression
426 * @tc.type: FUNC
427 */
428 HWTEST_F(WindowControllerTest, ProcessDisplayCompression, Function | SmallTest | Level3)
429 {
430 ASSERT_NE(nullptr, windowController_);
431 DisplayId defaultDisplayId = 0;
432 sptr<DisplayInfo> displayInfo = new DisplayInfo();
433 displayInfo->id_ = 1;
434 windowController_->ProcessDisplayCompression(defaultDisplayId, displayInfo);
435 ASSERT_EQ(nullptr, windowController_->maskingSurfaceNode_);
436
437 displayInfo->id_ = defaultDisplayId;
438 displayInfo->waterfallDisplayCompressionStatus_ = false;
439 windowController_->ProcessDisplayCompression(defaultDisplayId, displayInfo);
440 ASSERT_EQ(nullptr, windowController_->maskingSurfaceNode_);
441
442 displayInfo->waterfallDisplayCompressionStatus_ = true;
443 windowController_->ProcessDisplayCompression(defaultDisplayId, displayInfo);
444 ASSERT_NE(nullptr, windowController_->maskingSurfaceNode_);
445 }
446 /**
447 * @tc.name: StopBootAnimationIfNeed
448 * @tc.desc: Window controller stop boot animation if need
449 * @tc.type: FUNC
450 */
451 HWTEST_F(WindowControllerTest, StopBootAnimationIfNeed, Function | SmallTest | Level3)
452 {
453 ASSERT_NE(nullptr, windowController_);
454
455 sptr<WindowNode> node = nullptr;
456 windowController_->isBootAnimationStopped_ = true;
457 windowController_->StopBootAnimationIfNeed(node);
458 ASSERT_EQ(true, windowController_->isBootAnimationStopped_);
459
460 windowController_->isBootAnimationStopped_ = false;
461 windowController_->StopBootAnimationIfNeed(node);
462 ASSERT_EQ(false, windowController_->isBootAnimationStopped_);
463
464 node = new WindowNode();
465 node->SetDisplayId(DISPLAY_ID_INVALID + 1);
466 windowController_->StopBootAnimationIfNeed(node);
467 ASSERT_EQ(false, windowController_->isBootAnimationStopped_);
468
469 node->SetDisplayId(DISPLAY_ID_INVALID);
470 windowController_->StopBootAnimationIfNeed(node);
471 ASSERT_EQ(false, windowController_->isBootAnimationStopped_);
472 }
473 /**
474 * @tc.name: GetEmbedNodeId
475 * @tc.desc: Window controller get embed node id
476 * @tc.type: FUNC
477 */
478 HWTEST_F(WindowControllerTest, GetEmbedNodeId, Function | SmallTest | Level3)
479 {
480 std::vector<sptr<WindowNode>> windowNodes;
481 sptr<WindowNode> node0 = nullptr;
482 sptr<WindowNode> node1 = new WindowNode();
483 node1->property_->windowId_ = 1;
484 sptr<WindowNode> node2 = new WindowNode();
485 node2->property_->windowId_ = 2;
486 sptr<WindowNode> node3 = new WindowNode();
487 node3->property_->windowId_ = 3;
488
489 node1->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
490 ASSERT_EQ(0, windowController_->GetEmbedNodeId(windowNodes, node1));
491
492 node1->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_COMPONENT);
493 ASSERT_EQ(0, windowController_->GetEmbedNodeId(windowNodes, node1));
494
495 windowNodes.push_back(node0);
496 windowNodes.push_back(node2);
497 windowNodes.push_back(node1);
498 windowNodes.push_back(node2);
499 windowNodes.push_back(node3);
500
501 node1->SetWindowRect({50, 50, 50, 50});
502 node3->SetWindowRect({0, 0, 200, 200});
503 ASSERT_EQ(node3->GetWindowId(), windowController_->GetEmbedNodeId(windowNodes, node1));
504 }
505 /**
506 * @tc.name: BindDialogTarget
507 * @tc.desc: Window controller bind dialog target
508 * @tc.type: FUNC
509 */
510 HWTEST_F(WindowControllerTest, BindDialogTarget, Function | SmallTest | Level3)
511 {
512 windowRoot_->windowNodeMap_.clear();
513
514 uint32_t id = 0;
515 sptr<IRemoteObject> abilityTokenMocker = new IRemoteObjectMocker();
516 ASSERT_EQ(WMError::WM_ERROR_NULLPTR, windowController_->BindDialogTarget(id, abilityTokenMocker));
517
518 windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
519 id = node_->GetWindowId();
520 ASSERT_EQ(WMError::WM_OK, windowController_->BindDialogTarget(id, abilityTokenMocker));
521 windowRoot_->windowNodeMap_.clear();
522 }
523
524 /**
525 * @tc.name: RaiseToAppTop
526 * @tc.desc: check app subwindow raise to top
527 * @tc.type: FUNC
528 */
529 HWTEST_F(WindowControllerTest, RaiseToAppTop, Function | SmallTest | Level3)
530 {
531 windowRoot_->windowNodeMap_.clear();
532
533 sptr<WindowNode> windowNode = new (std::nothrow)WindowNode();
534 windowNode->property_->windowId_ = 100;
535 windowNode->SetDisplayId(DISPLAY_ID_INVALID);
536
537 uint32_t windowId = windowNode->GetWindowId();
538 ASSERT_EQ(WmErrorCode::WM_ERROR_STATE_ABNORMALLY, windowController_->RaiseToAppTop(windowId));
539
540 windowRoot_->windowNodeMap_.insert(std::make_pair(windowNode->GetWindowId(), windowNode));
541 ASSERT_EQ(WmErrorCode::WM_ERROR_INVALID_PARENT, windowController_->RaiseToAppTop(windowId));
542
543 sptr<WindowNode> parentWindow = new (std::nothrow)WindowNode();
544 parentWindow->property_->windowId_ = 90;
545 parentWindow->SetDisplayId(DISPLAY_ID_INVALID);
546 windowRoot_->windowNodeMap_.insert(std::make_pair(parentWindow->GetWindowId(), parentWindow));
547
548 windowNode->parent_ = parentWindow;
549 ASSERT_EQ(WmErrorCode::WM_ERROR_STAGE_ABNORMALLY, windowController_->RaiseToAppTop(windowId));
550
551 windowRoot_->windowNodeMap_.clear();
552 }
553 }
554 }
555 }
556