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