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