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
23 using namespace testing;
24 using namespace testing::ext;
25
26 namespace OHOS {
27 namespace Rosen {
28 class WindowDialogWindowTest : public testing::Test {
29 public:
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
SetUpTestCase()38 void WindowDialogWindowTest::SetUpTestCase()
39 {
40 }
41
TearDownTestCase()42 void WindowDialogWindowTest::TearDownTestCase()
43 {
44 }
45
SetUp()46 void WindowDialogWindowTest::SetUp()
47 {
48 }
49
TearDown()50 void WindowDialogWindowTest::TearDown()
51 {
52 }
53
CreateWindowScene()54 static 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
CreateDialogWindow(sptr<WindowScene> scene,WindowType type,Rect rect,std::string name="")64 static 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 */
85 HWTEST_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 */
112 HWTEST_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 */
142 HWTEST_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 */
174 HWTEST_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 */
209 HWTEST_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 */
236 HWTEST_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 */
266 HWTEST_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