• 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     for (auto i = 0; i < 10; i++) {
166         MouseEvent event;
167         event.action = MouseAction::MOVE;
168         // mock mouse test result
169         eventManager->UpdateHoverNode(event, testCases);
170         auto result = eventManager->DispatchMouseHoverEventNG(event);
171         // result of DispatchMouseHoverEventNG always be true
172         ASSERT_TRUE(result);
173 
174         for (auto iter = testCases.begin(); iter != testCases.end(); iter++) {
175             auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter);
176             ASSERT_NE(hoverEventTargetTest, nullptr);
177 
178             EXPECT_TRUE(hoverEventTargetTest->CheckExpectResult());
179         }
180     }
181 }
182 
183 /**
184  * @tc.name: EventManagerDispatchMouseHoverEventNG003
185  * @tc.desc: test hove out event dispatch and stop progration no work for hove out event dispatch
186  * @tc.type: FUNC
187  */
188 
189 HWTEST_F(EventManagerDispatchMouseHoverEventNG, EventManagerDispatchMouseHoverEventNG003, TestSize.Level1)
190 {
191     /**
192      * @tc.steps: step1. Create EventManager.
193      * @tc.expected: eventManager is not null.
194      */
195     auto eventManager = AceType::MakeRefPtr<EventManager>();
196     ASSERT_NE(eventManager, nullptr);
197 
198     std::vector<RefPtr<HoverEventTargetTest>> testCases = {
199         AceType::MakeRefPtr<HoverEventTargetTest>("0", 0, false, 1, true),
200         AceType::MakeRefPtr<HoverEventTargetTest>("1", 1, false, 1, true),
201         AceType::MakeRefPtr<HoverEventTargetTest>("2", 2, false, 1, true),
202         AceType::MakeRefPtr<HoverEventTargetTest>("3", 3, false, 1, true),
203     };
204 
205     /**
206      * @tc.steps: step2. Create a scene of hove in.
207      * @tc.expected: All hove target will be invoked once hove in.
208      */
209 
210     TouchTestResult mouseTouchTestResult1(testCases.begin(), testCases.end());
211     MouseEvent event;
212     event.action = MouseAction::MOVE;
213     eventManager->UpdateHoverNode(event, mouseTouchTestResult1);
214     eventManager->DispatchMouseHoverEventNG(event);
215     for (auto iter = mouseTouchTestResult1.begin(); iter != mouseTouchTestResult1.end(); iter++) {
216         auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter);
217         ASSERT_NE(hoverEventTargetTest, nullptr);
218 
219         EXPECT_TRUE(hoverEventTargetTest->CheckExpectResult());
220     }
221 
222     /**
223      * @tc.steps: step3. Cerate as scene of hove out, suppose item 0 and item 3 can not be touch test.
224      */
225     TouchTestResult mouseTouchTestResult2;
226     testCases[0]->ResetCallbackInvokeCount();
227     testCases[0]->SetStopPropagation(false); // item 0 set stop progration
228     mouseTouchTestResult2.emplace_back(testCases[1]);
229     mouseTouchTestResult2.emplace_back(testCases[2]);
230     testCases[3]->ResetCallbackInvokeCount();
231 
232     /**
233      * @tc.steps: step4. Inject mock mouseEvent 10 times, suppose mock mouse event leave item 0 and item 3
234      * @tc.expected: item 0 and item 3 can be invoke once hove out, other targets have no change.
235      */
236     for (auto i = 0; i < 10; i++) {
237         MouseEvent event;
238         event.action = MouseAction::MOVE;
239         eventManager->UpdateHoverNode(event, mouseTouchTestResult2);
240         auto result = eventManager->DispatchMouseHoverEventNG(event);
241         // result of DispatchMouseHoverEventNG always be true
242         ASSERT_TRUE(result);
243     }
244 
245     EXPECT_EQ(testCases[0]->GetCallbackInvokeCount(), 1);
246     EXPECT_FALSE(testCases[0]->GetIsHoveIn());
247     EXPECT_EQ(testCases[3]->GetCallbackInvokeCount(), 1);
248     EXPECT_FALSE(testCases[3]->GetIsHoveIn());
249 
250     for (auto iter = mouseTouchTestResult2.begin(); iter != mouseTouchTestResult2.end(); iter++) {
251         auto hoverEventTargetTest = AceType::DynamicCast<HoverEventTargetTest>(*iter);
252         ASSERT_NE(hoverEventTargetTest, nullptr);
253 
254         EXPECT_EQ(hoverEventTargetTest->GetCallbackInvokeCount(), 1);
255         EXPECT_TRUE(hoverEventTargetTest->GetIsHoveIn());
256     }
257 }
258 } // namespace OHOS::Ace::NG