1 /*
2 * Copyright (c) 2025 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 #include "test/unittest/core/manager/drag_drop/drag_drop_initiating_test_ng.h"
17
18 #define private public
19 #define protected public
20
21 #include "core/components_ng/manager/drag_drop/drag_drop_initiating/drag_drop_initiating_handler.h"
22 #include "core/components_ng/manager/drag_drop/drag_drop_initiating/drag_drop_initiating_state_moving.h"
23 #include "core/event/touch_event.h"
24 #include "core/gestures/drag_event.h"
25
26 using namespace testing;
27 using namespace testing::ext;
28
29 namespace OHOS::Ace::NG {
30 struct DragDropInitiatingStateMovingTestCase : public DragDropInitiatingStateTestCase {
31 SourceType sourceType = SourceType::TOUCH;
DragDropInitiatingStateMovingTestCaseOHOS::Ace::NG::DragDropInitiatingStateMovingTestCase32 DragDropInitiatingStateMovingTestCase(
33 DragDropInitiatingReceivedInput receivedInput, DragDropInitiatingStatus expectStatus, SourceType sourceType)
34 : DragDropInitiatingStateTestCase(DragDropInitiatingStatus::MOVING, receivedInput, expectStatus),
35 sourceType(sourceType)
36 {}
37 };
38
39 const std::vector<DragDropInitiatingStateMovingTestCase> DRAG_DROP_INITIATING_STATE_MOVING_IMAGE_TEST_CASES = {
40 DragDropInitiatingStateMovingTestCase(
41 DragDropInitiatingReceivedInput::HandleHitTesting, DragDropInitiatingStatus::MOVING, SourceType::TOUCH),
42 DragDropInitiatingStateMovingTestCase(
43 DragDropInitiatingReceivedInput::HandleHitTesting, DragDropInitiatingStatus::MOVING, SourceType::MOUSE),
44 DragDropInitiatingStateMovingTestCase(
45 DragDropInitiatingReceivedInput::HandlePanOnActionStart, DragDropInitiatingStatus::MOVING, SourceType::TOUCH),
46 DragDropInitiatingStateMovingTestCase(
47 DragDropInitiatingReceivedInput::HandlePanOnActionStart, DragDropInitiatingStatus::MOVING, SourceType::MOUSE),
48 DragDropInitiatingStateMovingTestCase(
49 DragDropInitiatingReceivedInput::HandlePanOnActionEnd, DragDropInitiatingStatus::IDLE, SourceType::TOUCH),
50 DragDropInitiatingStateMovingTestCase(
51 DragDropInitiatingReceivedInput::HandlePanOnActionEnd, DragDropInitiatingStatus::IDLE, SourceType::MOUSE),
52 DragDropInitiatingStateMovingTestCase(
53 DragDropInitiatingReceivedInput::HandleTouchEvent, DragDropInitiatingStatus::MOVING, SourceType::MOUSE),
54 DragDropInitiatingStateMovingTestCase(
55 DragDropInitiatingReceivedInput::HandlePullEvent, DragDropInitiatingStatus::MOVING, SourceType::MOUSE),
56 DragDropInitiatingStateMovingTestCase(
57 DragDropInitiatingReceivedInput::HandleReStartDrag, DragDropInitiatingStatus::MOVING, SourceType::MOUSE),
58 DragDropInitiatingStateMovingTestCase(
59 DragDropInitiatingReceivedInput::HandleDragStart, DragDropInitiatingStatus::MOVING, SourceType::MOUSE),
60 DragDropInitiatingStateMovingTestCase(
61 DragDropInitiatingReceivedInput::HandleDragEnd, DragDropInitiatingStatus::IDLE, SourceType::MOUSE),
62 DragDropInitiatingStateMovingTestCase(
63 DragDropInitiatingReceivedInput::TransDragWindowToFwk, DragDropInitiatingStatus::IDLE, SourceType::MOUSE),
64 DragDropInitiatingStateMovingTestCase(
65 DragDropInitiatingReceivedInput::TransMenuShow, DragDropInitiatingStatus::IDLE, SourceType::MOUSE),
66 };
67
SetUpTestCase()68 void DragDropInitiatingStateMovingTestNG::SetUpTestCase()
69 {
70 MockPipelineContext::SetUp();
71 MockContainer::SetUp();
72 }
73
TearDownTestCase()74 void DragDropInitiatingStateMovingTestNG::TearDownTestCase()
75 {
76 MockPipelineContext::TearDown();
77 MockContainer::TearDown();
78 }
79
80 /**
81 * @tc.name: DragDropInitiatingStateMovingTestNG001
82 * @tc.desc: Test DragDropInitiatingStateMoving class when frameNode is image.
83 * @tc.type: FUNC
84 */
85 HWTEST_F(DragDropInitiatingStateMovingTestNG, DragDropInitiatingStateMovingTestNG001, TestSize.Level1)
86 {
87 int32_t caseNum = 0;
88 for (const auto& testCase : DRAG_DROP_INITIATING_STATE_MOVING_IMAGE_TEST_CASES) {
89 /**
90 * @tc.steps: step1. create DragDropEventActuator.
91 */
92 auto eventHub = AceType::MakeRefPtr<EventHub>();
93 ASSERT_NE(eventHub, nullptr);
94 auto gestureEventHub = AceType::MakeRefPtr<GestureEventHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
95 ASSERT_NE(gestureEventHub, nullptr);
96 auto frameNode = FrameNode::GetOrCreateFrameNode(V2::IMAGE_ETS_TAG,
__anon18c2a9de0102() 97 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ImagePattern>(); });
98 ASSERT_NE(frameNode, nullptr);
99 eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode));
100 auto dragDropEventActuator =
101 AceType::MakeRefPtr<DragDropEventActuator>(AceType::WeakClaim(AceType::RawPtr(gestureEventHub)));
102 ASSERT_NE(dragDropEventActuator, nullptr);
103 auto handler = dragDropEventActuator->dragDropInitiatingHandler_;
104 ASSERT_NE(handler, nullptr);
105 auto machine = handler->initiatingFlow_;
106 ASSERT_NE(machine, nullptr);
107 machine->InitializeState();
108 machine->currentState_ = static_cast<int32_t>(testCase.originStatus);
109 if (((static_cast<int32_t>(testCase.receivedInput)) & DRAG_ACTION_NONE_ARGS) != 0) {
110 DragDropInitiatingStateTestNG::DoMachineAction(machine, testCase.receivedInput);
111 } else if (((static_cast<int32_t>(testCase.receivedInput)) & DRAG_ACTION_DRAG_POINTER_EVENT_ARGS) != 0) {
112 DragPointerEvent dragPointerEvent;
113 DragDropInitiatingStateTestNG::DoMachineAction(machine, testCase.receivedInput, dragPointerEvent);
114 } else if (((static_cast<int32_t>(testCase.receivedInput)) & DRAG_ACTION_TOUCH_EVENT_ARGS) != 0) {
115 TouchEvent touchEvent;
116 touchEvent.sourceType = testCase.sourceType;
117 DragDropInitiatingStateTestNG::DoMachineAction(machine, testCase.receivedInput, touchEvent);
118 } else if (((static_cast<int32_t>(testCase.receivedInput)) & DRAG_ACTION_GESTURE_EVENT_ARGS) != 0) {
119 GestureEvent info;
120 info.SetSourceDevice(testCase.sourceType);
121 DragDropInitiatingStateTestNG::DoMachineAction(machine, testCase.receivedInput, info);
122 }
123 EXPECT_TRUE(DragDropInitiatingStateTestNG::CheckDragDropInitiatingStatus(
124 caseNum, static_cast<DragDropInitiatingStatus>(machine->currentState_), testCase.expectStatus));
125 caseNum++;
126 }
127 }
128
129 } // namespace OHOS::Ace::NG