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 <algorithm>
18
19#include "display_manager.h"
20#include "window_pair.h"
21#include "minimize_app.h"
22#include "common_test_utils.h"
23#include "mock_IWindow.h"
24using namespace testing;
25using namespace testing::ext;
26
27namespace OHOS {
28namespace Rosen {
29class WindowPairTest : public testing::Test {
30public:
31    static void SetUpTestCase();
32    static void TearDownTestCase();
33    void SetUp() override;
34    void TearDown() override;
35};
36
37void WindowPairTest::SetUpTestCase()
38{
39    auto display = DisplayManager::GetInstance().GetDefaultDisplay();
40    ASSERT_TRUE((display != nullptr));
41    sptr<DisplayInfo> displayInfo = display->GetDisplayInfo();
42    ASSERT_TRUE((displayInfo != nullptr));
43}
44
45void WindowPairTest::TearDownTestCase()
46{
47}
48
49void WindowPairTest::SetUp()
50{
51}
52
53void WindowPairTest::TearDown()
54{
55}
56
57namespace {
58/**
59 * @tc.name: NotifyShowRecent
60 * @tc.desc: Send split screen event to notify create recent view.
61 * @tc.type: FUNC
62 */
63HWTEST_F(WindowPairTest, NotifyShowRecent01, Function | SmallTest | Level2)
64{
65    sptr<WindowPair> windowPair = new WindowPair(0);
66    windowPair->primary_ = nullptr;
67    windowPair->secondary_ = nullptr;
68    windowPair->NotifyShowRecent(nullptr);
69    ASSERT_EQ(nullptr, windowPair->primary_);
70
71    sptr<WindowProperty> property = new WindowProperty();
72    property->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
73    sptr<WindowNode> node0 = new WindowNode(property);
74    windowPair->primary_ = node0;
75    windowPair->NotifyShowRecent(node0);
76
77    if (windowPair->secondary_ != nullptr) {
78        ASSERT_EQ(WindowType::WINDOW_TYPE_LAUNCHER_RECENT, windowPair->secondary_->GetWindowType());
79    }
80}
81
82/**
83 * @tc.name: NotifyCreateOrDestroyDivider
84 * @tc.desc: Send split screen event to notify create or destroy divider window.
85 * @tc.type: FUNC
86 */
87HWTEST_F(WindowPairTest, NotifyCreateOrDestroyDivider01, Function | SmallTest | Level2)
88{
89    sptr<WindowPair> windowPair = new WindowPair(0);
90    windowPair->primary_ = nullptr;
91    windowPair->NotifyCreateOrDestroyDivider(nullptr, true);
92    ASSERT_EQ(nullptr, windowPair->primary_);
93
94    sptr<WindowProperty> property = new WindowProperty();
95    property->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
96    sptr<WindowNode> node0 = new WindowNode(property);
97    windowPair->primary_ = node0;
98    windowPair->NotifyCreateOrDestroyDivider(node0, true);
99    ASSERT_EQ(nullptr, windowPair->divider_);
100}
101
102/**
103 * @tc.name: IsPaired
104 * @tc.desc: Get whether the window pair is paired
105 * @tc.type: FUNC
106 */
107HWTEST_F(WindowPairTest, IsPaired01, Function | SmallTest | Level2)
108{
109    sptr<WindowPair> windowPair = new WindowPair(0);
110    windowPair->primary_ = nullptr;
111    ASSERT_EQ(false, windowPair->IsPaired());
112    windowPair->primary_ = new WindowNode();
113    windowPair->secondary_ = nullptr;
114    ASSERT_EQ(false, windowPair->IsPaired());
115}
116
117/**
118 * @tc.name: IsPaired
119 * @tc.desc: Get whether the window pair is paired
120 * @tc.type: FUNC
121 */
122HWTEST_F(WindowPairTest, IsPaired02, Function | SmallTest | Level2)
123{
124    sptr<WindowPair> windowPair = new WindowPair(0);
125    sptr<WindowProperty> property1 = new WindowProperty();
126    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
127    sptr<WindowProperty> property2 = new WindowProperty();
128    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
129
130    sptr<WindowNode> node1 = new WindowNode(property1);
131    windowPair->primary_ = node1;
132    sptr<WindowNode> node2 = new WindowNode(property2);
133    windowPair->secondary_ = node2;
134    windowPair->divider_ = node1;
135    ASSERT_EQ(true, windowPair->IsPaired());
136}
137
138/**
139 * @tc.name: IsPaired
140 * @tc.desc: Get whether the window pair is paired
141 * @tc.type: FUNC
142 */
143HWTEST_F(WindowPairTest, IsPaired03, Function | SmallTest | Level2)
144{
145    sptr<WindowPair> windowPair = new WindowPair(0);
146    sptr<WindowProperty> property1 = new WindowProperty();
147    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
148    sptr<WindowProperty> property2 = new WindowProperty();
149    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
150
151    sptr<WindowNode> node1 = new WindowNode(property1);
152    windowPair->primary_ = node1;
153    sptr<WindowNode> node2 = new WindowNode(property2);
154    windowPair->secondary_ = node2;
155    windowPair->divider_ = nullptr;
156    ASSERT_EQ(false, windowPair->IsPaired());
157}
158
159/**
160 * @tc.name: Find
161 * @tc.desc: Find window node from window pair
162 * @tc.type: FUNC
163 */
164HWTEST_F(WindowPairTest, Find01, Function | SmallTest | Level2)
165{
166    sptr<WindowPair> windowPair = new WindowPair(0);
167    sptr<WindowNode> node1 = nullptr;
168    ASSERT_EQ(nullptr, windowPair->Find(node1));
169}
170
171/**
172 * @tc.name: Find
173 * @tc.desc: Find window node from window pair
174 * @tc.type: FUNC
175 */
176HWTEST_F(WindowPairTest, Find02, Function | SmallTest | Level2)
177{
178    sptr<WindowPair> windowPair = new WindowPair(0);
179    sptr<WindowProperty> property1 = new WindowProperty();
180    property1->SetWindowId(1);
181    sptr<WindowNode> node1 = new WindowNode(property1);
182    windowPair->primary_ = node1;
183    ASSERT_EQ(node1, windowPair->Find(node1));
184}
185
186/**
187 * @tc.name: Find
188 * @tc.desc: Find window node from window pair
189 * @tc.type: FUNC
190 */
191HWTEST_F(WindowPairTest, Find03, Function | SmallTest | Level2)
192{
193    sptr<WindowPair> windowPair = new WindowPair(0);
194    sptr<WindowProperty> property1 = new WindowProperty();
195    property1->SetWindowId(1);
196    sptr<WindowNode> node1 = new WindowNode(property1);
197    windowPair->primary_ = nullptr;
198    windowPair->secondary_ = node1;
199    ASSERT_EQ(node1, windowPair->Find(node1));
200}
201
202/**
203 * @tc.name: Find
204 * @tc.desc: Find window node from window pair
205 * @tc.type: FUNC
206 */
207HWTEST_F(WindowPairTest, Find04, Function | SmallTest | Level2)
208{
209    sptr<WindowPair> windowPair = new WindowPair(0);
210    sptr<WindowProperty> property1 = new WindowProperty();
211    property1->SetWindowId(1);
212    sptr<WindowNode> node1 = new WindowNode(property1);
213    windowPair->primary_ = nullptr;
214    windowPair->secondary_ = nullptr;
215    windowPair->divider_ = node1;
216    ASSERT_EQ(node1, windowPair->Find(node1));
217}
218
219/**
220 * @tc.name: GetSplitRatio
221 * @tc.desc: Get split ratio
222 * @tc.type: FUNC
223 */
224HWTEST_F(WindowPairTest, GetSplitRatio01, Function | SmallTest | Level2)
225{
226    sptr<WindowPair> windowPair = new WindowPair(0);
227    windowPair->ratio_ = 0;
228    ASSERT_EQ(0, windowPair->GetSplitRatio());
229    windowPair->ratio_ = 5;
230    ASSERT_EQ(5, windowPair->GetSplitRatio());
231}
232
233/**
234 * @tc.name: IsForbidDockSliceMove
235 * @tc.desc: Get whether dock slice is forbidden to move
236 * @tc.type: FUNC
237 */
238HWTEST_F(WindowPairTest, IsForbidDockSliceMove01, Function | SmallTest | Level2)
239{
240    sptr<WindowPair> windowPair = new WindowPair(0);
241    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
242    ASSERT_EQ(true, windowPair->IsForbidDockSliceMove());
243    windowPair->status_ = WindowPairStatus::EMPTY;
244    ASSERT_EQ(false, windowPair->IsForbidDockSliceMove());
245}
246
247/**
248 * @tc.name: IsForbidDockSliceMove
249 * @tc.desc: Get whether dock slice is forbidden to move
250 * @tc.type: FUNC
251 */
252HWTEST_F(WindowPairTest, IsForbidDockSliceMove02, Function | SmallTest | Level2)
253{
254    sptr<WindowPair> windowPair = new WindowPair(0);
255    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
256    sptr<WindowProperty> property1 = new WindowProperty();
257    property1->SetWindowFlags(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_NEED_AVOID));
258    windowPair->primary_ = new WindowNode(property1);
259    windowPair->secondary_ = new WindowNode(property1);
260    ASSERT_EQ(false, windowPair->IsForbidDockSliceMove());
261}
262
263/**
264 * @tc.name: IsForbidDockSliceMove
265 * @tc.desc: Get whether dock slice is forbidden to move
266 * @tc.type: FUNC
267 */
268HWTEST_F(WindowPairTest, IsForbidDockSliceMove03, Function | SmallTest | Level2)
269{
270    sptr<WindowPair> windowPair = new WindowPair(0);
271    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
272    sptr<WindowProperty> property1 = new WindowProperty();
273    property1->SetWindowFlags(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_NEED_AVOID));
274    windowPair->primary_ = nullptr;
275    windowPair->secondary_ = new WindowNode(property1);
276    ASSERT_EQ(true, windowPair->IsForbidDockSliceMove());
277}
278
279/**
280 * @tc.name: IsForbidDockSliceMove
281 * @tc.desc: Get whether dock slice is forbidden to move
282 * @tc.type: FUNC
283 */
284HWTEST_F(WindowPairTest, IsForbidDockSliceMove04, Function | SmallTest | Level2)
285{
286    sptr<WindowPair> windowPair = new WindowPair(0);
287    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
288    sptr<WindowProperty> property1 = new WindowProperty();
289    property1->SetWindowFlags(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE));
290    windowPair->primary_ = new WindowNode(property1);
291    windowPair->secondary_ = new WindowNode(property1);
292    ASSERT_EQ(true, windowPair->IsForbidDockSliceMove());
293}
294
295/**
296 * @tc.name: IsForbidDockSliceMove
297 * @tc.desc: Get whether dock slice is forbidden to move
298 * @tc.type: FUNC
299 */
300HWTEST_F(WindowPairTest, IsForbidDockSliceMove05, Function | SmallTest | Level2)
301{
302    sptr<WindowPair> windowPair = new WindowPair(0);
303    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
304    sptr<WindowProperty> property1 = new WindowProperty();
305    property1->SetWindowFlags(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_NEED_AVOID));
306    windowPair->primary_ = new WindowNode(property1);
307    windowPair->secondary_ = nullptr;
308    ASSERT_EQ(true, windowPair->IsForbidDockSliceMove());
309}
310
311/**
312 * @tc.name: IsForbidDockSliceMove
313 * @tc.desc: Get whether dock slice is forbidden to move
314 * @tc.type: FUNC
315 */
316HWTEST_F(WindowPairTest, IsForbidDockSliceMove06, Function | SmallTest | Level2)
317{
318    sptr<WindowPair> windowPair = new WindowPair(0);
319    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
320    sptr<WindowProperty> property1 = new WindowProperty();
321    property1->SetWindowFlags(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_NEED_AVOID));
322    sptr<WindowProperty> property2 = new WindowProperty();
323    property2->SetWindowFlags(static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE));
324    windowPair->primary_ = new WindowNode(property1);
325    windowPair->secondary_ = new WindowNode(property2);
326    ASSERT_EQ(true, windowPair->IsForbidDockSliceMove());
327}
328
329/**
330 * @tc.name: IsDockSliceInExitSplitModeArea
331 * @tc.desc: whether dock slice in exit split screen mode area
332 * @tc.type: FUNC
333 */
334HWTEST_F(WindowPairTest, IsDockSliceInExitSplitModeArea01, Function | SmallTest | Level2)
335{
336    sptr<WindowPair> windowPair = new WindowPair(0);
337    std::vector<int32_t> points {0, 0};
338    windowPair->primary_ = nullptr;
339    ASSERT_EQ(false, windowPair->IsDockSliceInExitSplitModeArea(points));
340}
341
342/**
343 * @tc.name: IsDockSliceInExitSplitModeArea
344 * @tc.desc: whether dock slice in exit split screen mode area
345 * @tc.type: FUNC
346 */
347HWTEST_F(WindowPairTest, IsDockSliceInExitSplitModeArea02, Function | SmallTest | Level2)
348{
349    sptr<WindowPair> windowPair = new WindowPair(0);
350    std::vector<int32_t> points {2, 0};
351    sptr<WindowProperty> property1 = new WindowProperty();
352    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
353    sptr<WindowProperty> property2 = new WindowProperty();
354    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
355    sptr<WindowProperty> property3 = new WindowProperty();
356
357    sptr<WindowNode> node1 = new WindowNode(property1);
358    windowPair->primary_ = node1;
359    sptr<WindowNode> node2 = new WindowNode(property2);
360    windowPair->secondary_ = node2;
361    Rect rect1 = {1, 1, 10, 20};
362    Rect rect2 = {1, 1, 20, 10};
363    property2->SetWindowRect(rect1);
364    property3->SetWindowRect(rect2);
365    windowPair->divider_ = new WindowNode(property2);
366
367    ASSERT_EQ(true, windowPair->IsPaired());
368    ASSERT_EQ(true, windowPair->IsDockSliceInExitSplitModeArea(points));
369    windowPair->divider_ = new WindowNode(property3);
370    ASSERT_EQ(true, windowPair->IsDockSliceInExitSplitModeArea(points));
371}
372
373/**
374 * @tc.name: IsDockSliceInExitSplitModeArea
375 * @tc.desc: whether dock slice in exit split screen mode area
376 * @tc.type: FUNC
377 */
378HWTEST_F(WindowPairTest, IsDockSliceInExitSplitModeArea03, Function | SmallTest | Level2)
379{
380    sptr<WindowPair> windowPair = new WindowPair(0);
381    std::vector<int32_t> points {0, 50};
382    sptr<WindowProperty> property1 = new WindowProperty();
383    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
384    sptr<WindowProperty> property2 = new WindowProperty();
385    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
386
387    sptr<WindowNode> node1 = new WindowNode(property1);
388    windowPair->primary_ = node1;
389    sptr<WindowNode> node2 = new WindowNode(property2);
390    windowPair->secondary_ = node2;
391    Rect rect1 = {1, 1, 10, 20};
392    property2->SetWindowRect(rect1);
393    windowPair->divider_ = new WindowNode(property2);
394
395    ASSERT_EQ(true, windowPair->IsPaired());
396    ASSERT_EQ(false, windowPair->IsDockSliceInExitSplitModeArea(points));
397}
398
399/**
400 * @tc.name: IsSplitRelated
401 * @tc.desc: Gets whether the window is related to split window.
402 * @tc.type: FUNC
403 */
404HWTEST_F(WindowPairTest, IsSplitRelated01, Function | SmallTest | Level2)
405{
406    sptr<WindowPair> windowPair = new WindowPair(0);
407    sptr<WindowNode> node = nullptr;
408    ASSERT_EQ(false, windowPair->IsSplitRelated(node));
409}
410
411/**
412 * @tc.name: IsSplitRelated
413 * @tc.desc: Gets whether the window is related to split window.
414 * @tc.type: FUNC
415 */
416HWTEST_F(WindowPairTest, IsSplitRelated02, Function | SmallTest | Level2)
417{
418    sptr<WindowPair> windowPair = new WindowPair(0);
419    sptr<WindowProperty> property1 = new WindowProperty();
420    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
421    sptr<WindowNode> node1 = new WindowNode(property1);
422    ASSERT_EQ(true, windowPair->IsSplitRelated(node1));
423    property1->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
424    property1->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
425    sptr<WindowNode> node2 = new WindowNode(property1);
426    ASSERT_EQ(true, windowPair->IsSplitRelated(node2));
427    property1->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
428    property1->SetWindowType(WindowType::APP_WINDOW_BASE);
429    sptr<WindowNode> node3 = new WindowNode(property1);
430    ASSERT_EQ(false, windowPair->IsSplitRelated(node3));
431}
432
433/**
434 * @tc.name: GetOrderedPair
435 * @tc.desc: Get all window node form pair in Z order.
436 * @tc.type: FUNC
437 */
438HWTEST_F(WindowPairTest, GetOrderedPair01, Function | SmallTest | Level2)
439{
440    sptr<WindowPair> windowPair = new WindowPair(0);
441    sptr<WindowNode> node1 = nullptr;
442    std::vector<sptr<WindowNode>> vec;
443    vec.clear();
444    ASSERT_EQ(vec, windowPair->GetOrderedPair(node1));
445}
446
447/**
448 * @tc.name: GetOrderedPair
449 * @tc.desc: Get all window node form pair in Z order.
450 * @tc.type: FUNC
451 */
452HWTEST_F(WindowPairTest, GetOrderedPair02, Function | SmallTest | Level2)
453{
454    sptr<WindowPair> windowPair = new WindowPair(0);
455
456    // create window property
457    sptr<WindowProperty> property0 = new WindowProperty();
458    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
459    property0->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
460    property0->SetWindowId(1);
461    sptr<WindowProperty> property1 = new WindowProperty();
462    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
463    property1->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
464    property1->SetWindowId(2);
465    sptr<WindowProperty> property2 = new WindowProperty();
466    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
467    property2->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
468    property2->SetWindowId(3);
469
470    // define primary_, secondary_, divider_
471    sptr<WindowNode> node1 = new WindowNode(property1);
472
473    windowPair->primary_ = new WindowNode(property0);
474    windowPair->secondary_ = node1;
475    windowPair->divider_ = new WindowNode(property2);
476    ASSERT_EQ(3, windowPair->GetOrderedPair(node1).size());
477}
478
479/**
480 * @tc.name: GetOrderedPair
481 * @tc.desc: Get all window node form pair in Z order.
482 * @tc.type: FUNC
483 */
484HWTEST_F(WindowPairTest, GetOrderedPair03, Function | SmallTest | Level2)
485{
486    sptr<WindowPair> windowPair = new WindowPair(0);
487
488    // create window property
489    sptr<WindowProperty> property0 = new WindowProperty();
490    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
491    property0->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
492    property0->SetWindowId(1);
493    sptr<WindowProperty> property1 = new WindowProperty();
494    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
495    property1->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
496    property1->SetWindowId(2);
497    sptr<WindowProperty> property2 = new WindowProperty();
498    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
499    property2->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
500    property2->SetWindowId(3);
501
502    // define primary_, secondary_, divider_
503    sptr<WindowNode> node1 = new WindowNode(property0);
504    windowPair->primary_ = node1;
505    windowPair->secondary_ = new WindowNode(property1);
506    windowPair->divider_ = new WindowNode(property2);
507
508    ASSERT_EQ(3, windowPair->GetOrderedPair(node1).size());
509}
510
511/**
512 * @tc.name: GetOrderedPair
513 * @tc.desc: Get all window node form pair in Z order.
514 * @tc.type: FUNC
515 */
516HWTEST_F(WindowPairTest, GetOrderedPair04, Function | SmallTest | Level2)
517{
518    sptr<WindowPair> windowPair = new WindowPair(0);
519    // create window property
520    sptr<WindowProperty> property0 = new WindowProperty();
521    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
522    property0->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
523    property0->SetWindowId(1);
524    sptr<WindowProperty> property1 = new WindowProperty();
525    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
526    property1->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
527    property1->SetWindowId(2);
528    sptr<WindowProperty> property2 = new WindowProperty();
529    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
530    property2->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
531    property2->SetWindowId(3);
532    // define primary_, secondary_, divider_
533    sptr<WindowNode> node1 = new WindowNode(property0);
534    windowPair->primary_ = node1;
535    windowPair->secondary_ = nullptr;
536    windowPair->divider_ = new WindowNode(property2);
537    ASSERT_EQ(2, windowPair->GetOrderedPair(node1).size());
538}
539
540/**
541 * @tc.name: GetOrderedPair
542 * @tc.desc: Get all window node form pair in Z order.
543 * @tc.type: FUNC
544 */
545HWTEST_F(WindowPairTest, GetOrderedPair05, Function | SmallTest | Level2)
546{
547    sptr<WindowPair> windowPair = new WindowPair(0);
548    // create window property
549    sptr<WindowProperty> property0 = new WindowProperty();
550    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
551    property0->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
552    property0->SetWindowId(1);
553    sptr<WindowProperty> property1 = new WindowProperty();
554    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
555    property1->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
556    property1->SetWindowId(2);
557    sptr<WindowProperty> property2 = new WindowProperty();
558    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
559    property2->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
560    property2->SetWindowId(3);
561    // define primary_, secondary_, divider_
562    sptr<WindowNode> node1 = new WindowNode(property1);
563    windowPair->primary_ = nullptr;
564    windowPair->secondary_ = node1;
565    windowPair->divider_ = new WindowNode(property2);
566    ASSERT_EQ(2, windowPair->GetOrderedPair(node1).size());
567}
568
569/**
570 * @tc.name: GetOrderedPair
571 * @tc.desc: Get all window node form pair in Z order.
572 * @tc.type: FUNC
573 */
574HWTEST_F(WindowPairTest, GetOrderedPair06, Function | SmallTest | Level2)
575{
576    sptr<WindowPair> windowPair = new WindowPair(0);
577    // create window property
578    sptr<WindowProperty> property0 = new WindowProperty();
579    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
580    property0->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
581    property0->SetWindowId(1);
582    sptr<WindowProperty> property1 = new WindowProperty();
583    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
584    property1->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
585    property1->SetWindowId(2);
586    sptr<WindowProperty> property2 = new WindowProperty();
587    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
588    property2->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
589    property2->SetWindowId(3);
590    // define primary_, secondary_, divider_
591    sptr<WindowNode> node1 = new WindowNode(property2);
592    windowPair->primary_ = nullptr;
593    windowPair->secondary_ = nullptr;
594    windowPair->divider_ = node1;
595    ASSERT_EQ(1, windowPair->GetOrderedPair(node1).size());
596}
597
598/**
599 * @tc.name: GetOrderedPair
600 * @tc.desc: Get all window node form pair in Z order.
601 * @tc.type: FUNC
602 */
603HWTEST_F(WindowPairTest, GetOrderedPair07, Function | SmallTest | Level2)
604{
605    sptr<WindowPair> windowPair = new WindowPair(0);
606    // create window property
607    sptr<WindowProperty> property0 = new WindowProperty();
608    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
609    property0->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
610    property0->SetWindowId(1);
611    sptr<WindowProperty> property1 = new WindowProperty();
612    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
613    property1->SetWindowType(WindowType::APP_MAIN_WINDOW_BASE);
614    property1->SetWindowId(2);
615    sptr<WindowProperty> property2 = new WindowProperty();
616    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
617    property2->SetWindowType(WindowType::WINDOW_TYPE_DOCK_SLICE);
618    property2->SetWindowId(3);
619    // define primary_, secondary_, divider_
620    sptr<WindowNode> node1 = new WindowNode(property0);
621    windowPair->primary_ = node1;
622    windowPair->secondary_ = new WindowNode(property1);
623    windowPair->divider_ = nullptr;
624    ASSERT_EQ(2, windowPair->GetOrderedPair(node1).size());
625}
626
627/**
628 * @tc.name: GetPairedWindows
629 * @tc.desc: Get all window node form pair.
630 * @tc.type: FUNC
631 */
632HWTEST_F(WindowPairTest, GetPairedWindows01, Function | SmallTest | Level2)
633{
634    sptr<WindowPair> windowPair = new WindowPair(0);
635    sptr<WindowProperty> property0 = new WindowProperty();
636    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
637    sptr<WindowProperty> property1 = new WindowProperty();
638    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
639
640    // define primary_, secondary_
641    windowPair->primary_ = new WindowNode(property0);
642    windowPair->secondary_ = new WindowNode(property1);
643
644    // define status_
645    windowPair->status_ = WindowPairStatus::EMPTY;
646
647    ASSERT_EQ(0, windowPair->GetPairedWindows().size());
648    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
649    ASSERT_EQ(2, windowPair->GetPairedWindows().size());
650    ASSERT_EQ(windowPair->secondary_, windowPair->GetPairedWindows().at(1));
651    ASSERT_EQ(windowPair->primary_, windowPair->GetPairedWindows().at(0));
652}
653
654/**
655 * @tc.name: Clear
656 * @tc.desc: Clear window pair.
657 * @tc.type: FUNC
658 */
659HWTEST_F(WindowPairTest, Clear01, Function | SmallTest | Level2)
660{
661    sptr<WindowPair> windowPair = new WindowPair(0);
662    sptr<WindowProperty> property0 = new WindowProperty();
663    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
664
665    // define divider
666    windowPair->divider_ = new WindowNode(property0);
667    windowPair->Clear();
668    ASSERT_EQ(nullptr, windowPair->divider_);
669    ASSERT_EQ(WindowPairStatus::EMPTY, windowPair->status_);
670}
671
672/**
673 * @tc.name: UpdateWindowPairStatus
674 * @tc.desc: Update pair status
675 * @tc.type: FUNC
676 */
677HWTEST_F(WindowPairTest, UpdateWindowPairStatus01, Function | SmallTest | Level2)
678{
679    sptr<WindowPair> windowPair = new WindowPair(0);
680    sptr<WindowProperty> property0 = new WindowProperty();
681
682    // define primary_, secondary_, divider_
683    windowPair->primary_ = new WindowNode(property0);
684    windowPair->secondary_ = new WindowNode(property0);
685    windowPair->divider_ = new WindowNode(property0);
686
687    // define status_
688    windowPair->status_ = WindowPairStatus::SINGLE_PRIMARY;
689
690    windowPair->UpdateWindowPairStatus();
691    ASSERT_EQ(WindowPairStatus::PAIRED_DONE, windowPair->status_);
692}
693
694/**
695 * @tc.name: UpdateWindowPairStatus
696 * @tc.desc: Update pair status
697 * @tc.type: FUNC
698 */
699HWTEST_F(WindowPairTest, UpdateWindowPairStatus02, Function | SmallTest | Level2)
700{
701    sptr<WindowPair> windowPair = new WindowPair(0);
702    sptr<WindowProperty> property0 = new WindowProperty();
703
704    // define primary_, secondary_, divider_
705    windowPair->primary_ = new WindowNode(property0);
706    windowPair->secondary_ = new WindowNode(property0);
707    windowPair->divider_ = nullptr;
708
709    // define status_
710    windowPair->status_ = WindowPairStatus::SINGLE_PRIMARY;
711
712    windowPair->UpdateWindowPairStatus();
713    ASSERT_EQ(WindowPairStatus::PRIMARY_AND_SECONDARY, windowPair->status_);
714}
715
716/**
717 * @tc.name: UpdateWindowPairStatus
718 * @tc.desc: Update pair status
719 * @tc.type: FUNC
720 */
721HWTEST_F(WindowPairTest, UpdateWindowPairStatus03, Function | SmallTest | Level2)
722{
723    sptr<WindowPair> windowPair = new WindowPair(0);
724    sptr<WindowProperty> property0 = new WindowProperty();
725
726    // define primary_, secondary_, divider_
727    windowPair->primary_ = new WindowNode(property0);
728    windowPair->secondary_ = nullptr;
729    windowPair->divider_ = new WindowNode(property0);
730
731    // define status_
732    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
733
734    windowPair->UpdateWindowPairStatus();
735    ASSERT_EQ(WindowPairStatus::EMPTY, windowPair->status_);
736    ASSERT_EQ(nullptr, windowPair->primary_);
737    ASSERT_EQ(nullptr, windowPair->secondary_);
738    ASSERT_EQ(nullptr, windowPair->divider_);
739}
740
741/**
742 * @tc.name: UpdateWindowPairStatus
743 * @tc.desc: Update pair status
744 * @tc.type: FUNC
745 */
746HWTEST_F(WindowPairTest, UpdateWindowPairStatus04, Function | SmallTest | Level2)
747{
748    sptr<WindowPair> windowPair = new WindowPair(0);
749    sptr<WindowProperty> property0 = new WindowProperty();
750
751    // define primary_, secondary_, divider_
752    windowPair->primary_ = nullptr;
753    windowPair->secondary_ = new WindowNode(property0);
754    windowPair->divider_ = new WindowNode(property0);
755
756    // define status_
757    windowPair->status_ = WindowPairStatus::EMPTY;
758
759    sptr<WindowNode> node1 = windowPair->secondary_;
760    sptr<WindowNode> node2 = windowPair->divider_;
761    windowPair->UpdateWindowPairStatus();
762    ASSERT_EQ(WindowPairStatus::SECONDARY_AND_DIVIDER, windowPair->status_);
763    ASSERT_EQ(nullptr, windowPair->primary_);
764    ASSERT_EQ(node1, windowPair->secondary_);
765    ASSERT_EQ(node2, windowPair->divider_);
766}
767
768/**
769 * @tc.name: UpdateWindowPairStatus
770 * @tc.desc: Update pair status
771 * @tc.type: FUNC
772 */
773HWTEST_F(WindowPairTest, UpdateWindowPairStatus05, Function | SmallTest | Level2)
774{
775    sptr<WindowPair> windowPair = new WindowPair(0);
776    sptr<WindowProperty> property0 = new WindowProperty();
777
778    // define primary_, secondary_, divider_
779    windowPair->primary_ = nullptr;
780    windowPair->secondary_ = nullptr;
781    windowPair->divider_ = new WindowNode(property0);
782
783    // define status_
784    windowPair->status_ = WindowPairStatus::SINGLE_PRIMARY;
785
786    sptr<WindowNode> node1 = windowPair->divider_;
787    windowPair->UpdateWindowPairStatus();
788    ASSERT_EQ(WindowPairStatus::SINGLE_SPLIT, windowPair->status_);
789    ASSERT_EQ(nullptr, windowPair->primary_);
790    ASSERT_EQ(nullptr, windowPair->secondary_);
791    ASSERT_EQ(node1, windowPair->divider_);
792}
793
794/**
795 * @tc.name: SwitchPosition
796 * @tc.desc: Switch the position of two paired window.
797 * @tc.type: FUNC
798 */
799HWTEST_F(WindowPairTest, SwitchPosition01, Function | SmallTest | Level2)
800{
801    sptr<WindowPair> windowPair = new WindowPair(0);
802    sptr<WindowProperty> property0 = new WindowProperty();
803
804    // define primary_, secondary_, divider_
805    windowPair->primary_ = nullptr;
806    windowPair->secondary_ = nullptr;
807    windowPair->divider_ = new WindowNode(property0);
808
809    sptr<WindowNode> node1 = windowPair->divider_;
810    ASSERT_EQ(nullptr, windowPair->primary_);
811    ASSERT_EQ(nullptr, windowPair->secondary_);
812    ASSERT_EQ(node1, windowPair->divider_);
813}
814
815/**
816 * @tc.name: SwitchPosition
817 * @tc.desc: Switch the position of two paired window.
818 * @tc.type: FUNC
819 */
820HWTEST_F(WindowPairTest, SwitchPosition02, Function | SmallTest | Level2)
821{
822    sptr<WindowPair> windowPair = new WindowPair(0);
823    sptr<WindowProperty> property0 = new WindowProperty();
824    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
825    sptr<WindowProperty> property1 = new WindowProperty();
826    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
827
828    // define primary_, secondary_
829    windowPair->primary_ = new WindowNode(property0);
830    windowPair->secondary_ = new WindowNode(property1);
831
832    windowPair->SwitchPosition();
833    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, windowPair->primary_->GetWindowMode());
834    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, windowPair->secondary_->GetWindowMode());
835}
836
837/**
838 * @tc.name: SwitchPosition
839 * @tc.desc: Switch the position of two paired window.
840 * @tc.type: FUNC
841 */
842HWTEST_F(WindowPairTest, SwitchPosition03, Function | SmallTest | Level2)
843{
844    sptr<WindowPair> windowPair = new WindowPair(0);
845    sptr<WindowProperty> property0 = new WindowProperty();
846    property0->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
847    sptr<WindowProperty> property1 = new WindowProperty();
848    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
849
850    // define primary_, secondary_
851    windowPair->primary_ = new WindowNode(property0);
852    windowPair->secondary_ = new WindowNode(property1);
853
854    windowPair->SwitchPosition();
855    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, windowPair->primary_->GetWindowMode());
856    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, windowPair->secondary_->GetWindowMode());
857}
858
859/**
860 * @tc.name: HandlePairedNodesChange
861 * @tc.desc: Update paired window node
862 * @tc.type: FUNC
863 */
864HWTEST_F(WindowPairTest, HandlePairedNodesChange01, Function | SmallTest | Level2)
865{
866    sptr<WindowPair> windowPair = new WindowPair(0);
867    sptr<WindowProperty> property0 = new WindowProperty();
868    property0->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
869    sptr<WindowProperty> property1 = new WindowProperty();
870    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
871
872    // define primary_, secondary_
873    windowPair->primary_ = new WindowNode(property0);
874    windowPair->secondary_ = new WindowNode(property0);
875
876    windowPair->HandlePairedNodesChange();
877    ASSERT_EQ(nullptr, windowPair->primary_);
878    ASSERT_EQ(nullptr, windowPair->secondary_);
879    ASSERT_EQ(WindowPairStatus::EMPTY, windowPair->status_);
880}
881
882/**
883 * @tc.name: HandlePairedNodesChange
884 * @tc.desc: Update paired window node
885 * @tc.type: FUNC
886 */
887HWTEST_F(WindowPairTest, HandlePairedNodesChange02, Function | SmallTest | Level2)
888{
889    sptr<WindowPair> windowPair = new WindowPair(0);
890    sptr<WindowProperty> property0 = new WindowProperty();
891    property0->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
892    sptr<WindowProperty> property1 = new WindowProperty();
893    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
894
895    // define primary_, secondary_
896    windowPair->primary_ = new WindowNode(property0);
897    windowPair->secondary_ = new WindowNode(property1);
898
899    sptr<WindowNode> tmp_node = windowPair->secondary_;
900    windowPair->HandlePairedNodesChange();
901    ASSERT_EQ(tmp_node, windowPair->primary_);
902    ASSERT_EQ(nullptr, windowPair->secondary_);
903    ASSERT_EQ(WindowPairStatus::SINGLE_PRIMARY, windowPair->status_);
904}
905
906/**
907 * @tc.name: HandlePairedNodesChange
908 * @tc.desc: Update paired window node
909 * @tc.type: FUNC
910 */
911HWTEST_F(WindowPairTest, HandlePairedNodesChange03, Function | SmallTest | Level2)
912{
913    sptr<WindowPair> windowPair = new WindowPair(0);
914    sptr<WindowProperty> property0 = new WindowProperty();
915    property0->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
916
917    // define primary_, secondary_
918    windowPair->primary_ = nullptr;
919    windowPair->secondary_ = new WindowNode(property0);
920
921    windowPair->HandlePairedNodesChange();
922    ASSERT_EQ(nullptr, windowPair->primary_);
923    ASSERT_EQ(nullptr, windowPair->secondary_);
924    ASSERT_EQ(WindowPairStatus::EMPTY, windowPair->status_);
925}
926
927/**
928 * @tc.name: HandlePairedNodesChange
929 * @tc.desc: Update paired window node
930 * @tc.type: FUNC
931 */
932HWTEST_F(WindowPairTest, HandlePairedNodesChange04, Function | SmallTest | Level2)
933{
934    sptr<WindowPair> windowPair = new WindowPair(0);
935    sptr<WindowProperty> property0 = new WindowProperty();
936    property0->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
937    sptr<WindowProperty> property1 = new WindowProperty();
938    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
939    sptr<WindowProperty> property2 = new WindowProperty();
940    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
941
942    // define primary_, secondary_
943    windowPair->primary_ = new WindowNode(property2);
944    windowPair->secondary_ = new WindowNode(property0);
945
946    sptr<WindowNode> tmp_node = windowPair->primary_;
947    windowPair->HandlePairedNodesChange();
948    ASSERT_EQ(nullptr, windowPair->primary_);
949    ASSERT_EQ(tmp_node, windowPair->secondary_);
950    ASSERT_EQ(WindowPairStatus::SINGLE_SECONDARY, windowPair->status_);
951}
952
953/**
954 * @tc.name: HandlePairedNodesChange
955 * @tc.desc: Update paired window node
956 * @tc.type: FUNC
957 */
958HWTEST_F(WindowPairTest, HandlePairedNodesChange05, Function | SmallTest | Level2)
959{
960    sptr<WindowPair> windowPair = new WindowPair(0);
961    sptr<WindowProperty> property1 = new WindowProperty();
962    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
963    sptr<WindowProperty> property2 = new WindowProperty();
964    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
965
966    // define primary_, secondary_
967    windowPair->primary_ = new WindowNode(property1);
968    windowPair->secondary_ = new WindowNode(property2);
969
970    windowPair->HandlePairedNodesChange();
971    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, windowPair->primary_->GetWindowMode());
972    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, windowPair->secondary_->GetWindowMode());
973}
974
975/**
976 * @tc.name: HandleRemoveWindow
977 * @tc.desc: Handle removed window
978 * @tc.type: FUNC
979 */
980HWTEST_F(WindowPairTest, HandleRemoveWindow01, Function | SmallTest | Level2)
981{
982    sptr<WindowPair> windowPair = new WindowPair(0);
983    sptr<WindowProperty> property1 = new WindowProperty();
984    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
985    windowPair->primary_ = new WindowNode(property1);
986
987    sptr<WindowNode> node = nullptr;
988    windowPair->HandleRemoveWindow(node);
989    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, windowPair->primary_->GetWindowMode());
990}
991
992/**
993 * @tc.name: HandleRemoveWindow
994 * @tc.desc: Handle removed window
995 * @tc.type: FUNC
996 */
997HWTEST_F(WindowPairTest, HandleRemoveWindow02, Function | SmallTest | Level2)
998{
999    sptr<WindowPair> windowPair = new WindowPair(0);
1000
1001    sptr<WindowProperty> property1 = new WindowProperty();
1002    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
1003
1004    sptr<WindowNode> node1 = new WindowNode(property1);
1005    sptr<WindowNode> node2 = new WindowNode(property1);
1006
1007    // define primary_, secondary_, status_
1008    windowPair->primary_ = nullptr;
1009    windowPair->secondary_ = nullptr;
1010    windowPair->divider_ = nullptr;
1011    windowPair->status_ = WindowPairStatus::PRIMARY_AND_SECONDARY;
1012
1013    IWindowMocker* w = new IWindowMocker;
1014    sptr<IWindow> window(w);
1015    node1->SetWindowToken(window);
1016    EXPECT_CALL(*w, UpdateWindowMode(_)).Times(1).WillOnce(Return(WMError::WM_OK));
1017    windowPair->HandleRemoveWindow(node1);
1018    ASSERT_EQ(nullptr, windowPair->primary_);
1019    sptr<IWindow> window1 = nullptr;
1020    node1->SetWindowToken(window1);
1021    windowPair->HandleRemoveWindow(node1);
1022    ASSERT_EQ(nullptr, windowPair->primary_);
1023}
1024
1025/**
1026 * @tc.name: TakePairSnapshot
1027 * @tc.desc: take pair snapsht
1028 * @tc.type: FUNC
1029 */
1030HWTEST_F(WindowPairTest, TakePairSnapshot01, Function | SmallTest | Level2)
1031{
1032    sptr<WindowPair> windowPair = new WindowPair(0);
1033
1034    sptr<WindowProperty> property1 = new WindowProperty();
1035    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
1036    sptr<WindowProperty> property2 = new WindowProperty();
1037    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
1038
1039    sptr<WindowNode> node1 = new WindowNode(property1);
1040    sptr<WindowNode> node2 = new WindowNode(property2);
1041
1042    // define primary_, secondary_, status_
1043    windowPair->primary_ = node1;
1044    windowPair->secondary_ = node2;
1045    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
1046
1047    ASSERT_EQ(true, windowPair->TakePairSnapshot());
1048    windowPair->primary_ = nullptr;
1049    ASSERT_EQ(false, windowPair->TakePairSnapshot());
1050    windowPair->primary_ = node1;
1051    windowPair->secondary_ = nullptr;
1052    ASSERT_EQ(false, windowPair->TakePairSnapshot());
1053    windowPair->status_ = WindowPairStatus::PRIMARY_AND_SECONDARY;
1054    ASSERT_EQ(false, windowPair->TakePairSnapshot());
1055}
1056
1057/**
1058 * @tc.name: ClearPairSnapshot
1059 * @tc.desc: Clear Pair Snapshot
1060 * @tc.type: FUNC
1061 */
1062HWTEST_F(WindowPairTest, ClearPairSnapshot01, Function | SmallTest | Level2)
1063{
1064    sptr<WindowPair> windowPair = new WindowPair(0);
1065
1066    sptr<WindowProperty> property1 = new WindowProperty();
1067    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
1068    sptr<WindowProperty> property2 = new WindowProperty();
1069    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
1070
1071    sptr<WindowNode> node1 = new WindowNode(property1);
1072    sptr<WindowNode> node2 = new WindowNode(property2);
1073
1074    // define primary_, secondary_,
1075    windowPair->primary_ = node1;
1076    windowPair->secondary_ = node2;
1077
1078    windowPair->ClearPairSnapshot();
1079    ASSERT_EQ(nullptr, windowPair->primary_->snapshot_);
1080    ASSERT_EQ(nullptr, windowPair->secondary_->snapshot_);
1081
1082    windowPair->primary_ = nullptr;
1083    ASSERT_EQ(false, windowPair->TakePairSnapshot());
1084    windowPair->primary_ = node1;
1085    windowPair->secondary_ = nullptr;
1086    ASSERT_EQ(false, windowPair->TakePairSnapshot());
1087    windowPair->status_ = WindowPairStatus::PRIMARY_AND_SECONDARY;
1088    ASSERT_EQ(false, windowPair->TakePairSnapshot());
1089}
1090/**
1091 * @tc.name: ExitSplitMode
1092 * @tc.desc: Exit Split Mode
1093 * @tc.type: FUNC
1094 */
1095HWTEST_F(WindowPairTest, ExitSplitMode01, Function | SmallTest | Level2)
1096{
1097    sptr<WindowPair> windowPair = new WindowPair(0);
1098    sptr<WindowProperty> property1 = new WindowProperty();
1099    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
1100    sptr<WindowProperty> property2 = new WindowProperty();
1101    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
1102
1103    sptr<WindowNode> node1 = new WindowNode(property1);
1104    windowPair->primary_ = node1;
1105    sptr<WindowNode> node2 = new WindowNode(property2);
1106    windowPair->secondary_ = node2;
1107    windowPair->divider_ = nullptr;
1108    windowPair->ExitSplitMode();
1109    ASSERT_EQ(nullptr, windowPair->divider_);
1110}
1111/**
1112 * @tc.name: ExitSplitMode
1113 * @tc.desc: Exit Split Mode
1114 * @tc.type: FUNC
1115 */
1116HWTEST_F(WindowPairTest, ExitSplitMode02, Function | SmallTest | Level2)
1117{
1118    sptr<WindowPair> windowPair = new WindowPair(0);
1119    sptr<WindowProperty> property1 = new WindowProperty();
1120    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
1121    sptr<WindowProperty> property2 = new WindowProperty();
1122    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
1123    sptr<WindowProperty> property3 = new WindowProperty();
1124    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
1125
1126    sptr<WindowNode> node1 = new WindowNode(property1);
1127    windowPair->primary_ = node1;
1128    sptr<WindowNode> node2 = new WindowNode(property2);
1129    windowPair->secondary_ = node2;
1130    sptr<WindowNode> node3 = new WindowNode(property3);
1131    const Rect divider_rect2 = {0, 20, 100, 1};
1132    const Rect primary_rect1 = {0, 0, 20, 20};
1133    const Rect secondary_rect1 = {0, 20, 50, 70};
1134    const Rect secondary_rect2 = {0, 20, 10, 10};
1135    node3->SetWindowRect(divider_rect2);
1136    node1->SetWindowRect(primary_rect1);
1137    node2->SetWindowRect(secondary_rect1);
1138    windowPair->divider_ = node3;
1139    windowPair->primary_ = node1;
1140    windowPair->secondary_ = node2;
1141    windowPair->ExitSplitMode();
1142    std::vector<wptr<WindowNode>> vec1 = MinimizeApp::needMinimizeAppNodes_[MinimizeReason::SPLIT_QUIT];
1143    ASSERT_EQ(0, vec1.size());
1144    node2->SetWindowRect(secondary_rect2);
1145    windowPair->secondary_ = node2;
1146    windowPair->ExitSplitMode();
1147    std::vector<wptr<WindowNode>> vec2 = MinimizeApp::needMinimizeAppNodes_[MinimizeReason::SPLIT_QUIT];
1148    ASSERT_EQ(0, vec2.size());
1149    windowPair->Clear();
1150}
1151/**
1152 * @tc.name: ExitSplitMode
1153 * @tc.desc: Exit Split Mode
1154 * @tc.type: FUNC
1155 */
1156HWTEST_F(WindowPairTest, ExitSplitMode03, Function | SmallTest | Level2)
1157{
1158    sptr<WindowPair> windowPair = new WindowPair(0);
1159    sptr<WindowProperty> property1 = new WindowProperty();
1160    property1->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
1161    sptr<WindowProperty> property2 = new WindowProperty();
1162    property2->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
1163    sptr<WindowProperty> property3 = new WindowProperty();
1164    property2->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
1165
1166    sptr<WindowNode> node1 = new WindowNode(property1);
1167    windowPair->primary_ = node1;
1168    sptr<WindowNode> node2 = new WindowNode(property2);
1169    windowPair->secondary_ = node2;
1170    sptr<WindowNode> node3 = new WindowNode(property3);
1171    const Rect divider_rect1 = {20, 0, 1, 100};
1172    const Rect primary_rect1 = {0, 0, 20, 20};
1173    const Rect secondary_rect1 = {0, 20, 50, 70};
1174    const Rect secondary_rect2 = {0, 20, 10, 20};
1175    node3->SetWindowRect(divider_rect1); // is_vertical false
1176    node2->SetWindowRect(secondary_rect1);
1177    node1->SetWindowRect(primary_rect1);
1178    windowPair->divider_ = node3;
1179    windowPair->primary_ = node1;
1180    windowPair->secondary_ = node2;
1181    windowPair->ExitSplitMode();
1182    std::vector<wptr<WindowNode>> vec1 = MinimizeApp::needMinimizeAppNodes_[MinimizeReason::SPLIT_QUIT];
1183    ASSERT_EQ(0, vec1.size());
1184    node2->SetWindowRect(secondary_rect2);
1185    windowPair->secondary_ = node2;
1186    std::vector<wptr<WindowNode>> vec2 = MinimizeApp::needMinimizeAppNodes_[MinimizeReason::SPLIT_QUIT];
1187    ASSERT_EQ(0, vec2.size());
1188    windowPair->Clear();
1189}
1190
1191
1192/**
1193 * @tc.name: IsDuringSplit
1194 * @tc.desc: check function IsDuringSplit
1195 * @tc.type: FUNC
1196 */
1197HWTEST_F(WindowPairTest, IsDuringSplit, Function | SmallTest | Level2)
1198{
1199    sptr<WindowPair> windowPair = new WindowPair(0);
1200    auto result = windowPair->IsDuringSplit();
1201    ASSERT_EQ(result, false);
1202
1203    windowPair->status_ = WindowPairStatus::EMPTY;
1204    result = windowPair->IsDuringSplit();
1205    ASSERT_EQ(result, false);
1206
1207    windowPair->status_ = WindowPairStatus::SINGLE_PRIMARY;
1208    result = windowPair->IsDuringSplit();
1209    ASSERT_EQ(result, true);
1210
1211    windowPair->status_ = WindowPairStatus::PAIRED_DONE;
1212    windowPair->primary_ = nullptr;
1213    windowPair->secondary_ = nullptr;
1214    result = windowPair->IsDuringSplit();
1215    ASSERT_EQ(result, true);
1216
1217    sptr<WindowNode> node1 = new WindowNode();
1218    node1->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
1219    windowPair->primary_ = node1;
1220    result = windowPair->IsDuringSplit();
1221    ASSERT_EQ(result, true);
1222
1223    sptr<WindowNode> node2 = new WindowNode();
1224    node2->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
1225    windowPair->secondary_ = node2;
1226    result = windowPair->IsDuringSplit();
1227    ASSERT_EQ(result, false);
1228
1229    windowPair->primary_->property_->SetWindowType(WindowType::WINDOW_TYPE_LAUNCHER_RECENT);
1230    windowPair->secondary_->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
1231    result = windowPair->IsDuringSplit();
1232    ASSERT_EQ(result, true);
1233
1234    windowPair->primary_->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
1235    windowPair->secondary_->property_->SetWindowType(WindowType::WINDOW_TYPE_LAUNCHER_RECENT);
1236    ASSERT_EQ(result, true);
1237}
1238}
1239}
1240}
1241