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#include <gtest/gtest.h>
16e0dac50fSopenharmony_ci#include "ability_context_impl.h"
17e0dac50fSopenharmony_ci#include "window.h"
18e0dac50fSopenharmony_ci#include "window_manager.h"
19e0dac50fSopenharmony_ci#include "window_option.h"
20e0dac50fSopenharmony_ci#include "window_scene.h"
21e0dac50fSopenharmony_ci#include "wm_common.h"
22e0dac50fSopenharmony_ci
23e0dac50fSopenharmony_ciusing namespace testing;
24e0dac50fSopenharmony_ciusing namespace testing::ext;
25e0dac50fSopenharmony_ci
26e0dac50fSopenharmony_cinamespace OHOS {
27e0dac50fSopenharmony_cinamespace Rosen {
28e0dac50fSopenharmony_ciclass WindowDialogWindowTest : public testing::Test {
29e0dac50fSopenharmony_cipublic:
30e0dac50fSopenharmony_ci    static void SetUpTestCase();
31e0dac50fSopenharmony_ci    static void TearDownTestCase();
32e0dac50fSopenharmony_ci    virtual void SetUp() override;
33e0dac50fSopenharmony_ci    virtual void TearDown() override;
34e0dac50fSopenharmony_ci
35e0dac50fSopenharmony_ci    static inline std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext_ = nullptr;
36e0dac50fSopenharmony_ci};
37e0dac50fSopenharmony_ci
38e0dac50fSopenharmony_civoid WindowDialogWindowTest::SetUpTestCase()
39e0dac50fSopenharmony_ci{
40e0dac50fSopenharmony_ci}
41e0dac50fSopenharmony_ci
42e0dac50fSopenharmony_civoid WindowDialogWindowTest::TearDownTestCase()
43e0dac50fSopenharmony_ci{
44e0dac50fSopenharmony_ci}
45e0dac50fSopenharmony_ci
46e0dac50fSopenharmony_civoid WindowDialogWindowTest::SetUp()
47e0dac50fSopenharmony_ci{
48e0dac50fSopenharmony_ci}
49e0dac50fSopenharmony_ci
50e0dac50fSopenharmony_civoid WindowDialogWindowTest::TearDown()
51e0dac50fSopenharmony_ci{
52e0dac50fSopenharmony_ci}
53e0dac50fSopenharmony_ci
54e0dac50fSopenharmony_cistatic sptr<WindowScene> CreateWindowScene()
55e0dac50fSopenharmony_ci{
56e0dac50fSopenharmony_ci    sptr<IWindowLifeCycle> listener = nullptr;
57e0dac50fSopenharmony_ci    WindowDialogWindowTest::abilityContext_ = std::make_shared<AbilityRuntime::AbilityContextImpl>();
58e0dac50fSopenharmony_ci
59e0dac50fSopenharmony_ci    sptr<WindowScene> scene = new WindowScene();
60e0dac50fSopenharmony_ci    scene->Init(0, WindowDialogWindowTest::abilityContext_, listener);
61e0dac50fSopenharmony_ci    return scene;
62e0dac50fSopenharmony_ci}
63e0dac50fSopenharmony_ci
64e0dac50fSopenharmony_cistatic sptr<Window> CreateDialogWindow(sptr<WindowScene> scene, WindowType type, Rect rect, std::string name = "")
65e0dac50fSopenharmony_ci{
66e0dac50fSopenharmony_ci    sptr<WindowOption> option = new WindowOption();
67e0dac50fSopenharmony_ci    option->SetWindowType(type);
68e0dac50fSopenharmony_ci    option->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
69e0dac50fSopenharmony_ci    option->SetWindowRect(rect);
70e0dac50fSopenharmony_ci
71e0dac50fSopenharmony_ci    static int cnt = 0;
72e0dac50fSopenharmony_ci    std::string winName = (name == "") ? "DialogWindowTest" + std::to_string(cnt++) : name;
73e0dac50fSopenharmony_ci    if (scene->GetMainWindow() == nullptr) {
74e0dac50fSopenharmony_ci        return nullptr;
75e0dac50fSopenharmony_ci    }
76e0dac50fSopenharmony_ci    return Window::Create(winName, option, scene->GetMainWindow()->GetContext());
77e0dac50fSopenharmony_ci}
78e0dac50fSopenharmony_ci
79e0dac50fSopenharmony_ci/**
80e0dac50fSopenharmony_ci * @tc.name: dialogWindow01
81e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + Floating dialogWindow
82e0dac50fSopenharmony_ci * @tc.type: FUNC
83e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
84e0dac50fSopenharmony_ci */
85e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow01, Function | MediumTest | Level2)
86e0dac50fSopenharmony_ci{
87e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
88e0dac50fSopenharmony_ci
89e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
90e0dac50fSopenharmony_ci    sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
91e0dac50fSopenharmony_ci    if (dialogWindow == nullptr) {
92e0dac50fSopenharmony_ci        return;
93e0dac50fSopenharmony_ci    }
94e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow);
95e0dac50fSopenharmony_ci
96e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
97e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
98e0dac50fSopenharmony_ci
99e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Hide());
100e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
101e0dac50fSopenharmony_ci
102e0dac50fSopenharmony_ci    dialogWindow->Destroy();
103e0dac50fSopenharmony_ci    scene->GoDestroy();
104e0dac50fSopenharmony_ci}
105e0dac50fSopenharmony_ci
106e0dac50fSopenharmony_ci/**
107e0dac50fSopenharmony_ci * @tc.name: dialogWindow02
108e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 2 dialogWindow
109e0dac50fSopenharmony_ci * @tc.type: FUNC
110e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
111e0dac50fSopenharmony_ci */
112e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow02, Function | MediumTest | Level2)
113e0dac50fSopenharmony_ci{
114e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
115e0dac50fSopenharmony_ci
116e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
117e0dac50fSopenharmony_ci    sptr<Window> dialogWindow0 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
118e0dac50fSopenharmony_ci    if (dialogWindow0 == nullptr) {
119e0dac50fSopenharmony_ci        return;
120e0dac50fSopenharmony_ci    }
121e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow0);
122e0dac50fSopenharmony_ci
123e0dac50fSopenharmony_ci    sptr<Window> dialogWindow1 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
124e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow1);
125e0dac50fSopenharmony_ci
126e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
127e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow0->Show());
128e0dac50fSopenharmony_ci
129e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow0->Hide());
130e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
131e0dac50fSopenharmony_ci
132e0dac50fSopenharmony_ci    dialogWindow0->Destroy();
133e0dac50fSopenharmony_ci    scene->GoDestroy();
134e0dac50fSopenharmony_ci}
135e0dac50fSopenharmony_ci
136e0dac50fSopenharmony_ci/**
137e0dac50fSopenharmony_ci * @tc.name: dialogWindow03
138e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 2 dialogWindow with the same name
139e0dac50fSopenharmony_ci * @tc.type: FUNC
140e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
141e0dac50fSopenharmony_ci */
142e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow03, Function | MediumTest | Level2)
143e0dac50fSopenharmony_ci{
144e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
145e0dac50fSopenharmony_ci
146e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
147e0dac50fSopenharmony_ci    sptr<Window> dialogWindow0 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
148e0dac50fSopenharmony_ci    sptr<Window> dialogWindow1 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
149e0dac50fSopenharmony_ci    if (dialogWindow0 == nullptr) {
150e0dac50fSopenharmony_ci        return;
151e0dac50fSopenharmony_ci    }
152e0dac50fSopenharmony_ci    if (dialogWindow1 == nullptr) {
153e0dac50fSopenharmony_ci        return;
154e0dac50fSopenharmony_ci    }
155e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow0);
156e0dac50fSopenharmony_ci    ASSERT_EQ(nullptr, dialogWindow1);
157e0dac50fSopenharmony_ci
158e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
159e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow0->Show());
160e0dac50fSopenharmony_ci
161e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow0->Hide());
162e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
163e0dac50fSopenharmony_ci
164e0dac50fSopenharmony_ci    dialogWindow0->Destroy();
165e0dac50fSopenharmony_ci    scene->GoDestroy();
166e0dac50fSopenharmony_ci}
167e0dac50fSopenharmony_ci
168e0dac50fSopenharmony_ci/**
169e0dac50fSopenharmony_ci * @tc.name: dialogWindow04
170e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + 2 dialogWindow with the same name but one create after another destroyed
171e0dac50fSopenharmony_ci * @tc.type: FUNC
172e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
173e0dac50fSopenharmony_ci */
174e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow04, Function | MediumTest | Level2)
175e0dac50fSopenharmony_ci{
176e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
177e0dac50fSopenharmony_ci    if (scene->GoForeground() == WMError::WM_OK) {
178e0dac50fSopenharmony_ci        ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
179e0dac50fSopenharmony_ci    }
180e0dac50fSopenharmony_ci
181e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
182e0dac50fSopenharmony_ci    sptr<Window> dialogWindow0 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
183e0dac50fSopenharmony_ci    if (dialogWindow0 == nullptr) {
184e0dac50fSopenharmony_ci        return;
185e0dac50fSopenharmony_ci    }
186e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow0);
187e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow0->Show());
188e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow0->Destroy());
189e0dac50fSopenharmony_ci
190e0dac50fSopenharmony_ci
191e0dac50fSopenharmony_ci    sptr<Window> dialogWindow1 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
192e0dac50fSopenharmony_ci    if (dialogWindow1 == nullptr) {
193e0dac50fSopenharmony_ci        return;
194e0dac50fSopenharmony_ci    }
195e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow1);
196e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow1->Show());
197e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow1->Destroy());
198e0dac50fSopenharmony_ci
199e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
200e0dac50fSopenharmony_ci    scene->GoDestroy();
201e0dac50fSopenharmony_ci}
202e0dac50fSopenharmony_ci
203e0dac50fSopenharmony_ci/**
204e0dac50fSopenharmony_ci * @tc.name: dialogWindow05
205e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + dialogWindow & MainWindow First GoBackground
206e0dac50fSopenharmony_ci * @tc.type: FUNC
207e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
208e0dac50fSopenharmony_ci */
209e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow05, Function | MediumTest | Level2)
210e0dac50fSopenharmony_ci{
211e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
212e0dac50fSopenharmony_ci
213e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
214e0dac50fSopenharmony_ci    sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
215e0dac50fSopenharmony_ci    if (dialogWindow == nullptr) {
216e0dac50fSopenharmony_ci        return;
217e0dac50fSopenharmony_ci    }
218e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow);
219e0dac50fSopenharmony_ci
220e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
221e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
222e0dac50fSopenharmony_ci
223e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
224e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Hide());
225e0dac50fSopenharmony_ci
226e0dac50fSopenharmony_ci    dialogWindow->Destroy();
227e0dac50fSopenharmony_ci    scene->GoDestroy();
228e0dac50fSopenharmony_ci}
229e0dac50fSopenharmony_ci
230e0dac50fSopenharmony_ci/**
231e0dac50fSopenharmony_ci * @tc.name: dialogWindow06
232e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + dialogWindow & first destroy dialogWindow, then destroy MainWindow
233e0dac50fSopenharmony_ci * @tc.type: FUNC
234e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
235e0dac50fSopenharmony_ci */
236e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow06, Function | MediumTest | Level2)
237e0dac50fSopenharmony_ci{
238e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
239e0dac50fSopenharmony_ci
240e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
241e0dac50fSopenharmony_ci    sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
242e0dac50fSopenharmony_ci    if (dialogWindow == nullptr) {
243e0dac50fSopenharmony_ci        return;
244e0dac50fSopenharmony_ci    }
245e0dac50fSopenharmony_ci
246e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow);
247e0dac50fSopenharmony_ci
248e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
249e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
250e0dac50fSopenharmony_ci
251e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Hide());
252e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
253e0dac50fSopenharmony_ci
254e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Destroy());
255e0dac50fSopenharmony_ci
256e0dac50fSopenharmony_ci    dialogWindow->Destroy();
257e0dac50fSopenharmony_ci    scene->GoDestroy();
258e0dac50fSopenharmony_ci}
259e0dac50fSopenharmony_ci
260e0dac50fSopenharmony_ci/**
261e0dac50fSopenharmony_ci * @tc.name: dialogWindow07
262e0dac50fSopenharmony_ci * @tc.desc: FullScreen Main Window + dialogWindow & first destroy MainWindow, then destroy dialogWindow
263e0dac50fSopenharmony_ci * @tc.type: FUNC
264e0dac50fSopenharmony_ci * @tc.require: issueI5GKWZ
265e0dac50fSopenharmony_ci */
266e0dac50fSopenharmony_ciHWTEST_F(WindowDialogWindowTest, DialogWindow07, Function | MediumTest | Level2)
267e0dac50fSopenharmony_ci{
268e0dac50fSopenharmony_ci    sptr<WindowScene> scene = CreateWindowScene();
269e0dac50fSopenharmony_ci
270e0dac50fSopenharmony_ci    struct Rect rect = {0, 0, 100, 200};
271e0dac50fSopenharmony_ci    sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
272e0dac50fSopenharmony_ci    if (dialogWindow == nullptr) {
273e0dac50fSopenharmony_ci        return;
274e0dac50fSopenharmony_ci    }
275e0dac50fSopenharmony_ci    ASSERT_NE(nullptr, dialogWindow);
276e0dac50fSopenharmony_ci
277e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
278e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
279e0dac50fSopenharmony_ci
280e0dac50fSopenharmony_ci    sptr<Window> mainWindow = scene->GetMainWindow();
281e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, mainWindow->Destroy());
282e0dac50fSopenharmony_ci    ASSERT_EQ(WMError::WM_OK, dialogWindow->Destroy());
283e0dac50fSopenharmony_ci
284e0dac50fSopenharmony_ci    scene->GoDestroy();
285e0dac50fSopenharmony_ci}
286e0dac50fSopenharmony_ci} // namespace Rosen
287e0dac50fSopenharmony_ci} // namespace OHOS
288