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