1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2021-2022 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 <ability_context.h>
19e0dac50fSopenharmony_ci#include "window.h"
20e0dac50fSopenharmony_ci#include "window_option.h"
21e0dac50fSopenharmony_ci#include "window_scene.h"
22e0dac50fSopenharmony_ci#include "wm_common.h"
23e0dac50fSopenharmony_ci
24e0dac50fSopenharmony_ciusing namespace testing;
25e0dac50fSopenharmony_ciusing namespace testing::ext;
26e0dac50fSopenharmony_ci
27e0dac50fSopenharmony_cinamespace OHOS {
28e0dac50fSopenharmony_cinamespace Rosen {
29e0dac50fSopenharmony_ciclass WindowSubWindowTest : public testing::Test {
30e0dac50fSopenharmony_cipublic:
31e0dac50fSopenharmony_ci    static void SetUpTestCase();
32e0dac50fSopenharmony_ci    static void TearDownTestCase();
33e0dac50fSopenharmony_ci    virtual void SetUp() override;
34e0dac50fSopenharmony_ci    virtual void TearDown() override;
35e0dac50fSopenharmony_ci};
36e0dac50fSopenharmony_ci
37e0dac50fSopenharmony_civoid WindowSubWindowTest::SetUpTestCase()
38e0dac50fSopenharmony_ci{
39e0dac50fSopenharmony_ci}
40e0dac50fSopenharmony_ci
41e0dac50fSopenharmony_civoid WindowSubWindowTest::TearDownTestCase()
42e0dac50fSopenharmony_ci{
43e0dac50fSopenharmony_ci}
44e0dac50fSopenharmony_ci
45e0dac50fSopenharmony_civoid WindowSubWindowTest::SetUp()
46e0dac50fSopenharmony_ci{
47e0dac50fSopenharmony_ci}
48e0dac50fSopenharmony_ci
49e0dac50fSopenharmony_civoid WindowSubWindowTest::TearDown()
50e0dac50fSopenharmony_ci{
51e0dac50fSopenharmony_ci}
52e0dac50fSopenharmony_ci
53e0dac50fSopenharmony_cistatic sptr<WindowScene> CreateWindowScene()
54e0dac50fSopenharmony_ci{
55e0dac50fSopenharmony_ci    sptr<IWindowLifeCycle> listener = nullptr;
56e0dac50fSopenharmony_ci    std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext = nullptr;
57e0dac50fSopenharmony_ci
58e0dac50fSopenharmony_ci    sptr<WindowScene> scene = new WindowScene();
59e0dac50fSopenharmony_ci    scene->Init(0, abilityContext, listener);
60e0dac50fSopenharmony_ci    return scene;
61e0dac50fSopenharmony_ci}
62e0dac50fSopenharmony_ci
63e0dac50fSopenharmony_cistatic sptr<Window> CreateSubWindow(sptr<WindowScene> scene, WindowType type,
64e0dac50fSopenharmony_ci    struct Rect rect, uint32_t flags, std::string name = "")
65e0dac50fSopenharmony_ci{
66e0dac50fSopenharmony_ci    sptr<WindowOption> subOp = new WindowOption();
67e0dac50fSopenharmony_ci    subOp->SetWindowType(type);
68e0dac50fSopenharmony_ci    subOp->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
69e0dac50fSopenharmony_ci    subOp->SetWindowRect(rect);
70e0dac50fSopenharmony_ci    subOp->SetWindowFlags(flags);
71e0dac50fSopenharmony_ci
72e0dac50fSopenharmony_ci    static int cnt = 0;
73e0dac50fSopenharmony_ci    std::string subWinName = (name == "") ? "SubWindow" + std::to_string(cnt++) : name;
74e0dac50fSopenharmony_ci
75e0dac50fSopenharmony_ci    return scene->CreateWindow(subWinName, subOp);
76e0dac50fSopenharmony_ci}
77e0dac50fSopenharmony_ci
78e0dac50fSopenharmony_ci/**
79e0dac50fSopenharmony_ci * @tc.name: SubWindow01
80e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating SubWindow
81e0dac50fSopenharmony_ci * @tc.type: FUNC
82e0dac50fSopenharmony_ci */
83e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow01, Function | MediumTest | Level2)
84e0dac50fSopenharmony_ci{
85e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
86e0dac50fSopenharmony_ci
87e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
88e0dac50fSopenharmony_ci    uint32_t flags = 0;
89e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
90e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
91e0dac50fSopenharmony_ci        return;
92e0dac50fSopenharmony_ci    }
93e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
94e0dac50fSopenharmony_ci
95e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
96e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
97e0dac50fSopenharmony_ci
98e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
99e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
100e0dac50fSopenharmony_ci    sleep(1);
101e0dac50fSopenharmony_ci
102e0dac50fSopenharmony_ci    subWindow->Destroy();
103e0dac50fSopenharmony_ci    scene->GoDestroy();
104e0dac50fSopenharmony_ci}
105e0dac50fSopenharmony_ci
106e0dac50fSopenharmony_ci/**
107e0dac50fSopenharmony_ci * @tc.name: SubWindow02
108e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating SubWindow & Parent Limit work
109e0dac50fSopenharmony_ci * @tc.type: FUNC
110e0dac50fSopenharmony_ci */
111e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow02, Function | MediumTest | Level2)
112e0dac50fSopenharmony_ci{
113e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
114e0dac50fSopenharmony_ci
115e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
116e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
117e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
118e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
119e0dac50fSopenharmony_ci        return;
120e0dac50fSopenharmony_ci    }
121e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
122e0dac50fSopenharmony_ci
123e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
124e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
125e0dac50fSopenharmony_ci
126e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
127e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
128e0dac50fSopenharmony_ci    sleep(1);
129e0dac50fSopenharmony_ci
130e0dac50fSopenharmony_ci    subWindow->Destroy();
131e0dac50fSopenharmony_ci    scene->GoDestroy();
132e0dac50fSopenharmony_ci}
133e0dac50fSopenharmony_ci
134e0dac50fSopenharmony_ci/**
135e0dac50fSopenharmony_ci * @tc.name: SubWindow03
136e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating MediaWindow
137e0dac50fSopenharmony_ci * @tc.type: FUNC
138e0dac50fSopenharmony_ci */
139e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow03, Function | MediumTest | Level2)
140e0dac50fSopenharmony_ci{
141e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
142e0dac50fSopenharmony_ci
143e0dac50fSopenharmony_ci    struct Rect rect = {0, 2000, 100, 200};
144e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
145e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_MEDIA, rect, flags);
146e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
147e0dac50fSopenharmony_ci        return;
148e0dac50fSopenharmony_ci    }
149e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
150e0dac50fSopenharmony_ci
151e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
152e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
153e0dac50fSopenharmony_ci
154e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
155e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
156e0dac50fSopenharmony_ci    sleep(1);
157e0dac50fSopenharmony_ci
158e0dac50fSopenharmony_ci    subWindow->Destroy();
159e0dac50fSopenharmony_ci    scene->GoDestroy();
160e0dac50fSopenharmony_ci}
161e0dac50fSopenharmony_ci
162e0dac50fSopenharmony_ci/**
163e0dac50fSopenharmony_ci * @tc.name: SubWindow04
164e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating MediaWindow
165e0dac50fSopenharmony_ci * @tc.type: FUNC
166e0dac50fSopenharmony_ci */
167e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow04, Function | MediumTest | Level2)
168e0dac50fSopenharmony_ci{
169e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
170e0dac50fSopenharmony_ci
171e0dac50fSopenharmony_ci    struct Rect rect = {0, 2000, 3000, 2000};
172e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
173e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_MEDIA, rect, flags);
174e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
175e0dac50fSopenharmony_ci        return;
176e0dac50fSopenharmony_ci    }
177e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
178e0dac50fSopenharmony_ci
179e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
180e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
181e0dac50fSopenharmony_ci
182e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
183e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
184e0dac50fSopenharmony_ci    sleep(1);
185e0dac50fSopenharmony_ci
186e0dac50fSopenharmony_ci    subWindow->Destroy();
187e0dac50fSopenharmony_ci    scene->GoDestroy();
188e0dac50fSopenharmony_ci}
189e0dac50fSopenharmony_ci
190e0dac50fSopenharmony_ci/**
191e0dac50fSopenharmony_ci * @tc.name: SubWindow05
192e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating MediaWindow + Floating SubWindow
193e0dac50fSopenharmony_ci * @tc.type: FUNC
194e0dac50fSopenharmony_ci */
195e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow05, Function | MediumTest | Level3)
196e0dac50fSopenharmony_ci{
197e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
198e0dac50fSopenharmony_ci
199e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
200e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
201e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_MEDIA, rect, flags);
202e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
203e0dac50fSopenharmony_ci        return;
204e0dac50fSopenharmony_ci    }
205e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
206e0dac50fSopenharmony_ci
207e0dac50fSopenharmony_ci    sptr<Window> subWindow2 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
208e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow2);
209e0dac50fSopenharmony_ci
210e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
211e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
212e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow2->Show());
213e0dac50fSopenharmony_ci
214e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
215e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow2->Hide());
216e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
217e0dac50fSopenharmony_ci    sleep(1);
218e0dac50fSopenharmony_ci
219e0dac50fSopenharmony_ci    subWindow->Destroy();
220e0dac50fSopenharmony_ci    subWindow2->Destroy();
221e0dac50fSopenharmony_ci    scene->GoDestroy();
222e0dac50fSopenharmony_ci}
223e0dac50fSopenharmony_ci
224e0dac50fSopenharmony_ci/**
225e0dac50fSopenharmony_ci * @tc.name: SubWindow06
226e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 2 SubWindows
227e0dac50fSopenharmony_ci * @tc.type: FUNC
228e0dac50fSopenharmony_ci */
229e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow06, Function | MediumTest | Level3)
230e0dac50fSopenharmony_ci{
231e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
232e0dac50fSopenharmony_ci
233e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
234e0dac50fSopenharmony_ci    sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
235e0dac50fSopenharmony_ci    if (subWindow0 == nullptr) {
236e0dac50fSopenharmony_ci        return;
237e0dac50fSopenharmony_ci    }
238e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow0);
239e0dac50fSopenharmony_ci
240e0dac50fSopenharmony_ci    sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
241e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow1);
242e0dac50fSopenharmony_ci
243e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
244e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
245e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow1->Show());
246e0dac50fSopenharmony_ci
247e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Hide());
248e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow1->Hide());
249e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
250e0dac50fSopenharmony_ci    sleep(1);
251e0dac50fSopenharmony_ci
252e0dac50fSopenharmony_ci    subWindow0->Destroy();
253e0dac50fSopenharmony_ci    subWindow1->Destroy();
254e0dac50fSopenharmony_ci    scene->GoDestroy();
255e0dac50fSopenharmony_ci}
256e0dac50fSopenharmony_ci
257e0dac50fSopenharmony_ci/**
258e0dac50fSopenharmony_ci * @tc.name: SubWindow07
259e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating SubWindow & MainWindow First GoBackground
260e0dac50fSopenharmony_ci * @tc.type: FUNC
261e0dac50fSopenharmony_ci */
262e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow07, Function | MediumTest | Level4)
263e0dac50fSopenharmony_ci{
264e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
265e0dac50fSopenharmony_ci
266e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
267e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
268e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
269e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
270e0dac50fSopenharmony_ci        return;
271e0dac50fSopenharmony_ci    }
272e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
273e0dac50fSopenharmony_ci
274e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
275e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
276e0dac50fSopenharmony_ci
277e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
278e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
279e0dac50fSopenharmony_ci    sleep(1);
280e0dac50fSopenharmony_ci
281e0dac50fSopenharmony_ci    subWindow->Destroy();
282e0dac50fSopenharmony_ci    scene->GoDestroy();
283e0dac50fSopenharmony_ci}
284e0dac50fSopenharmony_ci
285e0dac50fSopenharmony_ci/**
286e0dac50fSopenharmony_ci * @tc.name: SubWindow08
287e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating SubWindow & only show SubWindow
288e0dac50fSopenharmony_ci * @tc.type: FUNC
289e0dac50fSopenharmony_ci */
290e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow08, Function | MediumTest | Level4)
291e0dac50fSopenharmony_ci{
292e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
293e0dac50fSopenharmony_ci
294e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
295e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
296e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
297e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
298e0dac50fSopenharmony_ci        return;
299e0dac50fSopenharmony_ci    }
300e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
301e0dac50fSopenharmony_ci
302e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, subWindow->Show());
303e0dac50fSopenharmony_ci}
304e0dac50fSopenharmony_ci
305e0dac50fSopenharmony_ci/**
306e0dac50fSopenharmony_ci * @tc.name: SubWindow09
307e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating SubWindow & first destroy SubWindow, then destroy MainWindow
308e0dac50fSopenharmony_ci * @tc.type: FUNC
309e0dac50fSopenharmony_ci */
310e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow09, Function | MediumTest | Level2)
311e0dac50fSopenharmony_ci{
312e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
313e0dac50fSopenharmony_ci
314e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
315e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
316e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
317e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
318e0dac50fSopenharmony_ci        return;
319e0dac50fSopenharmony_ci    }
320e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
321e0dac50fSopenharmony_ci
322e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
323e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
324e0dac50fSopenharmony_ci
325e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
326e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
327e0dac50fSopenharmony_ci    sleep(1);
328e0dac50fSopenharmony_ci
329e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Destroy());
330e0dac50fSopenharmony_ci
331e0dac50fSopenharmony_ci    subWindow->Destroy();
332e0dac50fSopenharmony_ci    scene->GoDestroy();
333e0dac50fSopenharmony_ci}
334e0dac50fSopenharmony_ci
335e0dac50fSopenharmony_ci/**
336e0dac50fSopenharmony_ci * @tc.name: SubWindow10
337e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating SubWindow & first destroy MainWindow, then destroy SubWindow
338e0dac50fSopenharmony_ci * @tc.type: FUNC
339e0dac50fSopenharmony_ci */
340e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow10, Function | MediumTest | Level2)
341e0dac50fSopenharmony_ci{
342e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
343e0dac50fSopenharmony_ci
344e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
345e0dac50fSopenharmony_ci    uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
346e0dac50fSopenharmony_ci    sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
347e0dac50fSopenharmony_ci    if (subWindow == nullptr) {
348e0dac50fSopenharmony_ci        return;
349e0dac50fSopenharmony_ci    }
350e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow);
351e0dac50fSopenharmony_ci
352e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
353e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Show());
354e0dac50fSopenharmony_ci    sleep(1);
355e0dac50fSopenharmony_ci
356e0dac50fSopenharmony_ci    sptr<Window> mainWindow = scene->GetMainWindow();
357e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, mainWindow->Destroy());
358e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow->Destroy());
359e0dac50fSopenharmony_ci
360e0dac50fSopenharmony_ci    scene->GoDestroy();
361e0dac50fSopenharmony_ci}
362e0dac50fSopenharmony_ci
363e0dac50fSopenharmony_ci/**
364e0dac50fSopenharmony_ci * @tc.name: SubWindow11
365e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 5 subWindows
366e0dac50fSopenharmony_ci * @tc.type: FUNC
367e0dac50fSopenharmony_ci */
368e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow11, Function | MediumTest | Level3)
369e0dac50fSopenharmony_ci{
370e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
371e0dac50fSopenharmony_ci
372e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
373e0dac50fSopenharmony_ci    sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
374e0dac50fSopenharmony_ci    if (subWindow0 == nullptr) {
375e0dac50fSopenharmony_ci        return;
376e0dac50fSopenharmony_ci    }
377e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow0);
378e0dac50fSopenharmony_ci
379e0dac50fSopenharmony_ci    sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
380e0dac50fSopenharmony_ci    if (subWindow1 == nullptr) {
381e0dac50fSopenharmony_ci        return;
382e0dac50fSopenharmony_ci    }
383e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow1);
384e0dac50fSopenharmony_ci
385e0dac50fSopenharmony_ci    sptr<Window> subWindow2 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
386e0dac50fSopenharmony_ci    if (subWindow2 == nullptr) {
387e0dac50fSopenharmony_ci        return;
388e0dac50fSopenharmony_ci    }
389e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow2);
390e0dac50fSopenharmony_ci
391e0dac50fSopenharmony_ci    sptr<Window> subWindow3 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
392e0dac50fSopenharmony_ci    if (subWindow3 == nullptr) {
393e0dac50fSopenharmony_ci        return;
394e0dac50fSopenharmony_ci    }
395e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow3);
396e0dac50fSopenharmony_ci
397e0dac50fSopenharmony_ci    sptr<Window> subWindow4 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
398e0dac50fSopenharmony_ci    if (subWindow4 == nullptr) {
399e0dac50fSopenharmony_ci        return;
400e0dac50fSopenharmony_ci    }
401e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow4);
402e0dac50fSopenharmony_ci    if (scene->GoForeground() == WMError::WM_OK) {
403e0dac50fSopenharmony_ci        ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
404e0dac50fSopenharmony_ci    }
405e0dac50fSopenharmony_ci
406e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
407e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow1->Show());
408e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow2->Show());
409e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow3->Show());
410e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow4->Show());
411e0dac50fSopenharmony_ci
412e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Hide());
413e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow1->Hide());
414e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow2->Hide());
415e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow3->Hide());
416e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow4->Hide());
417e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
418e0dac50fSopenharmony_ci    sleep(1);
419e0dac50fSopenharmony_ci
420e0dac50fSopenharmony_ci    subWindow0->Destroy();
421e0dac50fSopenharmony_ci    subWindow1->Destroy();
422e0dac50fSopenharmony_ci    subWindow2->Destroy();
423e0dac50fSopenharmony_ci    subWindow3->Destroy();
424e0dac50fSopenharmony_ci    subWindow4->Destroy();
425e0dac50fSopenharmony_ci    scene->GoDestroy();
426e0dac50fSopenharmony_ci}
427e0dac50fSopenharmony_ci
428e0dac50fSopenharmony_ci/**
429e0dac50fSopenharmony_ci * @tc.name: SubWindow12
430e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 2 SubWindows with the same name
431e0dac50fSopenharmony_ci * @tc.type: FUNC
432e0dac50fSopenharmony_ci */
433e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow12, Function | MediumTest | Level3)
434e0dac50fSopenharmony_ci{
435e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
436e0dac50fSopenharmony_ci
437e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
438e0dac50fSopenharmony_ci    sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub0");
439e0dac50fSopenharmony_ci    sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub0");
440e0dac50fSopenharmony_ci    if (subWindow0 == nullptr) {
441e0dac50fSopenharmony_ci        return;
442e0dac50fSopenharmony_ci    }
443e0dac50fSopenharmony_ci    if (subWindow1 == nullptr) {
444e0dac50fSopenharmony_ci        return;
445e0dac50fSopenharmony_ci    }
446e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow0);
447e0dac50fSopenharmony_ci    ASSERT_EQ(nullptr, subWindow1);
448e0dac50fSopenharmony_ci
449e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
450e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
451e0dac50fSopenharmony_ci
452e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Hide());
453e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
454e0dac50fSopenharmony_ci    sleep(1);
455e0dac50fSopenharmony_ci
456e0dac50fSopenharmony_ci    subWindow0->Destroy();
457e0dac50fSopenharmony_ci    scene->GoDestroy();
458e0dac50fSopenharmony_ci}
459e0dac50fSopenharmony_ci
460e0dac50fSopenharmony_ci/**
461e0dac50fSopenharmony_ci * @tc.name: SubWindow13
462e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 2 subwindows with the same name but one create after another destroyed
463e0dac50fSopenharmony_ci * @tc.type: FUNC
464e0dac50fSopenharmony_ci */
465e0dac50fSopenharmony_ciHWTEST_F(WindowSubWindowTest, SubWindow13, Function | MediumTest | Level3)
466e0dac50fSopenharmony_ci{
467e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
468e0dac50fSopenharmony_ci    if (scene->GoForeground() == WMError::WM_OK) {
469e0dac50fSopenharmony_ci        ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
470e0dac50fSopenharmony_ci    }
471e0dac50fSopenharmony_ci
472e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
473e0dac50fSopenharmony_ci    sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub1");
474e0dac50fSopenharmony_ci    if (subWindow0 == nullptr) {
475e0dac50fSopenharmony_ci        return;
476e0dac50fSopenharmony_ci    }
477e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow0);
478e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
479e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow0->Destroy());
480e0dac50fSopenharmony_ci
481e0dac50fSopenharmony_ci    sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub1");
482e0dac50fSopenharmony_ci    if (subWindow1 == nullptr) {
483e0dac50fSopenharmony_ci        return;
484e0dac50fSopenharmony_ci    }
485e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, subWindow1);
486e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow1->Show());
487e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, subWindow1->Destroy());
488e0dac50fSopenharmony_ci
489e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
490e0dac50fSopenharmony_ci    sleep(1);
491e0dac50fSopenharmony_ci    scene->GoDestroy();
492e0dac50fSopenharmony_ci}
493e0dac50fSopenharmony_ci} // namespace Rosen
494e0dac50fSopenharmony_ci} // namespace OHOS
495