1 /* 2 * Copyright (c) 2024 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 #include "gtest/gtest.h" 16 #include "test/unittest/core/event/event_manager_test_ng.h" 17 18 using namespace testing; 19 using namespace testing::ext; 20 namespace OHOS::Ace::NG { 21 22 class HoverEventTargetTest : public HoverEventTarget { 23 DECLARE_ACE_TYPE(HoverEventTargetTest, HoverEventTarget); 24 25 public: HoverEventTargetTest(const std::string & nodeName,int32_t nodeId,bool setStopPropagation=false,int32_t expectedResult=0,bool expectedHoverIn=true)26 HoverEventTargetTest(const std::string& nodeName, int32_t nodeId, bool setStopPropagation = false, 27 int32_t expectedResult = 0, bool expectedHoverIn = true) 28 : HoverEventTarget(nodeName, nodeId), setStopPropagation_(setStopPropagation), expectedResult_(expectedResult), 29 expectedHoveIn_(expectedHoverIn) 30 { 31 SetCallback([this](bool isHoverIn, HoverInfo& info) { 32 // set stop propagation 33 info.SetStopPropagation(setStopPropagation_); 34 isHoverIn_ = isHoverIn; 35 callbackInvokeCount_++; 36 }); 37 } 38 GetCallbackInvokeCount() const39 int32_t GetCallbackInvokeCount() const 40 { 41 return callbackInvokeCount_; 42 } 43 ResetCallbackInvokeCount()44 void ResetCallbackInvokeCount() 45 { 46 callbackInvokeCount_ = 0; 47 } 48 GetExpectedResult() const49 int32_t GetExpectedResult() const 50 { 51 return expectedResult_; 52 } 53 GetIsHoveIn() const54 bool GetIsHoveIn() const 55 { 56 return isHoverIn_; 57 } 58 ResetIsHoveIn()59 void ResetIsHoveIn() 60 { 61 isHoverIn_ = false; 62 } 63 CheckExpectResult() const64 bool CheckExpectResult() const 65 { 66 return callbackInvokeCount_ == expectedResult_ && isHoverIn_ == expectedHoveIn_; 67 } 68 SetStopPropagation(bool flag)69 void SetStopPropagation(bool flag) 70 { 71 setStopPropagation_ = flag; 72 } 73 74 private: 75 bool setStopPropagation_ = false; 76 int32_t callbackInvokeCount_ = 0; 77 bool isHoverIn_ = false; 78 int32_t expectedResult_ = 0; 79 bool expectedHoveIn_ = false; 80 }; 81 82 class EventManagerDispatchMouseHoverEventNG : public EventManagerTestNg { 83 public: SetUpTestSuite()84 static void SetUpTestSuite() 85 { 86 EventManagerTestNg::SetUpTestSuite(); 87 } TearDownTestSuite()88 static void TearDownTestSuite() 89 { 90 EventManagerTestNg::TearDownTestSuite(); 91 } 92 }; 93 94 /** 95 * @tc.name: EventManagerDispatchMouseHoverEventNG001 96 * @tc.desc: hove in event only will be invoked once. 97 * @tc.type: FUNC 98 */ 99 100 HWTEST_F(EventManagerDispatchMouseHoverEventNG, EventManagerDispatchMouseHoverEventNG001, TestSize.Level1) 101 { 102 /** 103 * @tc.steps: step1. Create EventManager. 104 * @tc.expected: eventManager is not null. 105 */ 106 auto eventManager = AceType::MakeRefPtr<EventManager>(); 107 ASSERT_NE(eventManager, nullptr); 108 109 TouchTestResult testCases = { 110 AceType::MakeRefPtr<HoverEventTargetTest>("0", 0, false, 1, true), 111 AceType::MakeRefPtr<HoverEventTargetTest>("1", 1, false, 1, true), 112 AceType::MakeRefPtr<HoverEventTargetTest>("2", 2, false, 1, true), 113 AceType::MakeRefPtr<HoverEventTargetTest>("3", 3, false, 1, true), 114 }; 115 116 /** 117 * @tc.steps: step2. Inject mock mouseEvent, mock mouse event not leave current node 118 * @tc.expected: hove in event only be invoked once 119 */ 120 121 for (auto i = 0; i < 10; i++) { 122 MouseEvent event; 123 event.action = MouseAction::MOVE; 124 // mock mouse test result 125 eventManager->UpdateHoverNode(event, testCases); 126 auto result = eventManager->DispatchMouseHoverEventNG(event); 127 // result of DispatchMouseHoverEventNG always be true 128 ASSERT_TRUE(result); 129 130 for (auto iter = testCases.begin(); iter != testCases.end(); iter++) { 131 auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter); 132 ASSERT_NE(hoverEventTargetTest, nullptr); 133 134 EXPECT_TRUE(hoverEventTargetTest->CheckExpectResult()); 135 } 136 } 137 } 138 139 /** 140 * @tc.name: EventManagerDispatchMouseHoverEventNG002 141 * @tc.desc: test stop progration can stop hove in event dispatch. 142 * @tc.type: FUNC 143 */ 144 145 HWTEST_F(EventManagerDispatchMouseHoverEventNG, EventManagerDispatchMouseHoverEventNG002, TestSize.Level1) 146 { 147 /** 148 * @tc.steps: step1. Create EventManager. 149 * @tc.expected: eventManager is not null. 150 */ 151 auto eventManager = AceType::MakeRefPtr<EventManager>(); 152 ASSERT_NE(eventManager, nullptr); 153 154 TouchTestResult testCases = { 155 AceType::MakeRefPtr<HoverEventTargetTest>("0", 0, false, 1, true), 156 AceType::MakeRefPtr<HoverEventTargetTest>("1", 1, true, 1, true), // this target stop progration the hove event 157 AceType::MakeRefPtr<HoverEventTargetTest>("2", 2, false, 0, false), 158 AceType::MakeRefPtr<HoverEventTargetTest>("3", 3, false, 0, false), 159 }; 160 161 /** 162 * @tc.steps: step2. Inject mock mouseEvent, suppose mock mouse event not leave current node 163 * @tc.expected: when some one stop progration ohter targets can not be invoked. 164 */ 165 166 for (auto i = 0; i < 10; i++) { 167 MouseEvent event; 168 event.action = MouseAction::MOVE; 169 // mock mouse test result 170 eventManager->UpdateHoverNode(event, testCases); 171 auto result = eventManager->DispatchMouseHoverEventNG(event); 172 // result of DispatchMouseHoverEventNG always be true 173 ASSERT_TRUE(result); 174 175 for (auto iter = testCases.begin(); iter != testCases.end(); iter++) { 176 auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter); 177 ASSERT_NE(hoverEventTargetTest, nullptr); 178 179 EXPECT_TRUE(hoverEventTargetTest->CheckExpectResult()); 180 } 181 } 182 } 183 184 /** 185 * @tc.name: EventManagerDispatchMouseHoverEventNG003 186 * @tc.desc: test hove out event dispatch and stop progration no work for hove out event dispatch 187 * @tc.type: FUNC 188 */ 189 190 HWTEST_F(EventManagerDispatchMouseHoverEventNG, EventManagerDispatchMouseHoverEventNG003, TestSize.Level1) 191 { 192 /** 193 * @tc.steps: step1. Create EventManager. 194 * @tc.expected: eventManager is not null. 195 */ 196 auto eventManager = AceType::MakeRefPtr<EventManager>(); 197 ASSERT_NE(eventManager, nullptr); 198 199 std::vector<RefPtr<HoverEventTargetTest>> testCases = { 200 AceType::MakeRefPtr<HoverEventTargetTest>("0", 0, false, 1, true), 201 AceType::MakeRefPtr<HoverEventTargetTest>("1", 1, false, 1, true), 202 AceType::MakeRefPtr<HoverEventTargetTest>("2", 2, false, 1, true), 203 AceType::MakeRefPtr<HoverEventTargetTest>("3", 3, false, 1, true), 204 }; 205 206 /** 207 * @tc.steps: step2. Create a scene of hove in. 208 * @tc.expected: All hove target will be invoked once hove in. 209 */ 210 211 TouchTestResult mouseTouchTestResult1(testCases.begin(), testCases.end()); 212 MouseEvent event; 213 event.action = MouseAction::MOVE; 214 eventManager->UpdateHoverNode(event, mouseTouchTestResult1); 215 eventManager->DispatchMouseHoverEventNG(event); 216 for (auto iter = mouseTouchTestResult1.begin(); iter != mouseTouchTestResult1.end(); iter++) { 217 auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter); 218 ASSERT_NE(hoverEventTargetTest, nullptr); 219 220 EXPECT_TRUE(hoverEventTargetTest->CheckExpectResult()); 221 } 222 223 /** 224 * @tc.steps: step3. Cerate as scene of hove out, suppose item 0 and item 3 can not be touch test. 225 */ 226 TouchTestResult mouseTouchTestResult2; 227 testCases[0]->ResetCallbackInvokeCount(); 228 testCases[0]->SetStopPropagation(false); // item 0 set stop progration 229 mouseTouchTestResult2.emplace_back(testCases[1]); 230 mouseTouchTestResult2.emplace_back(testCases[2]); 231 testCases[3]->ResetCallbackInvokeCount(); 232 233 /** 234 * @tc.steps: step4. Inject mock mouseEvent 10 times, suppose mock mouse event leave item 0 and item 3 235 * @tc.expected: item 0 and item 3 can be invoke once hove out, other targets have no change. 236 */ 237 for (auto i = 0; i < 10; i++) { 238 MouseEvent event; 239 event.action = MouseAction::MOVE; 240 eventManager->UpdateHoverNode(event, mouseTouchTestResult2); 241 auto result = eventManager->DispatchMouseHoverEventNG(event); 242 // result of DispatchMouseHoverEventNG always be true 243 ASSERT_TRUE(result); 244 } 245 246 EXPECT_EQ(testCases[0]->GetCallbackInvokeCount(), 1); 247 EXPECT_FALSE(testCases[0]->GetIsHoveIn()); 248 EXPECT_EQ(testCases[3]->GetCallbackInvokeCount(), 1); 249 EXPECT_FALSE(testCases[3]->GetIsHoveIn()); 250 251 for (auto iter = mouseTouchTestResult2.begin(); iter != mouseTouchTestResult2.end(); iter++) { 252 auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter); 253 ASSERT_NE(hoverEventTargetTest, nullptr); 254 255 EXPECT_EQ(hoverEventTargetTest->GetCallbackInvokeCount(), 1); 256 EXPECT_TRUE(hoverEventTargetTest->GetIsHoveIn()); 257 } 258 } 259 } // namespace OHOS::Ace::NG