1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2022 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#include <gtest/gtest.h> 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include "window_helper.h" 19e0dac50fSopenharmony_ci 20e0dac50fSopenharmony_ciusing namespace testing; 21e0dac50fSopenharmony_ciusing namespace testing::ext; 22e0dac50fSopenharmony_ci 23e0dac50fSopenharmony_cinamespace OHOS { 24e0dac50fSopenharmony_cinamespace Rosen { 25e0dac50fSopenharmony_ciclass WindowHelperTest : public testing::Test { 26e0dac50fSopenharmony_cipublic: 27e0dac50fSopenharmony_ci static void SetUpTestCase(); 28e0dac50fSopenharmony_ci static void TearDownTestCase(); 29e0dac50fSopenharmony_ci virtual void SetUp() override; 30e0dac50fSopenharmony_ci virtual void TearDown() override; 31e0dac50fSopenharmony_ci}; 32e0dac50fSopenharmony_ci 33e0dac50fSopenharmony_civoid WindowHelperTest::SetUpTestCase() 34e0dac50fSopenharmony_ci{ 35e0dac50fSopenharmony_ci} 36e0dac50fSopenharmony_ci 37e0dac50fSopenharmony_civoid WindowHelperTest::TearDownTestCase() 38e0dac50fSopenharmony_ci{ 39e0dac50fSopenharmony_ci} 40e0dac50fSopenharmony_ci 41e0dac50fSopenharmony_civoid WindowHelperTest::SetUp() 42e0dac50fSopenharmony_ci{ 43e0dac50fSopenharmony_ci} 44e0dac50fSopenharmony_ci 45e0dac50fSopenharmony_civoid WindowHelperTest::TearDown() 46e0dac50fSopenharmony_ci{ 47e0dac50fSopenharmony_ci} 48e0dac50fSopenharmony_ci 49e0dac50fSopenharmony_cinamespace { 50e0dac50fSopenharmony_ci/** 51e0dac50fSopenharmony_ci * @tc.name: WindowTypeWindowMode 52e0dac50fSopenharmony_ci * @tc.desc: window type/mode test 53e0dac50fSopenharmony_ci * @tc.type: FUNC 54e0dac50fSopenharmony_ci */ 55e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, WindowTypeWindowMode, Function | SmallTest | Level1) 56e0dac50fSopenharmony_ci{ 57e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsMainFullScreenWindow(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 58e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_FULLSCREEN)); 59e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsMainFullScreenWindow(WindowType::WINDOW_TYPE_APP_SUB_WINDOW, 60e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_FULLSCREEN)); 61e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsMainFullScreenWindow(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 62e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_SPLIT_PRIMARY)); 63e0dac50fSopenharmony_ci 64e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsFloatingWindow(WindowMode::WINDOW_MODE_FLOATING)); 65e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsFloatingWindow(WindowMode::WINDOW_MODE_FULLSCREEN)); 66e0dac50fSopenharmony_ci 67e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsFullScreenWindow(WindowMode::WINDOW_MODE_FULLSCREEN)); 68e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsFullScreenWindow(WindowMode::WINDOW_MODE_FLOATING)); 69e0dac50fSopenharmony_ci 70e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsDialogWindow(WindowType::WINDOW_TYPE_DIALOG)); 71e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsDialogWindow(WindowType::WINDOW_TYPE_APP_SUB_WINDOW)); 72e0dac50fSopenharmony_ci} 73e0dac50fSopenharmony_ci 74e0dac50fSopenharmony_ci/** 75e0dac50fSopenharmony_ci * @tc.name: WindowModeSupport 76e0dac50fSopenharmony_ci * @tc.desc: window mode supported test 77e0dac50fSopenharmony_ci * @tc.type: FUNC 78e0dac50fSopenharmony_ci */ 79e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, WindowModeSupport, Function | SmallTest | Level1) 80e0dac50fSopenharmony_ci{ 81e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsWindowModeSupported(WindowModeSupport::WINDOW_MODE_SUPPORT_ALL, 82e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_FULLSCREEN)); 83e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsWindowModeSupported(WindowModeSupport::WINDOW_MODE_SUPPORT_ALL, 84e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_FLOATING)); 85e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsWindowModeSupported(WindowModeSupport::WINDOW_MODE_SUPPORT_ALL, 86e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_SPLIT_PRIMARY)); 87e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsWindowModeSupported(WindowModeSupport::WINDOW_MODE_SUPPORT_ALL, 88e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_SPLIT_SECONDARY)); 89e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsWindowModeSupported(WindowModeSupport::WINDOW_MODE_SUPPORT_ALL, 90e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_PIP)); 91e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsWindowModeSupported(WindowModeSupport::WINDOW_MODE_SUPPORT_ALL, 92e0dac50fSopenharmony_ci WindowMode::WINDOW_MODE_UNDEFINED)); 93e0dac50fSopenharmony_ci} 94e0dac50fSopenharmony_ci 95e0dac50fSopenharmony_ci/** 96e0dac50fSopenharmony_ci * @tc.name: WindowRect 97e0dac50fSopenharmony_ci * @tc.desc: rect test 98e0dac50fSopenharmony_ci * @tc.type: FUNC 99e0dac50fSopenharmony_ci */ 100e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, WindowRect, Function | SmallTest | Level1) 101e0dac50fSopenharmony_ci{ 102e0dac50fSopenharmony_ci Rect rect0 = {0, 0, 0, 0}; 103e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsEmptyRect(rect0)); 104e0dac50fSopenharmony_ci 105e0dac50fSopenharmony_ci Rect rect1 = {0, 0, 1, 1}; 106e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsEmptyRect(rect1)); 107e0dac50fSopenharmony_ci} 108e0dac50fSopenharmony_ci 109e0dac50fSopenharmony_ci/** 110e0dac50fSopenharmony_ci * @tc.name: WindowStringUtil 111e0dac50fSopenharmony_ci * @tc.desc: string test 112e0dac50fSopenharmony_ci * @tc.type: FUNC 113e0dac50fSopenharmony_ci */ 114e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, WindowStringUtil, Function | SmallTest | Level1) 115e0dac50fSopenharmony_ci{ 116e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsNumber("123")); 117e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsNumber("1a3")); 118e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsNumber("")); 119e0dac50fSopenharmony_ci 120e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsFloatingNumber("1.23")); 121e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsFloatingNumber(".123")); 122e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsFloatingNumber("1a3")); 123e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsFloatingNumber("123..")); 124e0dac50fSopenharmony_ci 125e0dac50fSopenharmony_ci std::vector<std::string> vec = WindowHelper::Split("123a123a123", "a"); 126e0dac50fSopenharmony_ci for (size_t i = 0; i < vec.size(); i++) { 127e0dac50fSopenharmony_ci if (vec[i].compare("123")) { 128e0dac50fSopenharmony_ci ASSERT_TRUE(false); 129e0dac50fSopenharmony_ci } 130e0dac50fSopenharmony_ci } 131e0dac50fSopenharmony_ci ASSERT_TRUE(true); 132e0dac50fSopenharmony_ci} 133e0dac50fSopenharmony_ci 134e0dac50fSopenharmony_ci/** 135e0dac50fSopenharmony_ci * @tc.name: CalculateOriginPosition 136e0dac50fSopenharmony_ci * @tc.desc: CalculateOriginPosition test 137e0dac50fSopenharmony_ci * @tc.type: FUNC 138e0dac50fSopenharmony_ci */ 139e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, CalculateOriginPosition, Function | SmallTest | Level1) 140e0dac50fSopenharmony_ci{ 141e0dac50fSopenharmony_ci Rect rect1 { 0, 0, 10, 10 }, rect2 { 100, 100, 200, 200 }; 142e0dac50fSopenharmony_ci PointInfo point = WindowHelper::CalculateOriginPosition(rect1, rect2, PointInfo { 200, 200 }); 143e0dac50fSopenharmony_ci PointInfo expectPoint { 5, 5 }; 144e0dac50fSopenharmony_ci ASSERT_EQ(true, point.x == expectPoint.x); 145e0dac50fSopenharmony_ci ASSERT_EQ(true, point.y == expectPoint.y); 146e0dac50fSopenharmony_ci 147e0dac50fSopenharmony_ci Transform transform; 148e0dac50fSopenharmony_ci transform.scaleX_ = 0.66f; 149e0dac50fSopenharmony_ci transform.scaleY_ = 1.5f; 150e0dac50fSopenharmony_ci transform.rotationY_ = 30; 151e0dac50fSopenharmony_ci transform.translateX_ = 100; 152e0dac50fSopenharmony_ci transform.translateY_ = 200; 153e0dac50fSopenharmony_ci transform.translateZ_ = 50; 154e0dac50fSopenharmony_ci Rect rect { 50, 50, 240, 320 }; 155e0dac50fSopenharmony_ci TransformHelper::Vector3 pivotPos = { rect.posX_ + transform.pivotX_ * rect.width_, 156e0dac50fSopenharmony_ci rect.posY_ + transform.pivotY_ * rect.height_, 0 }; 157e0dac50fSopenharmony_ci TransformHelper::Matrix4 mat = TransformHelper::CreateTranslation(-pivotPos); 158e0dac50fSopenharmony_ci mat *= WindowHelper::ComputeWorldTransformMat4(transform); 159e0dac50fSopenharmony_ci mat *= TransformHelper::CreateTranslation(pivotPos); 160e0dac50fSopenharmony_ci 161e0dac50fSopenharmony_ci TransformHelper::Vector3 expectOriginPoint(0, 0, 0); 162e0dac50fSopenharmony_ci TransformHelper::Vector3 tranformedPoint = TransformHelper::Transform(expectOriginPoint, mat); 163e0dac50fSopenharmony_ci PointInfo actialOriginPoint = WindowHelper::CalculateOriginPosition(mat, 164e0dac50fSopenharmony_ci { static_cast<int32_t>(tranformedPoint.x_), static_cast<int32_t>(tranformedPoint.y_) }); 165e0dac50fSopenharmony_ci const float errorRange = 2.f; 166e0dac50fSopenharmony_ci ASSERT_LT(std::abs(expectOriginPoint.x_ - actialOriginPoint.x), errorRange); 167e0dac50fSopenharmony_ci ASSERT_LT(std::abs(expectOriginPoint.y_ - actialOriginPoint.y), errorRange); 168e0dac50fSopenharmony_ci} 169e0dac50fSopenharmony_ci 170e0dac50fSopenharmony_ci/** 171e0dac50fSopenharmony_ci * @tc.name: TransformRect 172e0dac50fSopenharmony_ci * @tc.desc: TransformRect test 173e0dac50fSopenharmony_ci * @tc.type: FUNC 174e0dac50fSopenharmony_ci */ 175e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, TransformRect, Function | SmallTest | Level1) 176e0dac50fSopenharmony_ci{ 177e0dac50fSopenharmony_ci Transform transform; 178e0dac50fSopenharmony_ci Rect rect { 0, 0, 10, 20 }; 179e0dac50fSopenharmony_ci transform.scaleX_ = transform.scaleY_ = 2.0f; 180e0dac50fSopenharmony_ci TransformHelper::Vector3 pivotPos = { rect.posX_ + transform.pivotX_ * rect.width_, 181e0dac50fSopenharmony_ci rect.posY_ + transform.pivotY_ * rect.height_, 0 }; 182e0dac50fSopenharmony_ci TransformHelper::Matrix4 mat = TransformHelper::CreateTranslation(-pivotPos); 183e0dac50fSopenharmony_ci mat *= WindowHelper::ComputeWorldTransformMat4(transform); 184e0dac50fSopenharmony_ci mat *= TransformHelper::CreateTranslation(pivotPos); 185e0dac50fSopenharmony_ci Rect transformRect = WindowHelper::TransformRect(mat, rect); 186e0dac50fSopenharmony_ci ASSERT_EQ(rect.width_ * transform.scaleX_, transformRect.width_); 187e0dac50fSopenharmony_ci ASSERT_EQ(rect.height_ * transform.scaleY_, transformRect.height_); 188e0dac50fSopenharmony_ci} 189e0dac50fSopenharmony_ci 190e0dac50fSopenharmony_ci/** 191e0dac50fSopenharmony_ci * @tc.name: CalculateHotZoneScale 192e0dac50fSopenharmony_ci * @tc.desc: CalculateHotZoneScale test 193e0dac50fSopenharmony_ci * @tc.type: FUNC 194e0dac50fSopenharmony_ci */ 195e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, CalculateHotZoneScale, Function | SmallTest | Level1) 196e0dac50fSopenharmony_ci{ 197e0dac50fSopenharmony_ci Transform transform; 198e0dac50fSopenharmony_ci transform.scaleX_ = 0.66f; 199e0dac50fSopenharmony_ci transform.scaleY_ = 1.5f; 200e0dac50fSopenharmony_ci transform.pivotX_ = transform.pivotY_ = 0.5f; 201e0dac50fSopenharmony_ci Rect rect { -1, -2, 2, 4 }; 202e0dac50fSopenharmony_ci TransformHelper::Vector3 pivotPos = { rect.posX_ + transform.pivotX_ * rect.width_, 203e0dac50fSopenharmony_ci rect.posY_ + transform.pivotY_ * rect.height_, 0 }; 204e0dac50fSopenharmony_ci TransformHelper::Matrix4 mat = TransformHelper::CreateTranslation(-pivotPos); 205e0dac50fSopenharmony_ci mat *= WindowHelper::ComputeWorldTransformMat4(transform); 206e0dac50fSopenharmony_ci mat *= TransformHelper::CreateTranslation(pivotPos); 207e0dac50fSopenharmony_ci 208e0dac50fSopenharmony_ci const float errorRange = 0.01f; 209e0dac50fSopenharmony_ci TransformHelper::Vector2 hotZoneScale = WindowHelper::CalculateHotZoneScale(mat); 210e0dac50fSopenharmony_ci ASSERT_LT(std::abs(transform.scaleX_ - hotZoneScale.x_), errorRange); 211e0dac50fSopenharmony_ci ASSERT_LT(std::abs(transform.scaleY_ - hotZoneScale.y_), errorRange); 212e0dac50fSopenharmony_ci} 213e0dac50fSopenharmony_ci 214e0dac50fSopenharmony_ci/** 215e0dac50fSopenharmony_ci * @tc.name: WindowType 216e0dac50fSopenharmony_ci * @tc.desc: Window Type test 217e0dac50fSopenharmony_ci * @tc.type: FUNC 218e0dac50fSopenharmony_ci */ 219e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, WindowType, Function | SmallTest | Level1) 220e0dac50fSopenharmony_ci{ 221e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsSystemWindow(WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW)); 222e0dac50fSopenharmony_ci ASSERT_EQ(true, WindowHelper::IsSystemSubWindow(WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW)); 223e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsSystemSubWindow(WindowType::WINDOW_TYPE_APP_SUB_WINDOW)); 224e0dac50fSopenharmony_ci ASSERT_EQ(false, WindowHelper::IsSystemSubWindow(WindowType::WINDOW_TYPE_FLOAT)); 225e0dac50fSopenharmony_ci} 226e0dac50fSopenharmony_ci 227e0dac50fSopenharmony_ci/** 228e0dac50fSopenharmony_ci * @tc.name: GetTransformFromWorldMat4 229e0dac50fSopenharmony_ci * @tc.desc: GetTransformFromWorldMat4 test 230e0dac50fSopenharmony_ci * @tc.type: FUNC 231e0dac50fSopenharmony_ci */ 232e0dac50fSopenharmony_ciHWTEST_F(WindowHelperTest, GetTransformFromWorldMat4, Function | SmallTest | Level1) 233e0dac50fSopenharmony_ci{ 234e0dac50fSopenharmony_ci Transform transform1; 235e0dac50fSopenharmony_ci transform1.scaleX_ = 0.66f; 236e0dac50fSopenharmony_ci transform1.scaleY_ = 1.5f; 237e0dac50fSopenharmony_ci transform1.translateX_ = 12.f; 238e0dac50fSopenharmony_ci transform1.translateY_ = 45.f; 239e0dac50fSopenharmony_ci Rect rect1 { 0, 0, 300, 400 }; 240e0dac50fSopenharmony_ci TransformHelper::Vector3 pivotPos1 = { rect1.posX_ + transform1.pivotX_ * rect1.width_, 241e0dac50fSopenharmony_ci rect1.posY_ + transform1.pivotY_ * rect1.height_, 0 }; 242e0dac50fSopenharmony_ci TransformHelper::Matrix4 mat1 = TransformHelper::CreateTranslation(-pivotPos1); 243e0dac50fSopenharmony_ci mat1 *= WindowHelper::ComputeWorldTransformMat4(transform1); 244e0dac50fSopenharmony_ci mat1 *= TransformHelper::CreateTranslation(pivotPos1); 245e0dac50fSopenharmony_ci 246e0dac50fSopenharmony_ci Rect rect2 = WindowHelper::TransformRect(mat1, rect1); 247e0dac50fSopenharmony_ci Transform transform2; 248e0dac50fSopenharmony_ci WindowHelper::GetTransformFromWorldMat4(mat1, rect2, transform2); 249e0dac50fSopenharmony_ci TransformHelper::Vector3 pivotPos2 = { rect2.posX_ + transform2.pivotX_ * rect2.width_, 250e0dac50fSopenharmony_ci rect2.posY_ + transform2.pivotY_ * rect2.height_, 0 }; 251e0dac50fSopenharmony_ci TransformHelper::Matrix4 mat2 = TransformHelper::CreateTranslation(-pivotPos2); 252e0dac50fSopenharmony_ci mat2 *= WindowHelper::ComputeWorldTransformMat4(transform2); 253e0dac50fSopenharmony_ci mat2 *= TransformHelper::CreateTranslation(pivotPos2); 254e0dac50fSopenharmony_ci for (int i = 0; i < TransformHelper::Matrix4::MAT_SIZE; i++) { 255e0dac50fSopenharmony_ci for (int j = 0; j < TransformHelper::Matrix4::MAT_SIZE; j++) { 256e0dac50fSopenharmony_ci ASSERT_EQ(true, MathHelper::NearZero(mat1.mat_[i][j] - mat2.mat_[i][j])); 257e0dac50fSopenharmony_ci } 258e0dac50fSopenharmony_ci } 259e0dac50fSopenharmony_ci} 260e0dac50fSopenharmony_ci} 261e0dac50fSopenharmony_ci} // namespace Rosen 262e0dac50fSopenharmony_ci} // namespace OHOS