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// gtest 17e0dac50fSopenharmony_ci#include <gtest/gtest.h> 18e0dac50fSopenharmony_ci#include "window_test_utils.h" 19e0dac50fSopenharmony_ci#include "wm_common.h" 20e0dac50fSopenharmony_ci 21e0dac50fSopenharmony_ciusing namespace testing; 22e0dac50fSopenharmony_ciusing namespace testing::ext; 23e0dac50fSopenharmony_ci 24e0dac50fSopenharmony_cinamespace OHOS { 25e0dac50fSopenharmony_cinamespace Rosen { 26e0dac50fSopenharmony_ciusing Utils = WindowTestUtils; 27e0dac50fSopenharmony_ciconst int WAIT_CALLBACK_US = 1; // 1s 28e0dac50fSopenharmony_ci 29e0dac50fSopenharmony_ciclass TestDragListener : public IWindowDragListener { 30e0dac50fSopenharmony_cipublic: 31e0dac50fSopenharmony_ci PointInfo point_ { 0, 0 }; 32e0dac50fSopenharmony_ci DragEvent event_ = DragEvent::DRAG_EVENT_END; 33e0dac50fSopenharmony_ci void OnDrag(int32_t x, int32_t y, DragEvent event) override; 34e0dac50fSopenharmony_ci}; 35e0dac50fSopenharmony_ci 36e0dac50fSopenharmony_civoid TestDragListener::OnDrag(int32_t x, int32_t y, DragEvent event) 37e0dac50fSopenharmony_ci{ 38e0dac50fSopenharmony_ci event_ = event; 39e0dac50fSopenharmony_ci point_.x = x; 40e0dac50fSopenharmony_ci point_.y = y; 41e0dac50fSopenharmony_ci} 42e0dac50fSopenharmony_ci 43e0dac50fSopenharmony_ciclass WindowDragTest : public testing::Test { 44e0dac50fSopenharmony_cipublic: 45e0dac50fSopenharmony_ci static void SetUpTestCase(); 46e0dac50fSopenharmony_ci static void TearDownTestCase(); 47e0dac50fSopenharmony_ci virtual void SetUp() override; 48e0dac50fSopenharmony_ci virtual void TearDown() override; 49e0dac50fSopenharmony_ci 50e0dac50fSopenharmony_ci static sptr<TestDragListener> firstWindowDragListener_; 51e0dac50fSopenharmony_ci static sptr<TestDragListener> secondWindowDragListener_; 52e0dac50fSopenharmony_ci Utils::TestWindowInfo dragWindowInfo_; 53e0dac50fSopenharmony_ci Utils::TestWindowInfo firstWindowInfo_; 54e0dac50fSopenharmony_ci Utils::TestWindowInfo secondWindowInfo_; 55e0dac50fSopenharmony_ci std::vector<sptr<Window>> activeWindows_; 56e0dac50fSopenharmony_ci}; 57e0dac50fSopenharmony_ci 58e0dac50fSopenharmony_cisptr<TestDragListener> WindowDragTest::firstWindowDragListener_ = 59e0dac50fSopenharmony_ci new TestDragListener(); 60e0dac50fSopenharmony_cisptr<TestDragListener> WindowDragTest::secondWindowDragListener_ = 61e0dac50fSopenharmony_ci new TestDragListener(); 62e0dac50fSopenharmony_ci 63e0dac50fSopenharmony_civoid WindowDragTest::SetUpTestCase() {} 64e0dac50fSopenharmony_ci 65e0dac50fSopenharmony_civoid WindowDragTest::TearDownTestCase() {} 66e0dac50fSopenharmony_ci 67e0dac50fSopenharmony_civoid WindowDragTest::SetUp() 68e0dac50fSopenharmony_ci{ 69e0dac50fSopenharmony_ci dragWindowInfo_ = { 70e0dac50fSopenharmony_ci .name = "dragWindow", 71e0dac50fSopenharmony_ci .rect = {200, 200, 380, 380}, 72e0dac50fSopenharmony_ci .type = WindowType::WINDOW_TYPE_DRAGGING_EFFECT, 73e0dac50fSopenharmony_ci .mode = WindowMode::WINDOW_MODE_FLOATING, 74e0dac50fSopenharmony_ci .needAvoid = false, 75e0dac50fSopenharmony_ci .parentLimit = false, 76e0dac50fSopenharmony_ci .showWhenLocked = true, 77e0dac50fSopenharmony_ci .parentId = INVALID_WINDOW_ID, 78e0dac50fSopenharmony_ci }; 79e0dac50fSopenharmony_ci 80e0dac50fSopenharmony_ci firstWindowInfo_ = { 81e0dac50fSopenharmony_ci .name = "firstWindow", 82e0dac50fSopenharmony_ci .rect = Utils::customAppRect_, 83e0dac50fSopenharmony_ci .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 84e0dac50fSopenharmony_ci .mode = WindowMode::WINDOW_MODE_FULLSCREEN, 85e0dac50fSopenharmony_ci .needAvoid = false, 86e0dac50fSopenharmony_ci .parentLimit = false, 87e0dac50fSopenharmony_ci .showWhenLocked = true, 88e0dac50fSopenharmony_ci .parentId = INVALID_WINDOW_ID, 89e0dac50fSopenharmony_ci }; 90e0dac50fSopenharmony_ci 91e0dac50fSopenharmony_ci secondWindowInfo_ = { 92e0dac50fSopenharmony_ci .name = "secondWindow", 93e0dac50fSopenharmony_ci .rect = Utils::customAppRect_, 94e0dac50fSopenharmony_ci .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, 95e0dac50fSopenharmony_ci .mode = WindowMode::WINDOW_MODE_FLOATING, 96e0dac50fSopenharmony_ci .needAvoid = false, 97e0dac50fSopenharmony_ci .parentLimit = false, 98e0dac50fSopenharmony_ci .showWhenLocked = true, 99e0dac50fSopenharmony_ci .parentId = INVALID_WINDOW_ID, 100e0dac50fSopenharmony_ci }; 101e0dac50fSopenharmony_ci activeWindows_.clear(); 102e0dac50fSopenharmony_ci} 103e0dac50fSopenharmony_ci 104e0dac50fSopenharmony_civoid WindowDragTest::TearDown() { 105e0dac50fSopenharmony_ci while (!activeWindows_.empty()) { 106e0dac50fSopenharmony_ci ASSERT_EQ(WMError::WM_OK, activeWindows_.back()->Destroy()); 107e0dac50fSopenharmony_ci activeWindows_.pop_back(); 108e0dac50fSopenharmony_ci } 109e0dac50fSopenharmony_ci} 110e0dac50fSopenharmony_ci 111e0dac50fSopenharmony_cinamespace { 112e0dac50fSopenharmony_ci/** 113e0dac50fSopenharmony_ci * @tc.name: DragIn 114e0dac50fSopenharmony_ci * @tc.desc: Drag a window to another window 115e0dac50fSopenharmony_ci * @tc.type: FUNC 116e0dac50fSopenharmony_ci */ 117e0dac50fSopenharmony_ciHWTEST_F(WindowDragTest, DragIn, Function | MediumTest | Level3) { 118e0dac50fSopenharmony_ci const sptr<Window> &firstWindow = Utils::CreateTestWindow(firstWindowInfo_); 119e0dac50fSopenharmony_ci if (firstWindow == nullptr) { 120e0dac50fSopenharmony_ci return; 121e0dac50fSopenharmony_ci } 122e0dac50fSopenharmony_ci ASSERT_NE(firstWindow, nullptr); 123e0dac50fSopenharmony_ci activeWindows_.push_back(firstWindow); 124e0dac50fSopenharmony_ci firstWindow->RegisterDragListener(firstWindowDragListener_); 125e0dac50fSopenharmony_ci firstWindow->SetTurnScreenOn(true); 126e0dac50fSopenharmony_ci firstWindow->Show(); 127e0dac50fSopenharmony_ci 128e0dac50fSopenharmony_ci const sptr<Window> &dragWindow = Utils::CreateTestWindow(dragWindowInfo_); 129e0dac50fSopenharmony_ci ASSERT_NE(dragWindow, nullptr); 130e0dac50fSopenharmony_ci activeWindows_.push_back(dragWindow); 131e0dac50fSopenharmony_ci dragWindow->Show(); 132e0dac50fSopenharmony_ci dragWindow->MoveTo(300, 300); 133e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 134e0dac50fSopenharmony_ci 135e0dac50fSopenharmony_ci ASSERT_EQ(300, firstWindowDragListener_->point_.x); 136e0dac50fSopenharmony_ci ASSERT_EQ(300, firstWindowDragListener_->point_.y); 137e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_IN, firstWindowDragListener_->event_); 138e0dac50fSopenharmony_ci 139e0dac50fSopenharmony_ci firstWindow->UnregisterDragListener(firstWindowDragListener_); 140e0dac50fSopenharmony_ci} 141e0dac50fSopenharmony_ci 142e0dac50fSopenharmony_ci/** 143e0dac50fSopenharmony_ci * @tc.name: DragMove 144e0dac50fSopenharmony_ci * @tc.desc: Window Move 145e0dac50fSopenharmony_ci * @tc.type: FUNC 146e0dac50fSopenharmony_ci */ 147e0dac50fSopenharmony_ciHWTEST_F(WindowDragTest, DragMove, Function | MediumTest | Level3) { 148e0dac50fSopenharmony_ci const sptr<Window> &firstWindow = Utils::CreateTestWindow(firstWindowInfo_); 149e0dac50fSopenharmony_ci if (firstWindow == nullptr) { 150e0dac50fSopenharmony_ci return; 151e0dac50fSopenharmony_ci } 152e0dac50fSopenharmony_ci ASSERT_NE(firstWindow, nullptr); 153e0dac50fSopenharmony_ci activeWindows_.push_back(firstWindow); 154e0dac50fSopenharmony_ci firstWindow->RegisterDragListener(firstWindowDragListener_); 155e0dac50fSopenharmony_ci firstWindow->SetTurnScreenOn(true); 156e0dac50fSopenharmony_ci firstWindow->Show(); 157e0dac50fSopenharmony_ci 158e0dac50fSopenharmony_ci const sptr<Window> &dragWindow = Utils::CreateTestWindow(dragWindowInfo_); 159e0dac50fSopenharmony_ci ASSERT_NE(dragWindow, nullptr); 160e0dac50fSopenharmony_ci activeWindows_.push_back(dragWindow); 161e0dac50fSopenharmony_ci dragWindow->Show(); 162e0dac50fSopenharmony_ci dragWindow->MoveTo(300, 300); 163e0dac50fSopenharmony_ci 164e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 165e0dac50fSopenharmony_ci ASSERT_EQ(300, firstWindowDragListener_->point_.x); 166e0dac50fSopenharmony_ci ASSERT_EQ(300, firstWindowDragListener_->point_.y); 167e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_IN, firstWindowDragListener_->event_); 168e0dac50fSopenharmony_ci 169e0dac50fSopenharmony_ci dragWindow->MoveTo(400, 400); 170e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 171e0dac50fSopenharmony_ci ASSERT_EQ(400, firstWindowDragListener_->point_.x); 172e0dac50fSopenharmony_ci ASSERT_EQ(400, firstWindowDragListener_->point_.y); 173e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_MOVE, firstWindowDragListener_->event_); 174e0dac50fSopenharmony_ci 175e0dac50fSopenharmony_ci firstWindow->UnregisterDragListener(firstWindowDragListener_); 176e0dac50fSopenharmony_ci} 177e0dac50fSopenharmony_ci 178e0dac50fSopenharmony_ci/** 179e0dac50fSopenharmony_ci * @tc.name: DragOut 180e0dac50fSopenharmony_ci * @tc.desc: Drag the drag window out of the current window 181e0dac50fSopenharmony_ci * @tc.type: FUNC 182e0dac50fSopenharmony_ci */ 183e0dac50fSopenharmony_ciHWTEST_F(WindowDragTest, DragOut, Function | MediumTest | Level3) { 184e0dac50fSopenharmony_ci const sptr<Window> &firstWindow = Utils::CreateTestWindow(firstWindowInfo_); 185e0dac50fSopenharmony_ci if (firstWindow == nullptr) { 186e0dac50fSopenharmony_ci return; 187e0dac50fSopenharmony_ci } 188e0dac50fSopenharmony_ci ASSERT_NE(firstWindow, nullptr); 189e0dac50fSopenharmony_ci activeWindows_.push_back(firstWindow); 190e0dac50fSopenharmony_ci firstWindow->RegisterDragListener(firstWindowDragListener_); 191e0dac50fSopenharmony_ci firstWindow->SetTurnScreenOn(true); 192e0dac50fSopenharmony_ci firstWindow->Show(); 193e0dac50fSopenharmony_ci 194e0dac50fSopenharmony_ci secondWindowInfo_.rect = {500, 500, 500, 500}; 195e0dac50fSopenharmony_ci const sptr<Window> &secondWindow = Utils::CreateTestWindow(secondWindowInfo_); 196e0dac50fSopenharmony_ci ASSERT_NE(secondWindow, nullptr); 197e0dac50fSopenharmony_ci activeWindows_.push_back(secondWindow); 198e0dac50fSopenharmony_ci secondWindow->RegisterDragListener(secondWindowDragListener_); 199e0dac50fSopenharmony_ci secondWindow->Show(); 200e0dac50fSopenharmony_ci 201e0dac50fSopenharmony_ci const sptr<Window> &dragWindow = Utils::CreateTestWindow(dragWindowInfo_); 202e0dac50fSopenharmony_ci ASSERT_NE(secondWindow, nullptr); 203e0dac50fSopenharmony_ci activeWindows_.push_back(dragWindow); 204e0dac50fSopenharmony_ci dragWindow->Show(); 205e0dac50fSopenharmony_ci dragWindow->MoveTo(300, 300); 206e0dac50fSopenharmony_ci 207e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 208e0dac50fSopenharmony_ci ASSERT_EQ(300, firstWindowDragListener_->point_.x); 209e0dac50fSopenharmony_ci ASSERT_EQ(300, firstWindowDragListener_->point_.y); 210e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_IN, firstWindowDragListener_->event_); 211e0dac50fSopenharmony_ci 212e0dac50fSopenharmony_ci dragWindow->MoveTo(400, 400); 213e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 214e0dac50fSopenharmony_ci ASSERT_EQ(400, firstWindowDragListener_->point_.x); 215e0dac50fSopenharmony_ci ASSERT_EQ(400, firstWindowDragListener_->point_.y); 216e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_MOVE, firstWindowDragListener_->event_); 217e0dac50fSopenharmony_ci 218e0dac50fSopenharmony_ci dragWindow->MoveTo(600, 600); 219e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 220e0dac50fSopenharmony_ci ASSERT_EQ(100, secondWindowDragListener_->point_.x); 221e0dac50fSopenharmony_ci ASSERT_EQ(100, secondWindowDragListener_->point_.y); 222e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_IN, secondWindowDragListener_->event_); 223e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_OUT, firstWindowDragListener_->event_); 224e0dac50fSopenharmony_ci 225e0dac50fSopenharmony_ci firstWindow->UnregisterDragListener(firstWindowDragListener_); 226e0dac50fSopenharmony_ci secondWindow->UnregisterDragListener(secondWindowDragListener_); 227e0dac50fSopenharmony_ci} 228e0dac50fSopenharmony_ci 229e0dac50fSopenharmony_ci/** 230e0dac50fSopenharmony_ci * @tc.name: DragEnd 231e0dac50fSopenharmony_ci * @tc.desc: End window drag 232e0dac50fSopenharmony_ci * @tc.type: FUNC 233e0dac50fSopenharmony_ci */ 234e0dac50fSopenharmony_ciHWTEST_F(WindowDragTest, DragEnd, Function | MediumTest | Level3) { 235e0dac50fSopenharmony_ci const sptr<Window> firstWindow = Utils::CreateTestWindow(firstWindowInfo_); 236e0dac50fSopenharmony_ci if (firstWindow == nullptr) { 237e0dac50fSopenharmony_ci return; 238e0dac50fSopenharmony_ci } 239e0dac50fSopenharmony_ci ASSERT_NE(nullptr, firstWindow); 240e0dac50fSopenharmony_ci firstWindow->RegisterDragListener(firstWindowDragListener_); 241e0dac50fSopenharmony_ci firstWindow->SetTurnScreenOn(true); 242e0dac50fSopenharmony_ci firstWindow->Show(); 243e0dac50fSopenharmony_ci 244e0dac50fSopenharmony_ci const sptr<Window> dragWindow = Utils::CreateTestWindow(dragWindowInfo_); 245e0dac50fSopenharmony_ci ASSERT_NE(nullptr, dragWindow); 246e0dac50fSopenharmony_ci dragWindow->Show(); 247e0dac50fSopenharmony_ci dragWindow->MoveTo(199, 199); 248e0dac50fSopenharmony_ci 249e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 250e0dac50fSopenharmony_ci dragWindow->Destroy(); 251e0dac50fSopenharmony_ci sleep(WAIT_CALLBACK_US); 252e0dac50fSopenharmony_ci ASSERT_EQ(DragEvent::DRAG_EVENT_END, firstWindowDragListener_->event_); 253e0dac50fSopenharmony_ci 254e0dac50fSopenharmony_ci firstWindow->UnregisterDragListener(firstWindowDragListener_); 255e0dac50fSopenharmony_ci firstWindow->Destroy(); 256e0dac50fSopenharmony_ci} 257e0dac50fSopenharmony_ci} // namespace 258e0dac50fSopenharmony_ci} // namespace Rosen 259e0dac50fSopenharmony_ci} // namespace OHOS 260