1 /*
2  * Copyright (c) 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 
16 // gtest
17 #include <gtest/gtest.h>
18 #include "display_manager_proxy.h"
19 #include "window_test_utils.h"
20 #include "wm_common.h"
21 using namespace testing;
22 using namespace testing::ext;
23 
24 namespace OHOS {
25 namespace Rosen {
26 namespace {
27 constexpr uint32_t WAIT_ASYNC_US = 100000;  // 100ms
28 }
29 using Utils = WindowTestUtils;
30 class WindowInputTest : public testing::Test {
31 public:
32     static void SetUpTestCase();
33     static void TearDownTestCase();
34     virtual void SetUp() override;
35     virtual void TearDown() override;
36     Utils::TestWindowInfo fullScreenWindow_;
37 };
38 
SetUpTestCase()39 void WindowInputTest::SetUpTestCase()
40 {
41     auto display = DisplayManager::GetInstance().GetDisplayById(0);
42     ASSERT_TRUE((display != nullptr));
43     Rect displayRect = {0, 0, display->GetWidth(), display->GetHeight()};
44     Utils::InitByDisplayRect(displayRect);
45 }
46 
TearDownTestCase()47 void WindowInputTest::TearDownTestCase()
48 {
49 }
50 
SetUp()51 void WindowInputTest::SetUp()
52 {
53     fullScreenWindow_ = {
54         .name = "FullWindow",
55         .rect = Utils::customAppRect_,
56         .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
57         .mode = WindowMode::WINDOW_MODE_FULLSCREEN,
58         .needAvoid = false,
59         .parentLimit = false,
60         .parentId = INVALID_WINDOW_ID,
61     };
62 }
63 
TearDown()64 void WindowInputTest::TearDown()
65 {
66 }
67 
68 namespace {
69 /**
70  * @tc.name: SetTouchHotAreas01
71  * @tc.desc: Normal scenario testing for Window#SetTouchHotAreas
72  * @tc.type: FUNC
73  */
74 HWTEST_F(WindowInputTest, SetTouchHotAreas01, Function | MediumTest | Level3)
75 {
76     fullScreenWindow_.name = "window_hot_areas.1";
77     const sptr<Window>& window = Utils::CreateTestWindow(fullScreenWindow_);
78     if (window == nullptr) {
79         return;
80     }
81     ASSERT_EQ(WMError::WM_OK, window->Show());
82 
83     std::vector<Rect> requestedTouchHotAreas;
84     window->GetRequestedTouchHotAreas(requestedTouchHotAreas);
85     ASSERT_TRUE(requestedTouchHotAreas.empty());
86 
87     usleep(WAIT_ASYNC_US);
88     Rect windowRect = window->GetRect();
89 
90     std::vector<Rect> rects;
91     uint32_t hotAreasNum = 10;
92     uint32_t hotAreaWidth = windowRect.width_ / hotAreasNum;
93     uint32_t hotAreaHeight = windowRect.height_ / hotAreasNum;
94     for (uint32_t i = 0; i < hotAreasNum; ++i) {
95         rects.emplace_back(Rect{ hotAreaWidth * i, hotAreaHeight * i, hotAreaWidth, hotAreaHeight });
96     }
97     ASSERT_EQ(WMError::WM_OK, window->SetTouchHotAreas(rects));
98     window->GetRequestedTouchHotAreas(requestedTouchHotAreas);
99     ASSERT_EQ(rects.size(), requestedTouchHotAreas.size());
100     for (uint32_t i = 0; i < rects.size(); ++i) {
101         ASSERT_TRUE(rects[i] == requestedTouchHotAreas[i]);
102     }
103 
104     rects.clear();
105     rects.emplace_back(Rect{ 0, 0, hotAreaWidth, hotAreaHeight });
106     ASSERT_EQ(WMError::WM_OK, window->SetTouchHotAreas(rects));
107     window->GetRequestedTouchHotAreas(requestedTouchHotAreas);
108     ASSERT_EQ(rects.size(), requestedTouchHotAreas.size());
109     for (uint32_t i = 0; i < rects.size(); ++i) {
110         ASSERT_TRUE(rects[i] == requestedTouchHotAreas[i]);
111     }
112 
113     rects.clear();
114     ASSERT_EQ(WMError::WM_OK, window->SetTouchHotAreas(rects));
115     window->GetRequestedTouchHotAreas(requestedTouchHotAreas);
116     ASSERT_TRUE(requestedTouchHotAreas.empty());
117 
118     ASSERT_EQ(WMError::WM_OK, window->Destroy());
119 }
120 
121 /**
122  * @tc.name: SetTouchHotAreas02
123  * @tc.desc: Abnormal scenario testing for Window#SetTouchHotAreas
124  * @tc.type: FUNC
125  */
126 HWTEST_F(WindowInputTest, SetTouchHotAreas02, Function | MediumTest | Level3)
127 {
128     fullScreenWindow_.name = "window_hot_areas.2";
129     const sptr<Window>& window = Utils::CreateTestWindow(fullScreenWindow_);
130     if (window == nullptr) {
131         return;
132     }
133     ASSERT_EQ(WMError::WM_OK, window->Show());
134 
135     usleep(WAIT_ASYNC_US);
136     Rect windowRect = window->GetRect();
137 
138     std::vector<Rect> rects;
139     /* maximum hot areas: 10, test exceeding maximum hot areas */
140     uint32_t hotAreasNum = 11;
141     uint32_t hotAreaWidth = windowRect.width_ / hotAreasNum;
142     uint32_t hotAreaHeight = windowRect.height_ / hotAreasNum;
143     for (uint32_t i = 0; i < hotAreasNum; ++i) {
144         rects.emplace_back(Rect{ hotAreaWidth * i, hotAreaHeight * i, hotAreaWidth, hotAreaHeight });
145     }
146     ASSERT_EQ(WMError::WM_OK, window->SetTouchHotAreas(rects));
147 
148     rects.clear();
149     rects.emplace_back(Rect{ -1, 0, windowRect.width_ / 2, windowRect.height_ / 2 });
150     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, window->SetTouchHotAreas(rects));
151 
152     rects.clear();
153     rects.emplace_back(Rect{ 0, -1, windowRect.width_ / 2, windowRect.height_ / 2 });
154     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, window->SetTouchHotAreas(rects));
155 
156     rects.clear();
157     rects.emplace_back(Rect{ 0, 0, 0, windowRect.height_ / 2 });
158     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, window->SetTouchHotAreas(rects));
159 
160     rects.clear();
161     rects.emplace_back(Rect{ 0, 0, windowRect.width_ / 2, 0 });
162     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, window->SetTouchHotAreas(rects));
163 
164     rects.clear();
165     rects.emplace_back(Rect{ windowRect.width_, 0, windowRect.width_ / 2, windowRect.height_ / 2 });
166     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, window->SetTouchHotAreas(rects));
167 
168     rects.clear();
169     rects.emplace_back(Rect{ 0, windowRect.height_, windowRect.width_ / 2, windowRect.height_ / 2 });
170     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, window->SetTouchHotAreas(rects));
171 
172     std::vector<Rect> requestedTouchHotAreas;
173     window->GetRequestedTouchHotAreas(requestedTouchHotAreas);
174     ASSERT_FALSE(requestedTouchHotAreas.empty());
175 
176     ASSERT_EQ(WMError::WM_OK, window->Destroy());
177 }
178 } // namespace
179 } // namespace Rosen
180 } // namespace OHOS