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