From 1276b7f65601c9b902e421dcb4fd00e51573cd67 Mon Sep 17 00:00:00 2001 From: l00574490 Date: Sat, 15 Jan 2022 17:36:12 +0800 Subject: [PATCH] add for split test Change-Id: Ib467ece4c63c6150776bb2db69979285b4c5537f --- wm/test/systemtest/BUILD.gn | 20 ++- wm/test/systemtest/window_split_test.cpp | 148 +++++++++++++++++++++++ wm/test/systemtest/window_test_utils.cpp | 35 ++++++ wm/test/systemtest/window_test_utils.h | 11 ++ wmserver/include/window_inner_manager.h | 3 +- 5 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 wm/test/systemtest/window_split_test.cpp diff --git a/wm/test/systemtest/BUILD.gn b/wm/test/systemtest/BUILD.gn index 8d04cad4d7..15e9c2c6c5 100644 --- a/wm/test/systemtest/BUILD.gn +++ b/wm/test/systemtest/BUILD.gn @@ -9,7 +9,7 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. +# limitations under the License. import("//build/test.gni") @@ -22,6 +22,7 @@ group("systemtest") { ":wm_window_layout_test", ":wm_window_multi_ability_test", ":wm_window_subwindow_test", + ":wm_window_split_test", ] } @@ -34,7 +35,18 @@ ohos_systemtest("wm_window_layout_test") { deps = [ ":wm_systemtest_common" ] } -## SystemTest wm_window_layout_test }}} +## SystemTest wm_window_layout_test }}} + +## SystemTest wm_window_split_test {{{ +ohos_systemtest("wm_window_split_test") { + module_out_path = module_out_path + + sources = [ "window_layout_test.cpp" ] + + deps = [ ":wm_systemtest_common" ] +} + +## SystemTest wm_window_split_test }}} ## SystemTest wm_window_multi_ability_test {{{ ohos_systemtest("wm_window_multi_ability_test") { @@ -45,7 +57,7 @@ ohos_systemtest("wm_window_multi_ability_test") { deps = [ ":wm_systemtest_common" ] } -## SystemTest wm_window_multi_ability_test }}} +## SystemTest wm_window_multi_ability_test }}} ## SystemTest wm_window_subwindow_test {{{ ohos_systemtest("wm_window_subwindow_test") { @@ -56,7 +68,7 @@ ohos_systemtest("wm_window_subwindow_test") { deps = [ ":wm_systemtest_common" ] } -## SystemTest wm_window_subwindow_test }}} +## SystemTest wm_window_subwindow_test }}} ## Build wm_systemtest_common.a {{{ config("wm_systemtest_common_public_config") { diff --git a/wm/test/systemtest/window_split_test.cpp b/wm/test/systemtest/window_split_test.cpp new file mode 100644 index 0000000000..97b46cf213 --- /dev/null +++ b/wm/test/systemtest/window_split_test.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// gtest +#include +#include "window_inner_manager.h" +#include "window_test_utils.h" +using namespace testing; +using namespace testing::ext; + +namespace OHOS { +namespace Rosen { +using utils = WindowTestUtils; +class WindowSplitTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + virtual void SetUp() override; + virtual void TearDown() override; + int displayId_ = 0; + std::vector> activeWindows_; +}; + +void WindowLayoutTest::SetUpTestCase() +{ + auto display = DisplayManager::GetInstance().GetDisplayById(displayId_); + if (display == nullptr) { + printf("GetDefaultDisplay: failed!\n"); + } else { + printf("GetDefaultDisplay: id %llu, w %d, h %d, fps %u\n", display->GetId(), display->GetWidth(), + display->GetHeight(), display->GetFreshRate()); + } + Rect screenRect = {0, 0, display->GetWidth(), display->GetHeight()}; + utils::InitByScreenRect(screenRect); +} + +void WindowLayoutTest::TearDownTestCase() +{ +} + +void WindowLayoutTest::SetUp() +{ + activeWindows_.clear(); +} + +void WindowLayoutTest::TearDown() +{ + while (!activeWindows_.empty()) { + ASSERT_EQ(WMError::WM_OK, activeWindows_.back()->Destroy()); + activeWindows_.pop_back(); + } +} + +namespace { +/** + * @tc.name: SplitCreen01 + * @tc.desc: Split Primary and Secondary Window + * @tc.type: FUNC + * @tc.require: AR000GGTV7 + */ +HWTEST_F(WindowLayoutTest, SplitCreen01, Function | MediumTest | Level3) +{ + utils::TestWindowInfo splitInfo = { + .name = "main", + .rect = utils::defaultAppRect_, + .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, + .mode = WindowMode::WINDOW_MODE_SPLIT_PRIMARY, + .needAvoid = true, + .parentLimit = false, + .parentName = "", + }; + const sptr& priWindow = utils::CreateTestWindow(splitInfo); + activeWindows_.push_back(priWindow); + + splitInfo.mode = WINDOW_MODE_SPLIT_SECONDARY; + const sptr& secWindow = utils::CreateTestWindow(splitInfo); + activeWindows_.push_back(secWindow); + + ASSERT_EQ(WMError::WM_OK, priWindow->Show()); + ASSERT_EQ(WMError::WM_OK, secWindow->Show()); + ASSERT_TRUE(utils::SplitRectEqualTo(priWindow, utils::splitRects_.primaryRect)); + ASSERT_TRUE(utils::SplitRectEqualTo(secWindow, utils::splitRects_.secondaryRect)); + ASSERT_EQ(WMError::WM_OK, priWindow->Hide()); + ASSERT_EQ(WMError::WM_OK, secWindow->Hide()); +} + +/** + * @tc.name: SplitCreen01 + * @tc.desc: One Split Primary and Secondary Window + * @tc.type: FUNC + * @tc.require: AR000GGTV7 + */ +HWTEST_F(WindowLayoutTest, SplitCreen01, Function | MediumTest | Level3) +{ + utils::TestWindowInfo splitInfo = { + .name = "main", + .rect = utils::defaultAppRect_, + .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, + .mode = WindowMode::WINDOW_MODE_SPLIT_PRIMARY, + .needAvoid = true, + .parentLimit = false, + .parentName = "", + }; + const sptr& priWindow = utils::CreateTestWindow(splitInfo); + activeWindows_.push_back(priWindow); + + splitInfo.mode = WINDOW_MODE_SPLIT_SECONDARY; + const sptr& secWindow = utils::CreateTestWindow(splitInfo); + activeWindows_.push_back(secWindow); + + ASSERT_EQ(WMError::WM_OK, priWindow->Show()); + ASSERT_EQ(WMError::WM_OK, secWindow->Show()); + + sptr divWindow= SingletonContainer::Get().GetDividerWindow(displayId_); + ASSERT_TRUE(divWindow != nullptr); + ASSERT_TRUE(utils::SplitRectEqualTo(divWindow, utils::splitRects_.dividerRect)); + + int32_t target = static_cast(splitRects_.displayRect.width_ * 0.3); // move to (width * 0.3) + divWindow.MoveTo(target, target); + UpdateSplitRect(target); + ASSERT_TRUE(utils::SplitRectEqualTo(divWindow, utils::splitRects_.dividerRect)); + ASSERT_TRUE(utils::SplitRectEqualTo(priWindow, utils::splitRects_.primaryRect)); + ASSERT_TRUE(utils::SplitRectEqualTo(secWindow, utils::splitRects_.secondaryRect)); + + target = static_cast(splitRects_.displayRect.width_ * 0.8); // move to (width * 0.8) + divWindow.MoveTo(target, target); + UpdateSplitRect(target); + ASSERT_TRUE(utils::SplitRectEqualTo(divWindow, utils::splitRects_.dividerRect)); + ASSERT_TRUE(utils::SplitRectEqualTo(priWindow, utils::splitRects_.primaryRect)); + ASSERT_TRUE(utils::SplitRectEqualTo(secWindow, utils::splitRects_.secondaryRect)); + + ASSERT_EQ(WMError::WM_OK, priWindow->Hide()); + ASSERT_EQ(WMError::WM_OK, secWindow->Hide()); +} +} // namespace Rosen +} // namespace OHOSdividerWindow \ No newline at end of file diff --git a/wm/test/systemtest/window_test_utils.cpp b/wm/test/systemtest/window_test_utils.cpp index a761514717..3c7baef759 100644 --- a/wm/test/systemtest/window_test_utils.cpp +++ b/wm/test/systemtest/window_test_utils.cpp @@ -103,5 +103,40 @@ bool WindowTestUtils::RectEqualTo(const sptr& window, const Rect& r) } return res; } + +void WindowTestUtils::InitSplitRect(const Rect& screenRect) +{ + const float splitRatio = 0.5; + const uint32_t dividerWidth = 50; + splitRects_.displayRect = screenRect; + + splitRects_.dividerRect = { static_cast((splitRects_.displayRect.width_ - dividerWidth) * splitRatio), 0, + dividerWidth, splitRects_.displayRect.height_ }; + + SetSplitRect(splitRects_.dividerRect.posX_); +} + +void WindowTestUtils::UpdateSplitRect(int32_t divPosX) +{ + splitRects_.dividerRect.posX_ = divPosX; + + splitRects_.primaryRect.width_ = divPosX; + splitRects_.primaryRect.height_ = displayRect_.height_; + + splitRects_.secondaryRect.posX_ = divPosX + splitRects_.dividerRect.width_; + splitRects_.secondaryRect.width_ = displayRect_.width_ - splitRects_.secondaryRect.posX_; + splitRects_.secondaryRect.height_ = displayRect_.height_; +} + +bool WindowTestUtils::SplitRectEqualTo(const sptr& window, const Rect& r) +{ + Rect l = window->GetRect(); + bool res = ((l.posX_ == r.posX_) && (l.posY_ == r.posY_) && (l.width_ == r.width_)); + if (!res) { + printf("GetLayoutRect: %d %d %d %d, Expect: %d %d %d %d\n", l.posX_, l.posY_, l.width_, l.height_, + r.posX_, r.posY_, r.width_, r.height_); + } + return res; +} } // namespace ROSEN } // namespace OHOS diff --git a/wm/test/systemtest/window_test_utils.h b/wm/test/systemtest/window_test_utils.h index a8998c6b37..b4348696b4 100644 --- a/wm/test/systemtest/window_test_utils.h +++ b/wm/test/systemtest/window_test_utils.h @@ -25,6 +25,12 @@ namespace OHOS { namespace Rosen { + struct SplitRects { + Rect primaryRect; + Rect secondaryRect; + Rect displayRect; + Rect dividerRect; + }; class WindowTestUtils { public: struct TestWindowInfo { @@ -40,12 +46,17 @@ public: static Rect statusBarRect_; static Rect naviBarRect_; static Rect defaultAppRect_; + SplitRects splitRects_; static void InitByScreenRect(const Rect& screenRect); static sptr CreateTestWindow(const TestWindowInfo& info); static sptr CreateStatusBarWindow(); static sptr CreateNavigationBarWindow(); static sptr CreateWindowScene(); static bool RectEqualTo(const sptr& window, const Rect& r); + + void InitSplitRect(const Rect& screenRect); + void UpdateSplitRect(int32_t divPosX); + bool SplitRectEqualTo(const sptr& window, const Rect& r); }; } // namespace ROSEN } // namespace OHOS diff --git a/wmserver/include/window_inner_manager.h b/wmserver/include/window_inner_manager.h index 386d54893e..11155f72c2 100644 --- a/wmserver/include/window_inner_manager.h +++ b/wmserver/include/window_inner_manager.h @@ -49,6 +49,7 @@ public: void SendMessage(InnerWMCmd cmdType, uint32_t displayId = 0); void SendMessage(InnerWMCmd cmdType, uint32_t displayId, const Rect& rect); void HandleMessage(); + sptr GetDividerWindow(uint32_t displayId) const; private: static inline SingletonDelegator delegator; @@ -57,7 +58,7 @@ private: void HideAndDestroyDivider(); void DestroyThread(); void DrawSurface(const sptr& window, uint32_t color); - sptr GetDividerWindow(uint32_t displayId) const; + // sptr GetDividerWindow(uint32_t displayId) const; std::mutex mutex_; std::condition_variable conVar_; -- Gitee