1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci 16e0dac50fSopenharmony_ci// gtest 17e0dac50fSopenharmony_ci#include <gtest/gtest.h> 18e0dac50fSopenharmony_ci#include "window_test_utils.h" 19e0dac50fSopenharmony_ci#include "wm_common.h" 20e0dac50fSopenharmony_ciusing namespace testing; 21e0dac50fSopenharmony_ciusing namespace testing::ext; 22e0dac50fSopenharmony_ci 23e0dac50fSopenharmony_cinamespace OHOS { 24e0dac50fSopenharmony_cinamespace Rosen { 25e0dac50fSopenharmony_ciusing Utils = WindowTestUtils; 26e0dac50fSopenharmony_ciclass WindowSplitTest : public testing::Test { 27e0dac50fSopenharmony_cipublic: 28e0dac50fSopenharmony_ci static void SetUpTestCase(); 29e0dac50fSopenharmony_ci static void TearDownTestCase(); 30e0dac50fSopenharmony_ci virtual void SetUp() override; 31e0dac50fSopenharmony_ci virtual void TearDown() override; 32e0dac50fSopenharmony_ci std::vector<sptr<Window>> activeWindows_; 33e0dac50fSopenharmony_ci Utils::TestWindowInfo fullInfo_; 34e0dac50fSopenharmony_ci Utils::TestWindowInfo splitInfo_; 35e0dac50fSopenharmony_ci 36e0dac50fSopenharmony_ciprivate: 37e0dac50fSopenharmony_ci static constexpr uint32_t SPLIT_TEST_SLEEP_S = 1; // split test sleep time 38e0dac50fSopenharmony_ci}; 39e0dac50fSopenharmony_ci 40e0dac50fSopenharmony_civoid WindowSplitTest::SetUpTestCase() 41e0dac50fSopenharmony_ci{ 42e0dac50fSopenharmony_ci} 43e0dac50fSopenharmony_ci 44e0dac50fSopenharmony_civoid WindowSplitTest::TearDownTestCase() 45e0dac50fSopenharmony_ci{ 46e0dac50fSopenharmony_ci} 47e0dac50fSopenharmony_ci 48e0dac50fSopenharmony_civoid WindowSplitTest::SetUp() 49e0dac50fSopenharmony_ci{ 50e0dac50fSopenharmony_ci fullInfo_ = { 51e0dac50fSopenharmony_ci .name = "", 52e0dac50fSopenharmony_ci .rect = Utils::customAppRect_, 53e0dac50fSopenharmony_ci .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 54e0dac50fSopenharmony_ci .mode = WindowMode::WINDOW_MODE_SPLIT_PRIMARY, 55e0dac50fSopenharmony_ci .needAvoid = true, 56e0dac50fSopenharmony_ci .parentLimit = false, 57e0dac50fSopenharmony_ci .parentId = INVALID_WINDOW_ID, 58e0dac50fSopenharmony_ci }; 59e0dac50fSopenharmony_ci 60e0dac50fSopenharmony_ci splitInfo_ = { 61e0dac50fSopenharmony_ci .name = "", 62e0dac50fSopenharmony_ci .rect = Utils::customAppRect_, 63e0dac50fSopenharmony_ci .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 64e0dac50fSopenharmony_ci .mode = WindowMode::WINDOW_MODE_FULLSCREEN, 65e0dac50fSopenharmony_ci .needAvoid = true, 66e0dac50fSopenharmony_ci .parentLimit = false, 67e0dac50fSopenharmony_ci .parentId = INVALID_WINDOW_ID, 68e0dac50fSopenharmony_ci }; 69e0dac50fSopenharmony_ci 70e0dac50fSopenharmony_ci activeWindows_.clear(); 71e0dac50fSopenharmony_ci} 72e0dac50fSopenharmony_ci 73e0dac50fSopenharmony_civoid WindowSplitTest::TearDown() 74e0dac50fSopenharmony_ci{ 75e0dac50fSopenharmony_ci while (!activeWindows_.empty()) { 76e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, activeWindows_.back()->Destroy()); 77e0dac50fSopenharmony_ci activeWindows_.pop_back(); 78e0dac50fSopenharmony_ci } 79e0dac50fSopenharmony_ci} 80e0dac50fSopenharmony_ci 81e0dac50fSopenharmony_cinamespace { 82e0dac50fSopenharmony_ci/** 83e0dac50fSopenharmony_ci * @tc.name: SplitWindow01 84e0dac50fSopenharmony_ci * @tc.desc: first create a secondary window, then create a primary window, test mode change 85e0dac50fSopenharmony_ci * @tc.type: FUNC 86e0dac50fSopenharmony_ci */ 87e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitWindow01, Function | MediumTest | Level3) 88e0dac50fSopenharmony_ci{ 89e0dac50fSopenharmony_ci fullInfo_.name = "fullscreen.1"; 90e0dac50fSopenharmony_ci fullInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN; 91e0dac50fSopenharmony_ci splitInfo_.name = "primary.1"; 92e0dac50fSopenharmony_ci splitInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN; 93e0dac50fSopenharmony_ci 94e0dac50fSopenharmony_ci const sptr<Window>& priWindow = Utils::CreateTestWindow(splitInfo_); 95e0dac50fSopenharmony_ci if (priWindow == nullptr) { 96e0dac50fSopenharmony_ci return; 97e0dac50fSopenharmony_ci } 98e0dac50fSopenharmony_ci activeWindows_.push_back(priWindow); 99e0dac50fSopenharmony_ci priWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY); 100e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 101e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, priWindow->Show()); 102e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 103e0dac50fSopenharmony_ci 104e0dac50fSopenharmony_ci const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_); 105e0dac50fSopenharmony_ci if (fullWindow == nullptr) { 106e0dac50fSopenharmony_ci return; 107e0dac50fSopenharmony_ci } 108e0dac50fSopenharmony_ci activeWindows_.push_back(fullWindow); 109e0dac50fSopenharmony_ci fullWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY); 110e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 111e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Show()); 112e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 113e0dac50fSopenharmony_ci 114e0dac50fSopenharmony_ci 115e0dac50fSopenharmony_ci ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, priWindow->GetMode()); 116e0dac50fSopenharmony_ci ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, fullWindow->GetMode()); 117e0dac50fSopenharmony_ci 118e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, priWindow->Hide()); 119e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 120e0dac50fSopenharmony_ci ASSERT_EQ(WindowMode::WINDOW_MODE_FULLSCREEN, fullWindow->GetMode()); 121e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Hide()); 122e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 123e0dac50fSopenharmony_ci} 124e0dac50fSopenharmony_ci 125e0dac50fSopenharmony_ci/** 126e0dac50fSopenharmony_ci * @tc.name: SplitWindow02 127e0dac50fSopenharmony_ci * @tc.desc: first create a primary window, then create a secondary window, test mode change 128e0dac50fSopenharmony_ci * @tc.type: FUNC 129e0dac50fSopenharmony_ci */ 130e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitWindow02, Function | MediumTest | Level3) 131e0dac50fSopenharmony_ci{ 132e0dac50fSopenharmony_ci fullInfo_.name = "fullscreen.2"; 133e0dac50fSopenharmony_ci fullInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN; 134e0dac50fSopenharmony_ci splitInfo_.name = "secondary.2"; 135e0dac50fSopenharmony_ci splitInfo_.mode = WindowMode::WINDOW_MODE_FULLSCREEN; 136e0dac50fSopenharmony_ci 137e0dac50fSopenharmony_ci const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_); 138e0dac50fSopenharmony_ci if (fullWindow == nullptr) { 139e0dac50fSopenharmony_ci return; 140e0dac50fSopenharmony_ci } 141e0dac50fSopenharmony_ci activeWindows_.push_back(fullWindow); 142e0dac50fSopenharmony_ci fullWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_PRIMARY); 143e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 144e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Show()); 145e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 146e0dac50fSopenharmony_ci 147e0dac50fSopenharmony_ci const sptr<Window>& secWindow = Utils::CreateTestWindow(splitInfo_); 148e0dac50fSopenharmony_ci ASSERT_NE(nullptr, secWindow); 149e0dac50fSopenharmony_ci activeWindows_.push_back(secWindow); 150e0dac50fSopenharmony_ci secWindow->SetWindowMode(WindowMode::WINDOW_MODE_SPLIT_SECONDARY); 151e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 152e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, secWindow->Show()); 153e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 154e0dac50fSopenharmony_ci 155e0dac50fSopenharmony_ci 156e0dac50fSopenharmony_ci ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_SECONDARY, secWindow->GetMode()); 157e0dac50fSopenharmony_ci ASSERT_EQ(WindowMode::WINDOW_MODE_SPLIT_PRIMARY, fullWindow->GetMode()); 158e0dac50fSopenharmony_ci 159e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Hide()); 160e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 161e0dac50fSopenharmony_ci ASSERT_EQ(WindowMode::WINDOW_MODE_FULLSCREEN, secWindow->GetMode()); 162e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, secWindow->Hide()); 163e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 164e0dac50fSopenharmony_ci} 165e0dac50fSopenharmony_ci 166e0dac50fSopenharmony_ci/** 167e0dac50fSopenharmony_ci * @tc.name: SplitScreen03 168e0dac50fSopenharmony_ci * @tc.desc: first create a secondary window, then create a primary window, test rects 169e0dac50fSopenharmony_ci * @tc.type: FUNC 170e0dac50fSopenharmony_ci */ 171e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitScreen03, Function | MediumTest | Level3) 172e0dac50fSopenharmony_ci{ 173e0dac50fSopenharmony_ci fullInfo_.name = "fullscreen.3"; 174e0dac50fSopenharmony_ci fullInfo_.mode = WindowMode::WINDOW_MODE_SPLIT_SECONDARY; 175e0dac50fSopenharmony_ci splitInfo_.name = "primary.3"; 176e0dac50fSopenharmony_ci splitInfo_.mode = WindowMode::WINDOW_MODE_SPLIT_PRIMARY; 177e0dac50fSopenharmony_ci 178e0dac50fSopenharmony_ci const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_); 179e0dac50fSopenharmony_ci if (fullWindow == nullptr) { 180e0dac50fSopenharmony_ci return; 181e0dac50fSopenharmony_ci } 182e0dac50fSopenharmony_ci activeWindows_.push_back(fullWindow); 183e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Show()); 184e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 185e0dac50fSopenharmony_ci const sptr<Window>& priWindow = Utils::CreateTestWindow(splitInfo_); 186e0dac50fSopenharmony_ci ASSERT_NE(nullptr, priWindow); 187e0dac50fSopenharmony_ci activeWindows_.push_back(priWindow); 188e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, priWindow->Show()); 189e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 190e0dac50fSopenharmony_ci 191e0dac50fSopenharmony_ci Utils::InitSplitRects(); 192e0dac50fSopenharmony_ci Utils::UpdateSplitRects(fullWindow); 193e0dac50fSopenharmony_ci 194e0dac50fSopenharmony_ci ASSERT_TRUE(Utils::RectEqualTo(fullWindow, Utils::splitRects_.secondaryRect)); 195e0dac50fSopenharmony_ci ASSERT_TRUE(Utils::RectEqualTo(priWindow, Utils::splitRects_.primaryRect)); 196e0dac50fSopenharmony_ci 197e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Hide()); 198e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 199e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, priWindow->Hide()); 200e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 201e0dac50fSopenharmony_ci} 202e0dac50fSopenharmony_ci 203e0dac50fSopenharmony_ci/** 204e0dac50fSopenharmony_ci * @tc.name: SplitScreen04 205e0dac50fSopenharmony_ci * @tc.desc: first create a primary window, then create a secondary window, test rects 206e0dac50fSopenharmony_ci * @tc.type: FUNC 207e0dac50fSopenharmony_ci */ 208e0dac50fSopenharmony_ciHWTEST_F(WindowSplitTest, SplitScreen04, Function | MediumTest | Level3) 209e0dac50fSopenharmony_ci{ 210e0dac50fSopenharmony_ci fullInfo_.name = "fullscreen.4"; 211e0dac50fSopenharmony_ci splitInfo_.name = "secondary.4"; 212e0dac50fSopenharmony_ci splitInfo_.mode = WindowMode::WINDOW_MODE_SPLIT_SECONDARY; 213e0dac50fSopenharmony_ci 214e0dac50fSopenharmony_ci const sptr<Window>& fullWindow = Utils::CreateTestWindow(fullInfo_); 215e0dac50fSopenharmony_ci if (fullWindow == nullptr) { 216e0dac50fSopenharmony_ci return; 217e0dac50fSopenharmony_ci } 218e0dac50fSopenharmony_ci 219e0dac50fSopenharmony_ci activeWindows_.push_back(fullWindow); 220e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Show()); 221e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 222e0dac50fSopenharmony_ci const sptr<Window>& secWindow = Utils::CreateTestWindow(splitInfo_); 223e0dac50fSopenharmony_ci ASSERT_NE(nullptr, secWindow); 224e0dac50fSopenharmony_ci activeWindows_.push_back(secWindow); 225e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, secWindow->Show()); 226e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 227e0dac50fSopenharmony_ci 228e0dac50fSopenharmony_ci Utils::InitSplitRects(); 229e0dac50fSopenharmony_ci Utils::UpdateSplitRects(fullWindow); 230e0dac50fSopenharmony_ci 231e0dac50fSopenharmony_ci ASSERT_TRUE(Utils::RectEqualTo(fullWindow, Utils::splitRects_.primaryRect)); 232e0dac50fSopenharmony_ci ASSERT_TRUE(Utils::RectEqualTo(secWindow, Utils::splitRects_.secondaryRect)); 233e0dac50fSopenharmony_ci 234e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, fullWindow->Hide()); 235e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 236e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, secWindow->Hide()); 237e0dac50fSopenharmony_ci sleep(SPLIT_TEST_SLEEP_S); 238e0dac50fSopenharmony_ci} 239e0dac50fSopenharmony_ci} 240e0dac50fSopenharmony_ci} // namespace Rosen 241e0dac50fSopenharmony_ci} // namespace OHOS 242