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
74 return Window::Create(winName, option, scene->GetMainWindow()->GetContext());
75 }
76
77 /**
78 * @tc.name: dialogWindow01
79 * @tc.desc: FullScreen Main Window + Floating dialogWindow
80 * @tc.type: FUNC
81 * @tc.require: issueI5GKWZ
82 */
83 HWTEST_F(WindowDialogWindowTest, DialogWindow01, Function | MediumTest | Level2)
84 {
85 sptr<WindowScene> scene = CreateWindowScene();
86
87 struct Rect rect = {0, 0, 100, 200};
88 sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
89 ASSERT_NE(nullptr, dialogWindow);
90
91 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
92 ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
93
94 ASSERT_EQ(WMError::WM_OK, dialogWindow->Hide());
95 ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
96
97 dialogWindow->Destroy();
98 scene->GoDestroy();
99 }
100
101 /**
102 * @tc.name: dialogWindow02
103 * @tc.desc: FullScreen Main Window + 2 dialogWindow
104 * @tc.type: FUNC
105 * @tc.require: issueI5GKWZ
106 */
107 HWTEST_F(WindowDialogWindowTest, DialogWindow02, Function | MediumTest | Level2)
108 {
109 sptr<WindowScene> scene = CreateWindowScene();
110
111 struct Rect rect = {0, 0, 100, 200};
112 sptr<Window> dialogWindow0 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
113 ASSERT_NE(nullptr, dialogWindow0);
114
115 sptr<Window> dialogWindow1 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
116 ASSERT_EQ(nullptr, dialogWindow1);
117
118 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
119 ASSERT_EQ(WMError::WM_OK, dialogWindow0->Show());
120
121 ASSERT_EQ(WMError::WM_OK, dialogWindow0->Hide());
122 ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
123
124 dialogWindow0->Destroy();
125 scene->GoDestroy();
126 }
127
128 /**
129 * @tc.name: dialogWindow03
130 * @tc.desc: FullScreen Main Window + 2 dialogWindow with the same name
131 * @tc.type: FUNC
132 * @tc.require: issueI5GKWZ
133 */
134 HWTEST_F(WindowDialogWindowTest, DialogWindow03, Function | MediumTest | Level2)
135 {
136 sptr<WindowScene> scene = CreateWindowScene();
137
138 struct Rect rect = {0, 0, 100, 200};
139 sptr<Window> dialogWindow0 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
140 sptr<Window> dialogWindow1 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
141 ASSERT_NE(nullptr, dialogWindow0);
142 ASSERT_EQ(nullptr, dialogWindow1);
143
144 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
145 ASSERT_EQ(WMError::WM_OK, dialogWindow0->Show());
146
147 ASSERT_EQ(WMError::WM_OK, dialogWindow0->Hide());
148 ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
149
150 dialogWindow0->Destroy();
151 scene->GoDestroy();
152 }
153
154 /**
155 * @tc.name: dialogWindow04
156 * @tc.desc: FullScreen Main Window + 2 dialogWindow with the same name but one create after another destroyed
157 * @tc.type: FUNC
158 * @tc.require: issueI5GKWZ
159 */
160 HWTEST_F(WindowDialogWindowTest, DialogWindow04, Function | MediumTest | Level2)
161 {
162 sptr<WindowScene> scene = CreateWindowScene();
163 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
164
165 struct Rect rect = {0, 0, 100, 200};
166 sptr<Window> dialogWindow0 = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect, "dialog0");
167 ASSERT_NE(nullptr, dialogWindow0);
168 ASSERT_EQ(WMError::WM_OK, dialogWindow0->Show());
169 ASSERT_EQ(WMError::WM_OK, dialogWindow0->Destroy());
170
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, Function | MediumTest | Level2)
188 {
189 sptr<WindowScene> scene = CreateWindowScene();
190
191 struct Rect rect = {0, 0, 100, 200};
192 sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
193 ASSERT_NE(nullptr, dialogWindow);
194
195 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
196 ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
197
198 ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
199 ASSERT_EQ(WMError::WM_OK, dialogWindow->Hide());
200
201 dialogWindow->Destroy();
202 scene->GoDestroy();
203 }
204
205 /**
206 * @tc.name: dialogWindow06
207 * @tc.desc: FullScreen Main Window + dialogWindow & first destroy dialogWindow, then destroy MainWindow
208 * @tc.type: FUNC
209 * @tc.require: issueI5GKWZ
210 */
211 HWTEST_F(WindowDialogWindowTest, DialogWindow06, Function | MediumTest | Level2)
212 {
213 sptr<WindowScene> scene = CreateWindowScene();
214
215 struct Rect rect = {0, 0, 100, 200};
216 sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
217 ASSERT_NE(nullptr, dialogWindow);
218
219 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
220 ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
221
222 ASSERT_EQ(WMError::WM_OK, dialogWindow->Hide());
223 ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
224
225 ASSERT_EQ(WMError::WM_OK, dialogWindow->Destroy());
226
227 dialogWindow->Destroy();
228 scene->GoDestroy();
229 }
230
231 /**
232 * @tc.name: dialogWindow07
233 * @tc.desc: FullScreen Main Window + dialogWindow & first destroy MainWindow, then destroy dialogWindow
234 * @tc.type: FUNC
235 * @tc.require: issueI5GKWZ
236 */
237 HWTEST_F(WindowDialogWindowTest, DialogWindow07, Function | MediumTest | Level2)
238 {
239 sptr<WindowScene> scene = CreateWindowScene();
240
241 struct Rect rect = {0, 0, 100, 200};
242 sptr<Window> dialogWindow = CreateDialogWindow(scene, WindowType::WINDOW_TYPE_DIALOG, rect);
243 ASSERT_NE(nullptr, dialogWindow);
244
245 ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
246 ASSERT_EQ(WMError::WM_OK, dialogWindow->Show());
247
248 sptr<Window> mainWindow = scene->GetMainWindow();
249 ASSERT_EQ(WMError::WM_OK, mainWindow->Destroy());
250 ASSERT_EQ(WMError::WM_OK, dialogWindow->Destroy());
251
252 scene->GoDestroy();
253 }
254 } // namespace Rosen
255 } // namespace OHOS
256