• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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