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