1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci// gtest
17e0dac50fSopenharmony_ci#include <gtest/gtest.h>
18e0dac50fSopenharmony_ci#include "window_test_utils.h"
19e0dac50fSopenharmony_ci#include "wm_common.h"
20e0dac50fSopenharmony_ciusing namespace testing;
21e0dac50fSopenharmony_ciusing namespace testing::ext;
22e0dac50fSopenharmony_ci
23e0dac50fSopenharmony_cinamespace OHOS {
24e0dac50fSopenharmony_cinamespace Rosen {
25e0dac50fSopenharmony_ciusing Utils = WindowTestUtils;
26e0dac50fSopenharmony_ciclass WindowSplitTest : public testing::Test {
27e0dac50fSopenharmony_cipublic:
28e0dac50fSopenharmony_ci    static void SetUpTestCase();
29e0dac50fSopenharmony_ci    static void TearDownTestCase();
30e0dac50fSopenharmony_ci    virtual void SetUp() override;
31e0dac50fSopenharmony_ci    virtual void TearDown() override;
32e0dac50fSopenharmony_ci    std::vector<sptr<Window>> activeWindows_;
33e0dac50fSopenharmony_ci    Utils::TestWindowInfo fullInfo_;
34e0dac50fSopenharmony_ci    Utils::TestWindowInfo splitInfo_;
35e0dac50fSopenharmony_ci
36e0dac50fSopenharmony_ciprivate:
37e0dac50fSopenharmony_ci    static constexpr uint32_t SPLIT_TEST_SLEEP_S = 1; // split test sleep time
38e0dac50fSopenharmony_ci};
39e0dac50fSopenharmony_ci
40e0dac50fSopenharmony_civoid WindowSplitTest::SetUpTestCase()
41e0dac50fSopenharmony_ci{
42e0dac50fSopenharmony_ci}
43e0dac50fSopenharmony_ci
44e0dac50fSopenharmony_civoid WindowSplitTest::TearDownTestCase()
45e0dac50fSopenharmony_ci{
46e0dac50fSopenharmony_ci}
47e0dac50fSopenharmony_ci
48e0dac50fSopenharmony_civoid WindowSplitTest::SetUp()
49e0dac50fSopenharmony_ci{
50e0dac50fSopenharmony_ci    fullInfo_ = {
51e0dac50fSopenharmony_ci        .name = "",
52e0dac50fSopenharmony_ci        .rect = Utils::customAppRect_,
53e0dac50fSopenharmony_ci        .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
54e0dac50fSopenharmony_ci        .mode = WindowMode::WINDOW_MODE_SPLIT_PRIMARY,
55e0dac50fSopenharmony_ci        .needAvoid = true,
56e0dac50fSopenharmony_ci        .parentLimit = false,
57e0dac50fSopenharmony_ci        .parentId = INVALID_WINDOW_ID,
58e0dac50fSopenharmony_ci    };
59e0dac50fSopenharmony_ci
60e0dac50fSopenharmony_ci    splitInfo_ = {
61e0dac50fSopenharmony_ci        .name = "",
62e0dac50fSopenharmony_ci        .rect = Utils::customAppRect_,
63e0dac50fSopenharmony_ci        .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
64e0dac50fSopenharmony_ci        .mode = WindowMode::WINDOW_MODE_FULLSCREEN,
65e0dac50fSopenharmony_ci        .needAvoid = true,
66e0dac50fSopenharmony_ci        .parentLimit = false,
67e0dac50fSopenharmony_ci        .parentId = INVALID_WINDOW_ID,
68e0dac50fSopenharmony_ci    };
69e0dac50fSopenharmony_ci
70e0dac50fSopenharmony_ci    activeWindows_.clear();
71e0dac50fSopenharmony_ci}
72e0dac50fSopenharmony_ci
73e0dac50fSopenharmony_civoid WindowSplitTest::TearDown()
74e0dac50fSopenharmony_ci{
75e0dac50fSopenharmony_ci    while (!activeWindows_.empty()) {
76e0dac50fSopenharmony_ci        ASSERT_EQ(WMError::WM_OK, activeWindows_.back()->Destroy());
77e0dac50fSopenharmony_ci        activeWindows_.pop_back();
78e0dac50fSopenharmony_ci    }
79e0dac50fSopenharmony_ci}
80e0dac50fSopenharmony_ci
81e0dac50fSopenharmony_cinamespace {
82e0dac50fSopenharmony_ci/**
83e0dac50fSopenharmony_ci * @tc.name: SplitWindow01
84e0dac50fSopenharmony_ci * @tc.desc: first create a secondary window, then create a primary window, test mode change
85e0dac50fSopenharmony_ci * @tc.type: FUNC
86e0dac50fSopenharmony_ci */
87e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitWindow01, Function | MediumTest | Level3)
88e0dac50fSopenharmony_ci{
89e0dac50fSopenharmony_ci    fullInfo_.name  = "fullscreen.1";
90e0dac50fSopenharmony_ci    fullInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN;
91e0dac50fSopenharmony_ci    splitInfo_.name = "primary.1";
92e0dac50fSopenharmony_ci    splitInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN;
93e0dac50fSopenharmony_ci
94e0dac50fSopenharmony_ci    const sptr<Window>& priWindow = Utils::CreateTestWindow(splitInfo_);
95e0dac50fSopenharmony_ci    if (priWindow == nullptr) {
96e0dac50fSopenharmony_ci        return;
97e0dac50fSopenharmony_ci    }
98e0dac50fSopenharmony_ci    activeWindows_.push_back(priWindow);
99e0dac50fSopenharmony_ci    priWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
100e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
101e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, priWindow->Show());
102e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
103e0dac50fSopenharmony_ci
104e0dac50fSopenharmony_ci    const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_);
105e0dac50fSopenharmony_ci    if (fullWindow == nullptr) {
106e0dac50fSopenharmony_ci        return;
107e0dac50fSopenharmony_ci    }
108e0dac50fSopenharmony_ci    activeWindows_.push_back(fullWindow);
109e0dac50fSopenharmony_ci    fullWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
110e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
111e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Show());
112e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
113e0dac50fSopenharmony_ci
114e0dac50fSopenharmony_ci
115e0dac50fSopenharmony_ci    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, priWindow->GetMode());
116e0dac50fSopenharmony_ci    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, fullWindow->GetMode());
117e0dac50fSopenharmony_ci
118e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, priWindow->Hide());
119e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
120e0dac50fSopenharmony_ci    ASSERT_EQ(WindowMode::WINDOW_MODE_FULLSCREEN, fullWindow->GetMode());
121e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Hide());
122e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
123e0dac50fSopenharmony_ci}
124e0dac50fSopenharmony_ci
125e0dac50fSopenharmony_ci/**
126e0dac50fSopenharmony_ci * @tc.name: SplitWindow02
127e0dac50fSopenharmony_ci * @tc.desc: first create a primary window, then create a secondary window, test mode change
128e0dac50fSopenharmony_ci * @tc.type: FUNC
129e0dac50fSopenharmony_ci */
130e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitWindow02, Function | MediumTest | Level3)
131e0dac50fSopenharmony_ci{
132e0dac50fSopenharmony_ci    fullInfo_.name  = "fullscreen.2";
133e0dac50fSopenharmony_ci    fullInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN;
134e0dac50fSopenharmony_ci    splitInfo_.name = "secondary.2";
135e0dac50fSopenharmony_ci    splitInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN;
136e0dac50fSopenharmony_ci
137e0dac50fSopenharmony_ci    const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_);
138e0dac50fSopenharmony_ci    if (fullWindow == nullptr) {
139e0dac50fSopenharmony_ci        return;
140e0dac50fSopenharmony_ci    }
141e0dac50fSopenharmony_ci    activeWindows_.push_back(fullWindow);
142e0dac50fSopenharmony_ci    fullWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY);
143e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
144e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Show());
145e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
146e0dac50fSopenharmony_ci
147e0dac50fSopenharmony_ci    const sptr<Window>& secWindow = Utils::CreateTestWindow(splitInfo_);
148e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, secWindow);
149e0dac50fSopenharmony_ci    activeWindows_.push_back(secWindow);
150e0dac50fSopenharmony_ci    secWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY);
151e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
152e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, secWindow->Show());
153e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
154e0dac50fSopenharmony_ci
155e0dac50fSopenharmony_ci
156e0dac50fSopenharmony_ci    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, secWindow->GetMode());
157e0dac50fSopenharmony_ci    ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, fullWindow->GetMode());
158e0dac50fSopenharmony_ci
159e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Hide());
160e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
161e0dac50fSopenharmony_ci    ASSERT_EQ(WindowMode::WINDOW_MODE_FULLSCREEN, secWindow->GetMode());
162e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, secWindow->Hide());
163e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
164e0dac50fSopenharmony_ci}
165e0dac50fSopenharmony_ci
166e0dac50fSopenharmony_ci/**
167e0dac50fSopenharmony_ci * @tc.name: SplitScreen03
168e0dac50fSopenharmony_ci * @tc.desc: first create a secondary window, then create a primary window, test rects
169e0dac50fSopenharmony_ci * @tc.type: FUNC
170e0dac50fSopenharmony_ci */
171e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitScreen03, Function | MediumTest | Level3)
172e0dac50fSopenharmony_ci{
173e0dac50fSopenharmony_ci    fullInfo_.name  = "fullscreen.3";
174e0dac50fSopenharmony_ci    fullInfo_.mode = WindowMode::WINDOW_MODE_SPLIT_SECONDARY;
175e0dac50fSopenharmony_ci    splitInfo_.name = "primary.3";
176e0dac50fSopenharmony_ci    splitInfo_.mode = WindowMode::WINDOW_MODE_SPLIT_PRIMARY;
177e0dac50fSopenharmony_ci
178e0dac50fSopenharmony_ci    const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_);
179e0dac50fSopenharmony_ci    if (fullWindow == nullptr) {
180e0dac50fSopenharmony_ci        return;
181e0dac50fSopenharmony_ci    }
182e0dac50fSopenharmony_ci    activeWindows_.push_back(fullWindow);
183e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Show());
184e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
185e0dac50fSopenharmony_ci    const sptr<Window>& priWindow = Utils::CreateTestWindow(splitInfo_);
186e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, priWindow);
187e0dac50fSopenharmony_ci    activeWindows_.push_back(priWindow);
188e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, priWindow->Show());
189e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
190e0dac50fSopenharmony_ci
191e0dac50fSopenharmony_ci    Utils::InitSplitRects();
192e0dac50fSopenharmony_ci    Utils::UpdateSplitRects(fullWindow);
193e0dac50fSopenharmony_ci
194e0dac50fSopenharmony_ci    ASSERT_TRUE(Utils::RectEqualTo(fullWindow, Utils::splitRects_.secondaryRect));
195e0dac50fSopenharmony_ci    ASSERT_TRUE(Utils::RectEqualTo(priWindow, Utils::splitRects_.primaryRect));
196e0dac50fSopenharmony_ci
197e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Hide());
198e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
199e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, priWindow->Hide());
200e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
201e0dac50fSopenharmony_ci}
202e0dac50fSopenharmony_ci
203e0dac50fSopenharmony_ci/**
204e0dac50fSopenharmony_ci * @tc.name: SplitScreen04
205e0dac50fSopenharmony_ci * @tc.desc: first create a primary window, then create a secondary window, test rects
206e0dac50fSopenharmony_ci * @tc.type: FUNC
207e0dac50fSopenharmony_ci */
208e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitScreen04, Function | MediumTest | Level3)
209e0dac50fSopenharmony_ci{
210e0dac50fSopenharmony_ci    fullInfo_.name  = "fullscreen.4";
211e0dac50fSopenharmony_ci    splitInfo_.name = "secondary.4";
212e0dac50fSopenharmony_ci    splitInfo_.mode = WindowMode::WINDOW_MODE_SPLIT_SECONDARY;
213e0dac50fSopenharmony_ci
214e0dac50fSopenharmony_ci    const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_);
215e0dac50fSopenharmony_ci    if (fullWindow == nullptr) {
216e0dac50fSopenharmony_ci        return;
217e0dac50fSopenharmony_ci    }
218e0dac50fSopenharmony_ci
219e0dac50fSopenharmony_ci    activeWindows_.push_back(fullWindow);
220e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Show());
221e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
222e0dac50fSopenharmony_ci    const sptr<Window>& secWindow = Utils::CreateTestWindow(splitInfo_);
223e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, secWindow);
224e0dac50fSopenharmony_ci    activeWindows_.push_back(secWindow);
225e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, secWindow->Show());
226e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
227e0dac50fSopenharmony_ci
228e0dac50fSopenharmony_ci    Utils::InitSplitRects();
229e0dac50fSopenharmony_ci    Utils::UpdateSplitRects(fullWindow);
230e0dac50fSopenharmony_ci
231e0dac50fSopenharmony_ci    ASSERT_TRUE(Utils::RectEqualTo(fullWindow, Utils::splitRects_.primaryRect));
232e0dac50fSopenharmony_ci    ASSERT_TRUE(Utils::RectEqualTo(secWindow, Utils::splitRects_.secondaryRect));
233e0dac50fSopenharmony_ci
234e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, fullWindow->Hide());
235e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
236e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, secWindow->Hide());
237e0dac50fSopenharmony_ci    sleep(SPLIT_TEST_SLEEP_S);
238e0dac50fSopenharmony_ci}
239e0dac50fSopenharmony_ci}
240e0dac50fSopenharmony_ci} // namespace Rosen
241e0dac50fSopenharmony_ci} // namespace OHOS
242