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