• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "test/unittest/core/event/focus_hub_test_ng.h"
16 #include "gtest/gtest.h"
17 #include "core/components_ng/event/focus_event_handler.h"
18 #include "core/event/focus_axis_event.h"
19 
20 using namespace testing;
21 using namespace testing::ext;
22 
23 namespace OHOS::Ace::NG {
SetUpTestSuite()24 void FocusHubTestNg::SetUpTestSuite()
25 {
26     MockPipelineContext::SetUp();
27     GTEST_LOG_(INFO) << "FocusHubTestNg SetUpTestCase";
28 }
29 
TearDownTestSuite()30 void FocusHubTestNg::TearDownTestSuite()
31 {
32     MockPipelineContext::TearDown();
33     GTEST_LOG_(INFO) << "FocusHubTestNg TearDownTestCase";
34 }
35 
SetUp()36 void FocusHubTestNg::SetUp() {}
37 
TearDown()38 void FocusHubTestNg::TearDown()
39 {
40     auto context = MockPipelineContext::GetCurrent();
41     ASSERT_NE(context, nullptr);
42     ASSERT_NE(context->rootNode_, nullptr);
43     context->rootNode_->children_.clear();
44 }
45 
46 /**
47  * @tc.name: FocusHubCreateTest001
48  * @tc.desc: Create FocusHub.
49  * @tc.type: FUNC
50  */
51 HWTEST_F(FocusHubTestNg, FocusHubCreateTest001, TestSize.Level1)
52 {
53     /**
54      * @tc.steps: step1. Create FocusHub with passing is null as parameter.
55      * @tc.expected: eventHub_ cannot be updated.
56      */
57     auto focusHub1 = AceType::MakeRefPtr<FocusHub>(WeakPtr<EventHub>(nullptr));
58     EXPECT_TRUE(focusHub1->GetFrameNode() == nullptr);
59     EXPECT_TRUE(focusHub1->IsEnabled());
60     EXPECT_TRUE(!focusHub1->IsFocusableNode());
61 
62     /**
63      * @tc.steps: step2. Create FocusHub with the WeakPtr eventHub_ which does not own frameNode.
64      * @tc.expected: eventHub can be updated, but cannot get frameNode and its related properties.
65      */
66     RefPtr<EventHub> eventHub2 = AceType::MakeRefPtr<EventHub>();
67     auto focusHub2 = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub2)));
68     EXPECT_TRUE(focusHub2 != nullptr);
69     EXPECT_TRUE(focusHub2->GetFrameNode() == nullptr);
70     EXPECT_TRUE(focusHub2->GetGeometryNode() == nullptr);
71     EXPECT_EQ(focusHub2->GetFrameName(), "NULL");
72     EXPECT_EQ(focusHub2->GetInspectorKey(), std::nullopt);
73 
74     /**
75      * @tc.steps: step3. Invoke GetParentFocusHub without parameter.
76      * @tc.expected: FocusHub will return frameNode' parent focusHub which is also nullptr.
77      */
78     EXPECT_TRUE(focusHub2->GetParentFocusHub() == nullptr);
79 
80     /**
81      * @tc.steps: step4. Invoke GetParentFocusHub passing node as parameter which does not have parent.
82      * @tc.expected: FocusHub will return node' parent focusHub which does not exist.
83      */
84     auto node = FrameNodeOnTree(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
85     EXPECT_TRUE(focusHub2->GetParentFocusHub() == nullptr);
86 }
87 
88 /**
89  * @tc.name: FocusHubCreateTest002
90  * @tc.desc: Create FocusHub.
91  * @tc.type: FUNC
92  */
93 HWTEST_F(FocusHubTestNg, FocusHubCreateTest002, TestSize.Level1)
94 {
95     /**
96      * @tc.steps: step1. Create FocusHub with the WeakPtr eventHub_ owning frameNode.
97      * @tc.expected: eventHub can be updated and can get frameNode and its related properties.
98      */
99     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
100     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1,
101         AceType::MakeRefPtr<Pattern>());
102     eventHub->AttachHost(frameNode);
103     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
104     EXPECT_TRUE(focusHub->GetFrameNode() != nullptr);
105     EXPECT_TRUE(focusHub->GetGeometryNode() != nullptr);
106     EXPECT_EQ(focusHub->GetFrameName(), V2::TEXT_ETS_TAG);
107     EXPECT_EQ(focusHub->GetInspectorKey(), std::nullopt);
108 
109     /**
110      * @tc.steps: step2. Invoke GetParentFocusHub without passing parameter.
111      * @tc.expected: FocusHub will return frameNode' parent focusHub which is also nullptr.
112      */
113     EXPECT_TRUE(focusHub->GetParentFocusHub() == nullptr);
114 
115     /**
116      * @tc.steps: step3. Create focusHub and its frameNode has parent node.
117      * @tc.expected: FocusHub will return frameNode' parent focusHub.
118      */
119     auto nodeParent = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BLANK_ETS_TAG, -1,
120         AceType::MakeRefPtr<FlexLayoutPattern>());
121     nodeParent->GetOrCreateFocusHub();
122     frameNode->SetParent(nodeParent);
123     eventHub->AttachHost(frameNode);
124     auto focusHub2 = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
125     EXPECT_TRUE(focusHub2->GetParentFocusHub() != nullptr);
126 }
127 
128 /**
129  * @tc.name: FocusHubFlushChildrenFocusHubTest003
130  * @tc.desc: Create FocusHub and invoke FlushChildrenFocusHub.
131  * @tc.type: FUNC
132  */
133 HWTEST_F(FocusHubTestNg, FocusHubFlushChildrenFocusHubTest003, TestSize.Level1)
134 {
135     /**
136      * @tc.steps: step1. Create frameNode and add button as its children which focus type is enable.
137      */
138     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
139         AceType::MakeRefPtr<Pattern>());
140     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
141         AceType::MakeRefPtr<ButtonPattern>());
142     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
143         AceType::MakeRefPtr<ButtonPattern>());
144     child->GetOrCreateFocusHub();
145     child2->GetOrCreateFocusHub();
146     frameNode->AddChild(child);
147     frameNode->AddChild(child2);
148 
149     /**
150      * @tc.steps: step2. Create FocusHub.
151      */
152     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
153     eventHub->AttachHost(frameNode);
154     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
155 
156     /**
157      * @tc.steps: step3. Invoke FlushChildrenFocusHub to get the focusable children.
158      * @tc.expected: Button is the focusable child which will be emplace_back in focusNodes_.
159      */
160     std::list<RefPtr<FocusHub>> focusNodes;
161     focusHub->FlushChildrenFocusHub(focusNodes);
162     EXPECT_EQ(focusNodes.size(), FOCUS_NODE_SIZE);
163     EXPECT_EQ(focusHub->lastWeakFocusNode_.Upgrade(), nullptr);
164 
165     /**
166      * @tc.steps: step4. lastWeakFocusNode_ is not nullptr.
167      * @tc.expected: itLastFocusNode_ will be assigned the iter corresponding lastWeakFocusNode_ found in focusNodes_.
168      */
169     focusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(*(focusNodes.begin())));
170     EXPECT_EQ(focusHub->lastWeakFocusNode_.Upgrade(), *(focusNodes.begin()));
171 }
172 
173 /**
174  * @tc.name: FocusHubRemoveSelfTest004
175  * @tc.desc: Create FocusHub and invoke RemoveSelf.
176  * @tc.type: FUNC
177  */
178 HWTEST_F(FocusHubTestNg, FocusHubRemoveSelfTest004, TestSize.Level1)
179 {
180     /**
181      * @tc.steps: step1. Create frameNode and add its parent.
182      */
183     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1,
184         AceType::MakeRefPtr<Pattern>());
185     auto nodeParent = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BLANK_ETS_TAG, -1,
186         AceType::MakeRefPtr<FlexLayoutPattern>());
187     nodeParent->GetOrCreateFocusHub();
188     frameNode->SetParent(nodeParent);
189 
190     /**
191      * @tc.steps: step2. Create FocusHub.
192      */
193     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
194     eventHub->AttachHost(frameNode);
195     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
196 
197     /**
198      * @tc.steps: step3. Remove self.
199      * @tc.expected: The nodeParent children size is 0.
200      */
201     focusHub->focusScopeId_="1";
202     focusHub->RemoveSelf();
203     EXPECT_EQ(nodeParent->GetChildren().size(), NODE_SIZE);
204 }
205 
206 /**
207  * @tc.name: FocusHubLostFocusTest005
208  * @tc.desc: Create FocusHub and invoke LostFocus.
209  * @tc.type: FUNC
210  */
211 HWTEST_F(FocusHubTestNg, FocusHubLostFocusTest005, TestSize.Level1)
212 {
213     /**
214      * @tc.steps: step1. Create frameNode and add button as its children which focus type is enable.
215      */
216     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
217         AceType::MakeRefPtr<Pattern>());
218 
219     /**
220      * @tc.steps: step2. Create FocusHub.
221      */
222     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
223     eventHub->AttachHost(frameNode);
224     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
225 
226     /**
227      * @tc.steps: step3. Invoke LostFocus, when FocusType is DISABLE and  the blur reason is FOCUS_SWITCH.
228      * @tc.expected: currentFocus_ is false.
229      */
230     focusHub->currentFocus_ = true;
231     focusHub->LostFocus(BLUR_REASON_FOCUS_SWITCH);
232     EXPECT_EQ(focusHub->blurReason_, BLUR_REASON_FOCUS_SWITCH);
233     EXPECT_FALSE(focusHub->currentFocus_);
234 
235     /**
236      * @tc.steps: step4. Invoke LostFocus, when FocusType is NODE and  the blur reason is WINDOW_BLUR.
237      * @tc.expected: currentFocus_ is false.
238      */
239     focusHub->currentFocus_ = true;
240     focusHub->focusType_ = FocusType::NODE;
241     focusHub->LostFocus(BLUR_REASON_WINDOW_BLUR);
242     EXPECT_EQ(focusHub->blurReason_, BLUR_REASON_WINDOW_BLUR);
243     EXPECT_FALSE(focusHub->currentFocus_);
244 
245     /**
246      * @tc.steps: step5. Invoke LostFocus, when FocusType is SCOPE and  the blur reason is WINDOW_BLUR.
247      * @tc.expected: currentFocus_ is false.
248      */
249     focusHub->currentFocus_ = true;
250     focusHub->focusType_ = FocusType::SCOPE;
251     focusHub->LostFocus(BLUR_REASON_WINDOW_BLUR);
252     EXPECT_FALSE(focusHub->currentFocus_);
253 }
254 
255 /**
256  * @tc.name: FocusHubHandleKeyEventTest006
257  * @tc.desc: Create FocusHub and invoke HandleKeyEvent.
258  * @tc.type: FUNC
259  */
260 HWTEST_F(FocusHubTestNg, FocusHubHandleKeyEventTest006, TestSize.Level1)
261 {
262     /**
263      * @tc.steps: step1. Create frameNode.
264      */
265     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
266         AceType::MakeRefPtr<Pattern>());
267     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
268         AceType::MakeRefPtr<ButtonPattern>());
269     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
270         AceType::MakeRefPtr<ButtonPattern>());
271     child->GetOrCreateFocusHub();
272     child2->GetOrCreateFocusHub();
273     frameNode->AddChild(child);
274     frameNode->AddChild(child2);
275 
276     /**
277      * @tc.steps: step2. Create FocusHub.
278      */
279     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
280     eventHub->AttachHost(frameNode);
281     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
282 
283     /**
284      * @tc.steps: step3. Focus hub does not currently focused and FocusType is DISABLE.
285      * @tc.expected: Do not handle key event.
286      */
287     KeyEvent keyEvent;
288     keyEvent.code = KeyCode::TV_CONTROL_UP;
289     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
290 
291     /**
292      * @tc.steps: step4. Focus hub is currently focused, FocusType is DISABLE and key code is TV_CONTROL_UP.
293      * @tc.expected: OnKeyEventScope -> RequestNextFocus.
294      */
295     focusHub->focusType_ = FocusType::SCOPE;
296     focusHub->currentFocus_ = true;
297     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
298 }
299 
300 /**
301  * @tc.name: FocusHubTestNg007
302  * @tc.desc: Test the function IsFocusableScope.
303  * @tc.type: FUNC
304  */
305 HWTEST_F(FocusHubTestNg, FocusHubTestNg007, TestSize.Level1)
306 {
307     /**
308      * @tc.steps1: initialize parameters.
309      */
310     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
311     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
312     focusHub->focusable_ = true;
313     focusHub->parentFocusable_ = true;
314 
315     /**
316      * @tc.steps2: call the function SetEnabled with false
317      * @tc.expected: The return value of IsFocusableScope is false.
318      */
319     eventHub->SetEnabled(false);
320     EXPECT_FALSE(focusHub->IsFocusableScope());
321 
322     /**
323      * @tc.steps3: call the function SetEnabled with true.
324      * @tc.expected: The return value of IsFocusableScope is false.
325      */
326     eventHub->SetEnabled(true);
327     EXPECT_FALSE(focusHub->IsFocusableScope());
328 }
329 
330 /**
331  * @tc.name: FocusHubTestNg008
332  * @tc.desc: Test the function SetFocusable.
333  * @tc.type: FUNC
334  */
335 HWTEST_F(FocusHubTestNg, FocusHubTestNg008, TestSize.Level1)
336 {
337     /**
338      * @tc.steps1: initialize parameters.
339      * @tc.expected: The default value of focusable_ is false.
340      */
341     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
342     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
343     EXPECT_FALSE(focusHub->focusable_);
344 
345     /**
346      * @tc.steps2: Set focusable_ to true implicitly.
347      * @tc.expected: The value of focusable_ is true.
348      */
349     focusHub->SetFocusable(true, false);
350     EXPECT_TRUE(focusHub->focusable_);
351 
352     /**
353      * @tc.steps3:Set focusable_ to false explicitly.
354      * @tc.expected: The value of focusable_ is false.
355      */
356     focusHub->SetFocusable(false);
357 
358     /**
359      * @tc.steps4:Set focusable_ to true implicitly.
360      * @tc.expected: The value of focusable_ is false.
361      */
362     focusHub->SetFocusable(true, false);
363     EXPECT_FALSE(focusHub->focusable_);
364 
365     /**
366      * @tc.steps5:Set focusable_ to true explicitly.
367      * @tc.expected: The value of focusable_ is true.
368      */
369     focusHub->SetFocusable(true);
370     EXPECT_TRUE(focusHub->focusable_);
371 }
372 
373 /**
374  * @tc.name: FocusHubTestNg009
375  * @tc.desc: Test the function IsFocusable.
376  * @tc.type: FUNC
377  */
378 HWTEST_F(FocusHubTestNg, FocusHubTestNg009, TestSize.Level1)
379 {
380     /**
381      * @tc.steps1: initialize parameters.
382      */
383     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
384     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
385     eventHub->SetEnabled(false);
386 
387     /**
388      * @tc.steps2: call the function IsFocusable with FocusType::NODE
389      * @tc.expected: The return value of IsFocusable is false.
390      */
391     focusHub->SetFocusType(FocusType::NODE);
392     EXPECT_FALSE(focusHub->IsFocusable());
393 
394     /**
395      * @tc.steps3: call the function IsFocusable with FocusType::SCOPE
396      * @tc.expected: The return value of IsFocusable is false.
397      */
398     focusHub->SetFocusType(FocusType::SCOPE);
399     EXPECT_FALSE(focusHub->IsFocusable());
400 
401     /**
402      * @tc.steps4: call the function IsFocusable with FocusType::DISABLE
403      * @tc.expected: The return value of IsFocusable is false.
404      */
405     focusHub->SetFocusType(FocusType::DISABLE);
406     EXPECT_FALSE(focusHub->IsFocusable());
407 }
408 
409 /**
410  * @tc.name: FocusHubTestNg010
411  * @tc.desc: Test the function RequestFocusImmediately.
412  * @tc.type: FUNC
413  */
414 HWTEST_F(FocusHubTestNg, FocusHubTestNg0010, TestSize.Level1)
415 {
416     /**
417      * @tc.steps1: initialize parameters.
418      */
419     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
420     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
421     auto context = PipelineContext::GetCurrentContext();
422     ASSERT_NE(context, nullptr);
423 
424     /**
425      * @tc.steps2: call the function SetFocusType with currentFocus_ = false.
426      * @tc.expected: The return value of RequestFocusImmediately is false.
427      */
428     context->SetIsFocusingByTab(true);
429     focusHub->SetFocusType(FocusType::DISABLE);
430     EXPECT_FALSE(focusHub->RequestFocusImmediately());
431 
432     /**
433      * @tc.steps3: call the function SetFocusType with currentFocus_ = true
434      * @tc.expected: The return value of RequestFocusImmediately is true.
435      */
436     context->SetIsFocusingByTab(false);
437     focusHub->SetFocusType(FocusType::DISABLE);
438     focusHub->currentFocus_ = true;
439     EXPECT_TRUE(focusHub->RequestFocusImmediately());
440 }
441 
442 /**
443  * @tc.name: FocusHubTestNg011
444  * @tc.desc: Test the function LostFocus.
445  * @tc.type: FUNC
446  */
447 HWTEST_F(FocusHubTestNg, FocusHubTestNg0011, TestSize.Level1)
448 {
449     /**
450      * @tc.steps1: initialize parameters.
451      */
452     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
453     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
454 
455     /**
456      * @tc.steps2: call the function LostFocus with currentFocus_ = false.
457      * @tc.expected: The value of blurReason_ is changed to BlurReason::WINDOW_BLUR.
458      */
459     focusHub->blurReason_ = BlurReason::WINDOW_BLUR;
460     focusHub->currentFocus_ = false;
461     focusHub->LostFocus(BlurReason::FOCUS_SWITCH);
462     EXPECT_EQ(focusHub->blurReason_, BlurReason::WINDOW_BLUR);
463 
464     /**
465      * @tc.steps3: call the function LostFocus with currentFocus_ = true.
466      * @tc.expected: The value of blurReason_ is changed to BlurReason::FOCUS_SWITCH.
467      */
468     focusHub->currentFocus_ = true;
469     focusHub->LostFocus(BlurReason::FOCUS_SWITCH);
470     EXPECT_EQ(focusHub->blurReason_, BlurReason::FOCUS_SWITCH);
471 }
472 
473 /**
474  * @tc.name: FocusHubTestNg012
475  * @tc.desc: Test the function LostSelfFocus.
476  * @tc.type: FUNC
477  */
478 HWTEST_F(FocusHubTestNg, FocusHubTestNg0012, TestSize.Level1)
479 {
480     /**
481      * @tc.steps1: initialize parameters.
482      */
483     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
484     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
485 
486     /**
487      * @tc.steps2: call the function LostSelfFocus with currentFocus_ = false.
488      * @tc.expected: The value of focusable_ is changed to false.
489      */
490     focusHub->currentFocus_ = false;
491     focusHub->SetFocusable(false);
492     focusHub->LostSelfFocus();
493     EXPECT_FALSE(focusHub->focusable_);
494 
495     /**
496      * @tc.steps3: call the function LostSelfFocus with currentFocus_ = true.
497      * @tc.expected: The value of focusable_ is changed to true.
498      */
499     focusHub->currentFocus_ = true;
500     focusHub->LostSelfFocus();
501     EXPECT_TRUE(focusHub->focusable_);
502 }
503 
504 /**
505  * @tc.name: FocusHubTestNg013
506  * @tc.desc: Test the function SetShow, SetEnabled, SetEnabledNode and SetEnabledScope.
507  * @tc.type: FUNC
508  */
509 HWTEST_F(FocusHubTestNg, FocusHubTestNg0013, TestSize.Level1)
510 {
511     /**
512      * @tc.steps1: initialize parameters.
513      */
514     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
515         AceType::MakeRefPtr<Pattern>());
516     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
517     eventHub->AttachHost(frameNode);
518     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
519     auto context = PipelineContext::GetCurrentContext();
520     ASSERT_NE(context, nullptr);
521 
522     /**
523      * @tc.steps2: call the function SetShow with FocusType::NODE.
524      * @tc.expected: The value of show_ is changed to true.
525      */
526     focusHub->SetFocusType(FocusType::NODE);
527     focusHub->SetShow(true);
528     focusHub->SetEnabled(true);
529     EXPECT_TRUE(focusHub->IsShow());
530 
531     /**
532      * @tc.steps3: call the function SetShow with FocusType::SCOPE.
533      * @tc.expected: The value of show_ is changed to false.
534      */
535     focusHub->SetFocusType(FocusType::SCOPE);
536     focusHub->SetShow(false);
537     focusHub->SetEnabled(false);
538     frameNode->layoutProperty_->propVisibility_ = VisibleType::INVISIBLE;
539     EXPECT_FALSE(focusHub->IsShow());
540 
541     /**
542      * @tc.steps4: call the function SetShow with FocusType::DISABLE.
543      * @tc.expected: The value of show_ is changed to false.
544      */
545     focusHub->SetFocusType(FocusType::DISABLE);
546     focusHub->SetShow(true);
547     focusHub->SetEnabled(true);
548     EXPECT_FALSE(focusHub->IsShow());
549 }
550 
551 /**
552  * @tc.name: FocusHubTestNg014
553  * @tc.desc: Test functions OnFocus, OnFocusNode and OnFocusScope.
554  * @tc.type: FUNC
555  */
556 HWTEST_F(FocusHubTestNg, FocusHubTestNg0014, TestSize.Level1)
557 {
558     /**
559      * @tc.steps1: initialize parameters.
560      */
561     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
562         AceType::MakeRefPtr<Pattern>());
563     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
564     eventHub->AttachHost(frameNode);
565     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
566 
567     /**
568      * @tc.steps2: call the function OnFocus with FocusType::SCOPE.
569      * @tc.expected: The focusNodes_ is empty.
570      */
571     focusHub->SetFocusType(FocusType::SCOPE);
572     focusHub->OnFocus();
573     std::list<RefPtr<FocusHub>> focusNodes;
574     focusHub->FlushChildrenFocusHub(focusNodes);
575     EXPECT_TRUE(focusNodes.empty());
576 
577     /**
578      * @tc.steps3: call the function OnFocus with FocusType::NODE.
579      * @tc.expected: The flagCbk1 and flagCbk2 are changed to true.
580      */
581     focusHub->SetFocusType(FocusType::NODE);
582     focusHub->OnFocus();
583     focusHub->currentFocus_ = true;
584     bool flagCbk1 = false;
585     bool flagCbk2 = false;
__anon7f48b3120102(FocusReason reason) 586     focusHub->onFocusInternal_ = [&flagCbk1](FocusReason reason) { flagCbk1 = !flagCbk1; };
587     focusHub->focusCallbackEvents_ = AceType::MakeRefPtr<FocusCallbackEvents>();
__anon7f48b3120202() 588     focusHub->SetOnFocusCallback([&flagCbk2]() { flagCbk2 = !flagCbk2; });
589     focusHub->OnFocus();
590     EXPECT_TRUE(flagCbk1);
591     EXPECT_TRUE(flagCbk2);
592 }
593 
594 /**
595  * @tc.name: FocusHubTestNg015
596  * @tc.desc: Test functions OnBlur, OnBlurNode and OnBlurScope.
597  * @tc.type: FUNC
598  */
599 HWTEST_F(FocusHubTestNg, FocusHubTestNg0015, TestSize.Level1)
600 {
601     /**
602      * @tc.steps1: initialize parameters.
603      */
604     auto frameNode = FrameNodeOnTree::CreateFrameNode("frameNode", 101,
605         AceType::MakeRefPtr<ButtonPattern>());
606     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
607     eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode));
608     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
609 
610     /**
611      * @tc.steps2: call the function OnBlur with FocusType::NODE.
612      * @tc.expected: The flagCbk1 and flagCbk2 are changed to true.
613      */
614     focusHub->SetFocusType(FocusType::NODE);
615     focusHub->OnBlur();
616     bool flagCbk1 = false;
617     bool flagCbk2 = false;
618     BlurReason flagReason = BlurReason::WINDOW_BLUR;
__anon7f48b3120302() 619     focusHub->onBlurInternal_ = [&flagCbk1]() { flagCbk1 = !flagCbk1; };
__anon7f48b3120402(BlurReason reason) 620     focusHub->onBlurReasonInternal_ = [&flagReason](BlurReason reason) { flagReason = reason; };
__anon7f48b3120502() 621     focusHub->SetOnBlurCallback([&flagCbk2]() { flagCbk2 = !flagCbk2; });
622     focusHub->OnBlur();
623     EXPECT_TRUE(flagCbk1);
624     EXPECT_TRUE(flagCbk2);
625     EXPECT_EQ(flagReason, BlurReason::FOCUS_SWITCH);
626 
627     /**
628      * @tc.steps3: call the function OnBlur with FocusType::SCOPE.
629      * @tc.expected: The flagCbk1 and flagCbk2 are changed to true.
630      */
631     focusHub->SetFocusType(FocusType::SCOPE);
632     focusHub->OnFocus();
633     flagCbk1 = false;
634     flagCbk2 = false;
635     flagReason = BlurReason::WINDOW_BLUR;
__anon7f48b3120602() 636     focusHub->onBlurInternal_ = [&flagCbk1]() { flagCbk1 = !flagCbk1; };
__anon7f48b3120702(BlurReason reason) 637     focusHub->onBlurReasonInternal_ = [&flagReason](BlurReason reason) { flagReason = reason; };
__anon7f48b3120802() 638     focusHub->SetOnBlurCallback([&flagCbk2]() { flagCbk2 = !flagCbk2; });
639     focusHub->OnBlur();
640     EXPECT_TRUE(flagCbk1);
641     EXPECT_TRUE(flagCbk2);
642     EXPECT_EQ(flagReason, BlurReason::FOCUS_SWITCH);
643 }
644 
645 /**
646  * @tc.name: FocusHubTestNg016
647  * @tc.desc: Test the function OnKeyEvent, OnKeyEventScope and OnKeyEventNode.
648  * @tc.type: FUNC
649  */
650 HWTEST_F(FocusHubTestNg, FocusHubTestNg0016, TestSize.Level1)
651 {
652     /**
653      * @tc.steps1: initialize parameters.
654      */
655     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
656     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
657     auto context = PipelineContext::GetCurrentContext();
658     ASSERT_NE(context, nullptr);
659     KeyEvent keyEvent;
660     keyEvent.action = KeyAction::DOWN;
661     keyEvent.code = KeyCode::KEY_SPACE;
662     keyEvent.isRedispatch = true;
663     keyEvent.isPreIme = true;
664 
665     /**
666      * @tc.steps2: call the function OnKeyEvent with FocusType::NODE.
667      * @tc.expected: The return value of OnKeyEvent is false.
668      */
669     focusHub->SetFocusType(FocusType::NODE);
670     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
671 
672     /**
673      * @tc.steps3: call the function OnKeyEvent with FocusType::SCOPE.
674      * @tc.expected: The return value of OnKeyEvent is false.
675      */
676     focusHub->SetFocusType(FocusType::SCOPE);
677     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
678 
679     /**
680      * @tc.steps4: call the function OnKeyEvent with FocusType::DISABLE.
681      * @tc.expected: The return value of OnKeyEvent is false.
682      */
683     focusHub->SetFocusType(FocusType::DISABLE);
684     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
685 }
686 
687 /**
688  * @tc.name: FocusHubTestNg017
689  * @tc.desc: Test the function HandleFocusByTabIndex.
690  * @tc.type: FUNC
691  */
692 HWTEST_F(FocusHubTestNg, FocusHubTestNg0017, TestSize.Level1)
693 {
694     /**
695      * @tc.steps1: initialize parameters.
696      */
697     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
698     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
699     KeyEvent keyEvent;
700 
701     /**
702      * @tc.steps2: call the function HandleFocusByTabIndex with code != KeyCode::KEY_TAB and action != KeyAction::DOWN.
703      * @tc.expected: The return value of HandleFocusByTabIndex is false.
704      */
705     keyEvent.action = KeyAction::UNKNOWN;
706     keyEvent.code = KeyCode::KEY_UNKNOWN;
707     EXPECT_FALSE(focusHub->HandleFocusByTabIndex(keyEvent));
708 
709     /**
710      * @tc.steps3: call the function HandleFocusByTabIndex with code != KeyCode::KEY_TAB and action == KeyAction::DOWN.
711      * @tc.expected: The return value of HandleFocusByTabIndex is false.
712      */
713     keyEvent.action = KeyAction::DOWN;
714     keyEvent.code = KeyCode::KEY_UNKNOWN;
715     EXPECT_FALSE(focusHub->HandleFocusByTabIndex(keyEvent));
716 
717     /**
718      * @tc.steps4: call the function HandleFocusByTabIndex with code == KeyCode::KEY_TAB and action != KeyAction::DOWN.
719      * @tc.expected: The return value of HandleFocusByTabIndex is false.
720      */
721     keyEvent.action = KeyAction::UNKNOWN;
722     keyEvent.code = KeyCode::KEY_TAB;
723     EXPECT_FALSE(focusHub->HandleFocusByTabIndex(keyEvent));
724 
725     /**
726      * @tc.steps5: call the function HandleFocusByTabIndex with code == KeyCode::KEY_TAB and action == KeyAction::DOWN
727      *             and curPage == null.
728      * @tc.expected: The return value of HandleFocusByTabIndex is false.
729      */
730     keyEvent.action = KeyAction::DOWN;
731     keyEvent.code = KeyCode::KEY_TAB;
732     EXPECT_FALSE(focusHub->HandleFocusByTabIndex(keyEvent));
733 
734     /**
735      * @tc.steps6: call the function HandleFocusByTabIndex with code == KeyCode::KEY_TAB and action == KeyAction::DOWN
736      *             and curPage == focusHub.
737      * @tc.expected: The return value of HandleFocusByTabIndex is false.
738      */
739     keyEvent.action = KeyAction::DOWN;
740     keyEvent.code = KeyCode::KEY_TAB;
741     EXPECT_FALSE(focusHub->HandleFocusByTabIndex(keyEvent));
742 }
743 
744 /**
745  * @tc.name: FocusHubTestNg018
746  * @tc.desc: Test the function HandleFocusByTabIndex.
747  * @tc.type: FUNC
748  */
749 HWTEST_F(FocusHubTestNg, FocusHubTestNg0018, TestSize.Level1)
750 {
751     /**
752      * @tc.steps1: initialize parameters.
753      */
754     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
755     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
756     KeyEvent keyEvent;
757 
758     /**
759      * @tc.steps2: call the function GetFocusingTabNodeIdx with the empty TabIndexNodeList.
760      * @tc.expected: The return value of the function is NONE_TAB_FOCUSED_INDEX.
761      */
762     TabIndexNodeList tabIndexNodes;
763     EXPECT_EQ(focusHub->GetFocusingTabNodeIdx(tabIndexNodes), DEFAULT_TAB_FOCUSED_INDEX);
764 
765     /**
766      * @tc.steps3: call the function GetFocusingTabNodeIdx with the unempty TabIndexNodeList.
767      * @tc.expected: The return value of the function is DEFAULT_TAB_FOCUSED_INDEX.
768      */
769     int32_t nodeId = 1;
770     focusHub->lastTabIndexNodeId_ = nodeId;
771     tabIndexNodes.emplace_back(focusHub->GetTabIndex(), focusHub);
772     EXPECT_EQ(focusHub->GetFocusingTabNodeIdx(tabIndexNodes), DEFAULT_TAB_FOCUSED_INDEX);
773 
774     /**
775      * @tc.steps4: call the function GetFocusingTabNodeIdx with the unempty TabIndexNodeList.
776      * @tc.expected: The return value of the function is 0.
777      */
778     nodeId = -1;
779     focusHub->lastTabIndexNodeId_ = nodeId;
780     focusHub->currentFocus_ = true;
781     EXPECT_EQ(focusHub->GetFocusingTabNodeIdx(tabIndexNodes), 0);
782 
783     /**
784      * @tc.steps5: call the function GetFocusingTabNodeIdx with the unempty TabIndexNodeList.
785      * @tc.expected: The return value of the function is NONE_TAB_FOCUSED_INDEX.
786      */
787     focusHub->currentFocus_ = false;
788     EXPECT_EQ(focusHub->GetFocusingTabNodeIdx(tabIndexNodes), DEFAULT_TAB_FOCUSED_INDEX);
789 }
790 
791 /**
792  * @tc.name: FocusHubTestNg019
793  * @tc.desc: Test the function RequestFocusImmediatelyById and GetChildFocusNodeById.
794  * @tc.type: FUNC
795  */
796 HWTEST_F(FocusHubTestNg, FocusHubTestNg0019, TestSize.Level1)
797 {
798     /**
799      * @tc.steps1: initialize parameters.
800      */
801     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
802     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1,
803         AceType::MakeRefPtr<Pattern>());
804     eventHub->AttachHost(frameNode);
805     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
806 
807     /**
808      * @tc.steps2: call the function RequestFocusImmediatelyById with the empty id.
809      * @tc.expected: The return value of the function is false.
810      */
811     const std::string nullStr("");
812     EXPECT_FALSE(focusHub->RequestFocusImmediatelyById(nullStr));
813 
814     /**
815      * @tc.steps3: call the function RequestFocusImmediatelyById with the idStr.
816      * @tc.expected: The return value of the function is false.
817      */
818     const std::string idStr(V2::TEXT_ETS_TAG);
819     EXPECT_FALSE(focusHub->RequestFocusImmediatelyById(idStr));
820 
821     /**
822      * @tc.steps4: call the function RequestFocusImmediatelyById with the idStr and FocusType::NODE.
823      * @tc.expected: The return value of the function is false.
824      */
825     focusHub->SetFocusType(FocusType::NODE);
826     EXPECT_FALSE(focusHub->RequestFocusImmediatelyById(idStr));
827 
828     /**
829      * @tc.steps5: call the function RequestFocusImmediatelyById with the idStr and FocusType::SCOPE.
830      * @tc.expected: The return value of the function is false.
831      */
832     focusHub->SetFocusType(FocusType::SCOPE);
833     EXPECT_FALSE(focusHub->RequestFocusImmediatelyById(idStr));
834 }
835 
836 /**
837  * @tc.name: FocusHubTestNg020
838  * @tc.desc: Test the function GetChildFocusNodeByType.
839  * @tc.type: FUNC
840  */
841 HWTEST_F(FocusHubTestNg, FocusHubTestNg0020, TestSize.Level1)
842 {
843     /**
844      * @tc.steps1: initialize parameters.
845      */
846     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
847     eventHub->SetEnabled(true);
848     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
849 
850     /**
851      * @tc.steps2: call the function GetChildFocusNodeByType with FocusNodeType::DEFAULT.
852      * @tc.expected: The return value of the function is focusHub.
853      */
854     focusHub->SetFocusType(FocusType::NODE);
855     focusHub->SetShow(true);
856     focusHub->focusable_ = true;
857     focusHub->parentFocusable_ = true;
858     focusHub->SetIsDefaultFocus(true);
859     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::DEFAULT), focusHub);
860 
861     /**
862      * @tc.steps3: call the function GetChildFocusNodeByType with FocusNodeType::DEFAULT and show_ = false.
863      * @tc.expected: The return value of the function is nullptr.
864      */
865     focusHub->focusable_ = false;
866     focusHub->SetShow(false);
867     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::DEFAULT), nullptr);
868 
869     /**
870      * @tc.steps4: call the function GetChildFocusNodeByType with FocusNodeType::DEFAULT and IsDefaultFocus = false.
871      * @tc.expected: The return value of the function is nullptr.
872      */
873     focusHub->SetIsDefaultFocus(false);
874     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::DEFAULT), nullptr);
875 
876     /**
877      * @tc.steps5: call the function GetChildFocusNodeByType with FocusNodeType::DEFAULT and show_ = true.
878      * @tc.expected: The return value of the function is focusHub.
879      */
880     focusHub->SetShow(true);
881     focusHub->focusable_ = true;
882     focusHub->SetIsDefaultGroupFocus(true);
883     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::GROUP_DEFAULT), focusHub);
884 
885     /**
886      * @tc.steps6: call the function GetChildFocusNodeByType with FocusNodeType::DEFAULT and show_ = false.
887      * @tc.expected: The return value of the function is nullptr.
888      */
889     focusHub->focusable_ = false;
890     focusHub->SetShow(false);
891     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::GROUP_DEFAULT), nullptr);
892 
893     /**
894      * @tc.steps7: call the function GetChildFocusNodeByType with FocusNodeType::DEFAULT and show_ = true and
895      *             IsDefaultGroupFocus = false.
896      * @tc.expected: The return value of the function is nullptr.
897      */
898     focusHub->SetShow(true);
899     focusHub->SetIsDefaultGroupFocus(false);
900     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::GROUP_DEFAULT), nullptr);
901 
902     /**
903      * @tc.steps8: call the function GetChildFocusNodeByType with FocusType::SCOPE.
904      * @tc.expected: The return value of the function is nullptr.
905      */
906     focusHub->SetFocusType(FocusType::SCOPE);
907     EXPECT_EQ(focusHub->GetChildFocusNodeByType(FocusNodeType::GROUP_DEFAULT), nullptr);
908 }
909 
910 /**
911  * @tc.name: FocusHubTestNg021
912  * @tc.desc: Test the function GoToFocusByTabNodeIdx.
913  * @tc.type: FUNC
914  */
915 HWTEST_F(FocusHubTestNg, FocusHubTestNg0021, TestSize.Level1)
916 {
917     /**
918      * @tc.steps1: initialize parameters.
919      */
920     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
921     eventHub->SetEnabled(true);
922     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
923 
924     /**
925      * @tc.steps2: call the function GoToFocusByTabNodeIdx with the empty TabIndexNodeList.
926      * @tc.expected: The return value of the function is false.
927      */
928     TabIndexNodeList tabIndexNodes;
929     EXPECT_FALSE(focusHub->GoToFocusByTabNodeIdx(tabIndexNodes, 0));
930 
931     /**
932      * @tc.steps3: call the function GoToFocusByTabNodeIdx with the unempty TabIndexNodeList.
933      * @tc.expected: The return value of the function is false.
934      */
935     tabIndexNodes.emplace_back(focusHub->GetTabIndex(), nullptr);
936     EXPECT_FALSE(focusHub->GoToFocusByTabNodeIdx(tabIndexNodes, 0));
937 
938     /**
939      * @tc.steps4: call the function GoToFocusByTabNodeIdx with the unempty TabIndexNodeList.
940      * @tc.expected: The return value of the function is false.
941      */
942     tabIndexNodes.emplace_back(focusHub->GetTabIndex(), focusHub);
943     EXPECT_FALSE(focusHub->GoToFocusByTabNodeIdx(tabIndexNodes, 1));
944 
945     /**
946      * @tc.steps5: call the function GoToFocusByTabNodeIdx with the unempty TabIndexNodeList.
947      * @tc.expected: The return value of the function is false.
948      */
949     focusHub->SetIsDefaultGroupHasFocused(false);
950     focusHub->SetFocusType(FocusType::SCOPE);
951     EXPECT_FALSE(focusHub->GoToFocusByTabNodeIdx(tabIndexNodes, 1));
952 
953     /**
954      * @tc.steps6: call the function GoToFocusByTabNodeIdx with the unempty TabIndexNodeList.
955      * @tc.expected: The return value of the function is false.
956      */
957     focusHub->SetIsDefaultGroupHasFocused(true);
958     focusHub->SetFocusType(FocusType::NODE);
959     EXPECT_FALSE(focusHub->GoToFocusByTabNodeIdx(tabIndexNodes, 1));
960 
961     /**
962      * @tc.steps7: call the function GoToFocusByTabNodeIdx with the unempty TabIndexNodeList.
963      * @tc.expected: The return value of the function is true.
964      */
965     focusHub->SetShow(true);
966     focusHub->focusable_ = true;
967     focusHub->parentFocusable_ = true;
968     EXPECT_TRUE(focusHub->GoToFocusByTabNodeIdx(tabIndexNodes, 1));
969 }
970 
971 /**
972  * @tc.name: FocusHubTestNg022
973  * @tc.desc: Test the function IsFocusableByTab, IsFocusableNodeByTab and IsFocusableScopeByTab.
974  * @tc.type: FUNC
975  */
976 HWTEST_F(FocusHubTestNg, FocusHubTestNg0022, TestSize.Level1)
977 {
978     /**
979      * @tc.steps1: initialize parameters.
980      */
981     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
982     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
983 
984     /**
985      * @tc.steps2: call the function IsFocusableByTab with FocusType::NODE.
986      * @tc.expected: The return value of the function is true.
987      */
988     focusHub->SetFocusType(FocusType::NODE);
989     EXPECT_TRUE(focusHub->IsFocusableByTab());
990 
991     /**
992      * @tc.steps3: call the function IsFocusableByTab with FocusType::SCOPE.
993      * @tc.expected: The return value of the function is true.
994      */
995     focusHub->SetFocusType(FocusType::SCOPE);
996     EXPECT_TRUE(focusHub->IsFocusableByTab());
997 
998     /**
999      * @tc.steps4: call the function IsFocusableByTab with FocusType::DISABLE.
1000      * @tc.expected: The return value of the function is false.
1001      */
1002     focusHub->SetFocusType(FocusType::DISABLE);
1003     EXPECT_FALSE(focusHub->IsFocusableByTab());
1004 }
1005 
1006 /**
1007  * @tc.name: FocusHubHandleDumpFocusTreeTest023
1008  * @tc.desc: Test the function DumpFocusTree.
1009  * @tc.type: FUNC
1010  */
1011 HWTEST_F(FocusHubTestNg, FocusHubHandleDumpFocusTreeTest023, TestSize.Level1)
1012 {
1013     /**
1014      * @tc.steps: step1. Create frameNode.
1015      */
1016     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1017         AceType::MakeRefPtr<Pattern>());
1018 
1019     /**
1020      * @tc.steps: step2. Create FocusHub.
1021      */
1022     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1023     eventHub->AttachHost(frameNode);
1024     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1025 
1026     /**
1027      * @tc.steps: step3. test function DumpFocusNodeTree.
1028      * @tc.expected: After DumpFocusTree, the DumpLog.description_ is empty.
1029      */
1030     int32_t depth = 1;
1031     focusHub->focusType_ = FocusType::NODE;
1032     auto ss = std::make_unique<std::ostringstream>();
1033     DumpLog::GetInstance().SetDumpFile(std::move(ss));
1034     focusHub->currentFocus_ = true;
1035     focusHub->DumpFocusTree(depth);
1036     EXPECT_TRUE(DumpLog::GetInstance().description_.empty());
1037 
1038     DumpLog::GetInstance().description_.push_back("test");
1039     focusHub->currentFocus_ = false;
1040     focusHub->focusable_ = false;
1041     focusHub->DumpFocusTree(depth);
1042     EXPECT_TRUE(DumpLog::GetInstance().description_.empty());
1043 
1044     /**
1045      * @tc.steps: step4. test function DumpFocusScopeTree.
1046      * @tc.expected: After DumpFocusTree, the DumpLog.description_ is empty.
1047      */
1048     DumpLog::GetInstance().description_.push_back("test");
1049     focusHub->focusType_ = FocusType::SCOPE;
1050     focusHub->currentFocus_ = true;
1051     focusHub->DumpFocusTree(depth);
1052     EXPECT_TRUE(DumpLog::GetInstance().description_.empty());
1053 
1054     DumpLog::GetInstance().description_.push_back("test");
1055     focusHub->currentFocus_ = false;
1056     focusHub->focusable_ = false;
1057     focusHub->DumpFocusTree(depth);
1058     EXPECT_TRUE(DumpLog::GetInstance().description_.empty());
1059 }
1060 
1061 /**
1062  * @tc.name: FocusHubRemoveChildTest001
1063  * @tc.desc: Test the function RemoveChild.
1064  * @tc.type: FUNC
1065  */
1066 HWTEST_F(FocusHubTestNg, FocusHubRemoveChildTest001, TestSize.Level1)
1067 {
1068     /**
1069      * @tc.steps: step1. Create frameNode.
1070      */
1071     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1072         AceType::MakeRefPtr<Pattern>());
1073     auto frameNode2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1074         AceType::MakeRefPtr<Pattern>());
1075     auto nodeParent = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BLANK_ETS_TAG, -1,
1076         AceType::MakeRefPtr<FlexLayoutPattern>());
1077     frameNode->GetOrCreateFocusHub();
1078     frameNode2->GetOrCreateFocusHub();
1079     nodeParent->GetOrCreateFocusHub();
1080     frameNode->SetParent(nodeParent);
1081     frameNode2->SetParent(nodeParent);
1082 
1083     /**
1084      * @tc.steps: step2. Create FocusHub.
1085      */
1086     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1087     eventHub->AttachHost(frameNode);
1088     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1089 
1090     /**
1091      * @tc.steps: step3. Get parentFocusHub.
1092      */
1093     focusHub->currentFocus_ = true;
1094     auto parent = focusHub->GetParentFocusHub();
1095 
1096     /**
1097      * @tc.steps: step4. Test RemoveChild and parentFocusHub RemoveSelf.
1098      * @tc.expected: focusHub and parentFocusHub both lostFocus.
1099      */
1100     parent->currentFocus_ = true;
1101     parent->RemoveChild(focusHub);
1102     EXPECT_EQ(parent->blurReason_, BlurReason::FRAME_DESTROY);
1103     EXPECT_EQ(focusHub->blurReason_, BlurReason::FRAME_DESTROY);
1104 }
1105 
1106 /**
1107  * @tc.name: FocusHubSetIsFocusOnTouch001
1108  * @tc.desc: Test the function SetIsFocusOnTouch.
1109  * @tc.type: FUNC
1110  */
1111 HWTEST_F(FocusHubTestNg, FocusHubSetIsFocusOnTouch001, TestSize.Level1)
1112 {
1113     /**
1114      * @tc.steps1: create frameNode.
1115      */
1116     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1117         AceType::MakeRefPtr<Pattern>());
1118 
1119     /**
1120      * @tc.steps2: create eventHub and focusHub.
1121      */
1122     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1123     eventHub->AttachHost(frameNode);
1124     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1125 
1126     /**
1127      * @tc.steps3: test SetIsFocusOnTouch.
1128      * @tc.expected: create touchEvents and set FocusOnTouch success.
1129      */
1130     focusHub->SetIsFocusOnTouch(true);
1131     auto gesture = frameNode->GetOrCreateGestureEventHub();
1132     EXPECT_FALSE(gesture->touchEventActuator_->touchEvents_.empty());
1133 
1134     /**
1135      * @tc.steps4: test SetIsFocusOnTouch.
1136      * @tc.expected: when touchEvents has been set, return.
1137      */
1138     focusHub->SetIsFocusOnTouch(true);
1139     EXPECT_TRUE(focusHub->IsFocusOnTouch().value());
1140 
1141     /**
1142      * @tc.steps4: test SetIsFocusOnTouch.
1143      * @tc.expected: set touchEvents false.
1144      */
1145     focusHub->SetIsFocusOnTouch(false);
1146     EXPECT_TRUE(gesture->touchEventActuator_->touchEvents_.empty());
1147 
1148     /**
1149      * @tc.steps5: test SetIsFocusOnTouch.
1150      * @tc.expected: set focusOnTouchListener_ success.
1151      */
1152     focusHub->SetIsFocusOnTouch(false);
1153     focusHub->focusOnTouchListener_ = nullptr;
1154     focusHub->SetIsFocusOnTouch(true);
1155     EXPECT_TRUE(focusHub->focusOnTouchListener_);
1156     auto touchCallback = focusHub->focusOnTouchListener_;
1157     TouchEventInfo touchEventInfo("onTouchUp");
1158     (*touchCallback)(touchEventInfo);
1159     TouchLocationInfo touchLocationInfo(1);
1160     touchLocationInfo.SetTouchType(TouchType::UP);
1161     touchEventInfo.AddTouchLocationInfo(std::move(touchLocationInfo));
1162     focusHub->SetFocusType(FocusType::NODE);
1163     focusHub->focusable_ = true;
1164     (*touchCallback)(touchEventInfo);
1165     EXPECT_TRUE(focusHub->currentFocus_);
1166 }
1167 
1168 /**
1169  * @tc.name: FocusHubOnKeyEvent002
1170  * @tc.desc: Test the function OnKeyEvent.
1171  * @tc.type: FUNC
1172  */
1173 HWTEST_F(FocusHubTestNg, FocusHubOnKeyEvent002, TestSize.Level1)
1174 {
1175     /**
1176      * @tc.steps1: create frameNode.
1177      */
1178     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1179         AceType::MakeRefPtr<Pattern>());
1180 
1181     /**
1182      * @tc.steps2: create eventHub and focusHub.
1183      */
1184     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1185     eventHub->AttachHost(frameNode);
1186     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1187     KeyEvent keyEvent;
1188     keyEvent.action = KeyAction::UP;
1189     keyEvent.code = KeyCode::KEY_SPACE;
1190 
1191     /**
1192      * @tc.steps3: call the function OnKeyEvent with FocusType::NODE.
1193      * @tc.expected: The return value of OnKeyEvent is true.
1194      */
1195     focusHub->SetFocusType(FocusType::NODE);
1196     focusHub->currentFocus_ = true;
__anon7f48b3120902(KeyEventInfo& eventInfo) 1197     auto onKeyEventCallback = [](KeyEventInfo& eventInfo) -> bool {
1198         eventInfo.SetStopPropagation(true);
1199         return false;
1200     };
__anon7f48b3120a02(const KeyEvent& event) 1201     auto onKeyEvent = [](const KeyEvent& event) -> bool { return true; };
1202     focusHub->SetOnKeyEventInternal(std::move(onKeyEvent));
1203     focusHub->SetOnKeyCallback(std::move(onKeyEventCallback));
1204     EXPECT_TRUE(focusHub->HandleEvent(keyEvent));
1205 }
1206 
1207 /**
1208  * @tc.name: FocusHubOnKeyEvent003
1209  * @tc.desc: Test the function OnKeyEvent.
1210  * @tc.type: FUNC obsolete
1211  */
1212 HWTEST_F(FocusHubTestNg, FocusHubOnKeyEvent003, TestSize.Level1)
1213 {
1214     /**
1215      * @tc.steps1: create frameNode.
1216      */
1217     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
1218     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1219         AceType::MakeRefPtr<ButtonPattern>());
1220     child->GetOrCreateFocusHub();
1221     frameNode->AddChild(child);
1222 
1223     /**
1224      * @tc.steps2: create eventHub and focusHub.
1225      */
1226     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1227     eventHub->AttachHost(frameNode);
1228     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1229 
1230     /**
1231      * @tc.steps3: create lastWeakFocusNode_.
1232      */
1233     std::list<RefPtr<FocusHub>> focusNodes;
1234     focusHub->FlushChildrenFocusHub(focusNodes);
1235     focusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(*(focusNodes.begin())));
1236 
1237     /**
1238      * @tc.steps4: create keyEvent.
1239      */
1240     KeyEvent keyEvent;
1241     keyEvent.action = KeyAction::UP;
1242     keyEvent.code = KeyCode::KEY_SPACE;
1243 
1244     /**
1245      * @tc.steps5: create lastFocusNode.
1246      */
1247     focusHub->currentFocus_ = true;
1248     focusHub->SetFocusType(FocusType::SCOPE);
__anon7f48b3120b02(const KeyEvent& event) 1249     auto onKeyEvent = [](const KeyEvent& event) -> bool { return true; };
1250 
1251     /**
1252      * @tc.steps6: call the function OnKeyEvent with FocusType::SCOPE.
1253      * @tc.expected: The return value of OnKeyEvent is false.
1254      */
1255     auto lastFocusNode = focusHub->lastWeakFocusNode_.Upgrade();
1256     lastFocusNode->currentFocus_ = true;
1257     lastFocusNode->SetOnKeyEventInternal(onKeyEvent);
1258     EXPECT_TRUE(focusHub->HandleEvent(keyEvent));
1259 
1260     /**
1261      * @tc.steps7: call the function OnKeyEvent with FocusType::SCOPE.
1262      * @tc.expected: The return value of OnKeyEvent is true.
1263      */
1264     lastFocusNode->currentFocus_ = false;
1265     focusHub->SetOnKeyEventInternal(onKeyEvent);
1266     EXPECT_TRUE(focusHub->HandleEvent(keyEvent));
1267 }
1268 
1269 /**
1270  * @tc.name: FocusHubOnKeyEvent004
1271  * @tc.desc: Test the function OnKeyEvent.
1272  * @tc.type: FUNC
1273  */
1274 HWTEST_F(FocusHubTestNg, FocusHubOnKeyEvent004, TestSize.Level1)
1275 {
1276     /**
1277      * @tc.steps1: create frameNode.
1278      */
1279     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1280         AceType::MakeRefPtr<Pattern>());
1281     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1282         AceType::MakeRefPtr<ButtonPattern>());
1283     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1284         AceType::MakeRefPtr<ButtonPattern>());
1285     child->GetOrCreateFocusHub();
1286     child2->GetOrCreateFocusHub();
1287     frameNode->AddChild(child);
1288     frameNode->AddChild(child2);
1289 
1290     /**
1291      * @tc.steps2: create eventHub and focusHub.
1292      */
1293     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1294     eventHub->AttachHost(frameNode);
1295     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1296     auto childEventHub = AceType::MakeRefPtr<EventHub>();
1297     childEventHub->AttachHost(child);
1298 
1299     /**
1300      * @tc.steps3: create lastWeakFocusNode_.
1301      */
1302     std::list<RefPtr<FocusHub>> focusNodes;
1303     focusHub->FlushChildrenFocusHub(focusNodes);
1304     auto childFocusHub = *focusNodes.begin();
1305     childFocusHub->eventHub_ = childEventHub;
1306     focusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(childFocusHub));
1307 
1308     KeyEvent keyEvent;
1309     keyEvent.action = KeyAction::UP;
1310     auto pipeline = PipelineContext::GetCurrentContext();
1311     ASSERT_NE(pipeline, nullptr);
1312     auto focusManager = pipeline->GetOrCreateFocusManager();
1313     ASSERT_NE(focusManager, nullptr);
1314     focusManager->isFocusActive_ = true;
1315 
1316     /**
1317      * @tc.steps5: test keyEvent with keyEvent.code == KeyCode::TV_CONTROL_UP.
1318      * @tc.expected: The return value of OnKeyEvent is false.
1319      */
1320     keyEvent.code = KeyCode::TV_CONTROL_UP;
1321     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1322 
1323     keyEvent.code = KeyCode::TV_CONTROL_DOWN;
1324     focusHub->SetScopeFocusAlgorithm();
1325     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1326 
1327     keyEvent.code = KeyCode::TV_CONTROL_LEFT;
1328     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1329 
1330     keyEvent.code = KeyCode::TV_CONTROL_RIGHT;
1331     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1332 
1333     keyEvent.code = KeyCode::KEY_TAB;
1334     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1335 
1336     keyEvent.pressedCodes.emplace_back(KeyCode::KEY_SHIFT_LEFT);
1337     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1338 
1339     keyEvent.pressedCodes.emplace_back(KeyCode::KEY_TAB);
1340     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1341 
1342     keyEvent.code = KeyCode::KEY_MOVE_HOME;
1343     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1344 
1345     keyEvent.code = KeyCode::KEY_MOVE_END;
1346     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1347 
1348     keyEvent.code = KeyCode::KEY_SPACE;
1349     EXPECT_FALSE(focusHub->HandleEvent(keyEvent));
1350 }
1351 
1352 /**
1353  * @tc.name: FocusHubGoToNextFocusLinear001
1354  * @tc.desc: Test the function GoToNextFocusLinear.
1355  * @tc.type: FUNC
1356  */
1357 HWTEST_F(FocusHubTestNg, FocusHubGoToNextFocusLinear001, TestSize.Level1)
1358 {
1359     /**
1360      * @tc.steps: step1. Create frameNode.
1361      */
1362     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1363         AceType::MakeRefPtr<Pattern>());
1364     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1365         AceType::MakeRefPtr<ButtonPattern>());
1366     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1367         AceType::MakeRefPtr<ButtonPattern>());
1368     child->GetOrCreateFocusHub();
1369     child2->GetOrCreateFocusHub();
1370     frameNode->AddChild(child);
1371     frameNode->AddChild(child2);
1372 
1373     /**
1374      * @tc.steps: step2. Create FocusHub.
1375      */
1376     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1377     eventHub->AttachHost(frameNode);
1378     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1379 
1380     focusHub->currentFocus_ = true;
1381 
1382     std::list<RefPtr<FocusHub>> focusNodes;
1383     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1384 
1385     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1386     EXPECT_TRUE(focusHub->GoToNextFocusLinear(FocusStep::TAB));
1387 }
1388 
1389 /**
1390  * @tc.name: FocusHubPaintFocusState001
1391  * @tc.desc: Test the function PaintFocusState.
1392  * @tc.type: FUNC
1393  */
1394 HWTEST_F(FocusHubTestNg, PaintFocusState001, TestSize.Level1)
1395 {
1396     /**
1397      * @tc.steps1: create frameNode.
1398      */
1399     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1400         AceType::MakeRefPtr<Pattern>());
1401     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1402         AceType::MakeRefPtr<ButtonPattern>());
1403     child->GetOrCreateFocusHub();
1404     frameNode->AddChild(child);
1405 
1406     /**
1407      * @tc.steps2: create eventHub and focusHub.
1408      */
1409     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1410     ASSERT_NE(eventHub, nullptr);
1411     eventHub->AttachHost(frameNode);
1412     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1413     ASSERT_NE(focusHub, nullptr);
1414     auto context = PipelineContext::GetCurrentContext();
1415     ASSERT_NE(context, nullptr);
1416     auto renderContext = frameNode->GetRenderContext();
1417     ASSERT_NE(renderContext, nullptr);
1418 
1419     /**
1420      * @tc.steps3: create KeyEvent.
1421      */
1422     KeyEvent keyEvent;
1423     keyEvent.action = KeyAction::DOWN;
1424     keyEvent.code = KeyCode::KEY_SPACE;
1425 
1426     focusHub->SetFocusType(FocusType::SCOPE);
1427     EXPECT_EQ(focusHub->focusStyleType_, FocusStyleType::NONE);
1428 }
1429 
1430 /**
1431  * @tc.name: FocusHubSetIsDefaultFocus001
1432  * @tc.desc: Test the function SetIsDefaultFocus.
1433  * @tc.type: FUNC
1434  */
1435 HWTEST_F(FocusHubTestNg, SetIsDefaultFocus001, TestSize.Level1)
1436 {
1437     /**
1438      * @tc.steps1: create frameNode.
1439      */
1440     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1441         AceType::MakeRefPtr<Pattern>());
1442 
1443     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1444     ASSERT_NE(eventHub, nullptr);
1445     eventHub->AttachHost(frameNode);
1446     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1447     ASSERT_NE(focusHub, nullptr);
1448 
1449     auto pipeline = PipelineContext::GetCurrentContext();
1450     ASSERT_NE(pipeline, nullptr);
1451     auto manager = pipeline->GetOverlayManager();
1452     ASSERT_NE(manager, nullptr);
1453     auto rootNode = pipeline->GetRootElement();
1454     EXPECT_NE(rootNode, nullptr);
1455 
1456     focusHub->focusCallbackEvents_ = nullptr;
1457     focusHub->SetIsDefaultGroupFocus(false);
1458     EXPECT_NE(focusHub->focusCallbackEvents_, nullptr);
1459 }
1460 
1461 /**
1462  * @tc.name: FocusHubTestDisableFocus001
1463  * @tc.desc: Test disable functions Onfocus.
1464  * @tc.type: FUNC
1465  */
1466 HWTEST_F(FocusHubTestNg, FocusHubTestDisableFocus001, TestSize.Level1)
1467 {
1468     /**
1469      * @tc.steps1: initialize parameters.
1470      */
1471     auto frameNode = FrameNodeOnTree::CreateFrameNode("frameNode", 101,
1472         AceType::MakeRefPtr<ButtonPattern>());
1473     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1474     eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode));
1475     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1476 
1477     /**
1478      * @tc.steps2: call the function OnFocus with FocusType::NODE.
1479      * @tc.expected: The result is right.
1480      */
1481     focusHub->SetFocusType(FocusType::NODE);
1482     std::string result;
__anon7f48b3120c02() 1483     auto onFocus = [&result]() { result = RESULT_SUCCESS_ONE; };
1484     focusHub->SetOnFocusCallback(onFocus);
1485     focusHub->currentFocus_ = true;
1486     EXPECT_NE(focusHub->GetOnFocusCallback(), nullptr);
1487 
1488     focusHub->OnFocus();
1489     EXPECT_EQ(result, RESULT_SUCCESS_ONE);
1490 
1491     /**
1492      * @tc.steps3: clear the function.
1493      * @tc.expected: The result is nullptr.
1494      */
1495     focusHub->ClearOnFocusCallback();
1496     EXPECT_EQ(focusHub->GetOnFocusCallback(), nullptr);
1497 
1498     /**
1499      * @tc.steps3: set the function again.
1500      * @tc.expected: The result is right.
1501      */
__anon7f48b3120d02() 1502     auto onFocus2 = [&result]() { result = RESULT_SUCCESS_TWO; };
1503     focusHub->SetOnFocusCallback(onFocus2);
1504     focusHub->currentFocus_ = true;
1505     EXPECT_NE(focusHub->GetOnFocusCallback(), nullptr);
1506 
1507     focusHub->OnFocus();
1508     EXPECT_EQ(result, RESULT_SUCCESS_TWO);
1509 }
1510 
1511 /**
1512  * @tc.name: FocusHubTestDisableBlur001
1513  * @tc.desc: Test disable functions OnBlur.
1514  * @tc.type: FUNC
1515  */
1516 HWTEST_F(FocusHubTestNg, FocusHubTestDisableBlur001, TestSize.Level1)
1517 {
1518     /**
1519      * @tc.steps1: initialize parameters.
1520      */
1521     auto frameNode = FrameNodeOnTree::CreateFrameNode("frameNode", 101,
1522         AceType::MakeRefPtr<ButtonPattern>());
1523     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1524     eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode));
1525     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1526 
1527     /**
1528      * @tc.steps2: call the function OnBlur with FocusType::NODE.
1529      * @tc.expected: The result is right.
1530      */
1531     focusHub->SetFocusType(FocusType::NODE);
1532     std::string result;
__anon7f48b3120e02() 1533     auto onBlur = [&result]() { result = RESULT_SUCCESS_ONE; };
1534     focusHub->SetOnBlurCallback(onBlur);
1535     EXPECT_NE(focusHub->GetOnBlurCallback(), nullptr);
1536 
1537     focusHub->OnBlur();
1538     EXPECT_EQ(result, RESULT_SUCCESS_ONE);
1539 
1540     /**
1541      * @tc.steps3: clear the function OnBlur.
1542      * @tc.expected: The result is nullptr.
1543      */
1544     focusHub->ClearOnBlurCallback();
1545     EXPECT_EQ(focusHub->GetOnBlurCallback(), nullptr);
1546 
1547     /**
1548      * @tc.steps3: set the function OnBlur again.
1549      * @tc.expected: The result is right.
1550      */
__anon7f48b3120f02() 1551     auto onBlur2 = [&result]() { result = RESULT_SUCCESS_TWO; };
1552     focusHub->SetOnBlurCallback(onBlur2);
1553     EXPECT_NE(focusHub->GetOnBlurCallback(), nullptr);
1554 
1555     focusHub->OnBlur();
1556     EXPECT_EQ(result, RESULT_SUCCESS_TWO);
1557 }
1558 
1559 /**
1560  * @tc.name: FocusHubTestDisableKey001
1561  * @tc.desc: Test disable functions OnKey.
1562  * @tc.type: FUNC
1563  */
1564 HWTEST_F(FocusHubTestNg, FocusHubTestDisableKey001, TestSize.Level1)
1565 {
1566     /**
1567      * @tc.steps1: initialize parameters.
1568      */
1569     auto frameNode = FrameNodeOnTree::CreateFrameNode("frameNode", 101,
1570         AceType::MakeRefPtr<ButtonPattern>());
1571     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1572     eventHub->host_ = AceType::WeakClaim(AceType::RawPtr(frameNode));
1573     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1574     focusHub->currentFocus_ = true;
1575 
1576     /**
1577      * @tc.steps2: call the function OnKey with FocusType::NODE.
1578      * @tc.expected: The result is right.
1579      */
1580     focusHub->SetFocusType(FocusType::NODE);
1581     std::string result;
__anon7f48b3121002(KeyEventInfo& info) 1582     auto onKey = [&result](KeyEventInfo& info) -> bool {
1583         result = RESULT_SUCCESS_ONE;
1584         return false;
1585     };
1586     focusHub->SetOnKeyCallback(onKey);
1587     EXPECT_NE(focusHub->GetOnKeyCallback(), nullptr);
1588     KeyEvent keyEvent;
1589     keyEvent.action = KeyAction::UP;
1590     focusHub->HandleEvent(keyEvent);
1591     EXPECT_EQ(result, RESULT_SUCCESS_ONE);
1592 
1593     /**
1594      * @tc.steps3: clear the function OnKey.
1595      * @tc.expected: The result is nullptr.
1596      */
1597     focusHub->ClearOnKeyCallback();
1598     EXPECT_EQ(focusHub->GetOnKeyCallback(), nullptr);
1599 
1600     /**
1601      * @tc.steps4: set the function OnKey again.
1602      * @tc.expected: The result is right.
1603      */
__anon7f48b3121102(KeyEventInfo& info) 1604     auto onKey2 = [&result](KeyEventInfo& info) -> bool {
1605         result = RESULT_SUCCESS_TWO;
1606         return false;
1607     };
1608     focusHub->SetOnKeyCallback(onKey2);
1609     EXPECT_NE(focusHub->GetOnKeyCallback(), nullptr);
1610 
1611     focusHub->HandleEvent(keyEvent);
1612     EXPECT_EQ(result, RESULT_SUCCESS_TWO);
1613 }
1614 
1615 /**
1616  * @tc.name: FocusHubTestNg0030
1617  * @tc.desc: Test the function GoToNextFocusLinear.
1618  * @tc.type: FUNC
1619  */
1620 HWTEST_F(FocusHubTestNg, FocusHubTestNg0030, TestSize.Level1)
1621 {
1622     /**
1623      * @tc.steps: step1. Create frameNode.
1624      */
1625     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1626         AceType::MakeRefPtr<Pattern>());
1627     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1628         AceType::MakeRefPtr<ButtonPattern>());
1629     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1630         AceType::MakeRefPtr<ButtonPattern>());
1631     child->GetOrCreateFocusHub();
1632     child2->GetOrCreateFocusHub();
1633     frameNode->AddChild(child);
1634     frameNode->AddChild(child2);
1635     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1636     eventHub->AttachHost(frameNode);
1637     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1638     focusHub->currentFocus_ = true;
1639     std::list<RefPtr<FocusHub>> focusNodes;
1640     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1641     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1642     EXPECT_FALSE(focusHub->GoToNextFocusLinear(FocusStep::NONE));
1643 }
1644 
1645 /**
1646  * @tc.name: FocusHubTestNg0031
1647  * @tc.desc: Test the function IsNeedPaintFocusState.
1648  * @tc.type: FUNC
1649  */
1650 HWTEST_F(FocusHubTestNg, FocusHubTestNg0031, TestSize.Level1)
1651 {
1652     /**
1653      * @tc.steps: step1. Create frameNode.
1654      */
1655     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1656         AceType::MakeRefPtr<Pattern>());
1657     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1658         AceType::MakeRefPtr<ButtonPattern>());
1659     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1660         AceType::MakeRefPtr<ButtonPattern>());
1661     child->GetOrCreateFocusHub();
1662     child2->GetOrCreateFocusHub();
1663     frameNode->AddChild(child);
1664     frameNode->AddChild(child2);
1665     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1666     eventHub->AttachHost(frameNode);
1667     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1668     std::list<RefPtr<FocusHub>> focusNodes;
1669     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1670     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1671     focusHub->IsNeedPaintFocusState();
1672     focusHub->focusType_ = FocusType::NODE;
1673     focusHub->focusStyleType_ = FocusStyleType::OUTER_BORDER;
1674     focusHub->IsNeedPaintFocusState();
1675     focusHub->focusType_ = FocusType::NODE;
1676     EXPECT_TRUE(focusHub->IsNeedPaintFocusState());
1677 }
1678 
1679 /**
1680  * @tc.name: FocusHubTestNg0032
1681  * @tc.desc: Test the function PaintFocusState.
1682  * @tc.type: FUNC
1683  */
1684 HWTEST_F(FocusHubTestNg, FocusHubTestNg0032, TestSize.Level1)
1685 {
1686     /**
1687      * @tc.steps: step1. Create frameNode.
1688      */
1689     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1690         AceType::MakeRefPtr<Pattern>());
1691     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1692         AceType::MakeRefPtr<ButtonPattern>());
1693     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1694         AceType::MakeRefPtr<ButtonPattern>());
1695     child->GetOrCreateFocusHub();
1696     child2->GetOrCreateFocusHub();
1697     frameNode->AddChild(child);
1698     frameNode->AddChild(child2);
1699     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1700     eventHub->AttachHost(frameNode);
1701     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1702     auto context = PipelineContext::GetCurrentContext();
1703     ASSERT_NE(context, nullptr);
1704     auto focusManager = context->GetOrCreateFocusManager();
1705     ASSERT_NE(focusManager, nullptr);
1706     focusManager->isFocusActive_ = true;
1707     focusHub->focusType_ = FocusType::NODE;
1708     focusHub->focusStyleType_ = FocusStyleType::OUTER_BORDER;
1709     std::list<RefPtr<FocusHub>> focusNodes;
1710     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1711     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1712     EXPECT_FALSE(focusHub->PaintFocusState(true));
1713     EXPECT_FALSE(focusHub->PaintFocusState(false));
1714 }
1715 
1716 /**
1717  * @tc.name: FocusHubTestNg0033
1718  * @tc.desc: Test the function AcceptFocusOfSpecifyChild.
1719  * @tc.type: FUNC
1720  */
1721 HWTEST_F(FocusHubTestNg, FocusHubTestNg0033, TestSize.Level1)
1722 {
1723     /**
1724      * @tc.steps: step1. Create frameNode.
1725      */
1726     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1727         AceType::MakeRefPtr<Pattern>());
1728     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1729         AceType::MakeRefPtr<ButtonPattern>());
1730     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1731         AceType::MakeRefPtr<ButtonPattern>());
1732     child->GetOrCreateFocusHub();
1733     child2->GetOrCreateFocusHub();
1734     frameNode->AddChild(child);
1735     frameNode->AddChild(child2);
1736     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1737     eventHub->AttachHost(frameNode);
1738     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1739     focusHub->focusType_ = FocusType::DISABLE;
1740     std::list<RefPtr<FocusHub>> focusNodes;
1741     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1742     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1743     focusHub->AcceptFocusOfSpecifyChild(FocusStep::TAB);
1744     focusHub->focusType_ = FocusType::SCOPE;
1745     EXPECT_FALSE(focusHub->AcceptFocusOfSpecifyChild(FocusStep::SHIFT_TAB));
1746     EXPECT_FALSE(focusHub->AcceptFocusOfSpecifyChild(FocusStep::TAB));
1747 }
1748 
1749 /**
1750  * @tc.name: FocusHubTestNg0034
1751  * @tc.desc: Test the function ClearFocusState.
1752  * @tc.type: FUNC
1753  */
1754 HWTEST_F(FocusHubTestNg, FocusHubTestNg0034, TestSize.Level1)
1755 {
1756     /**
1757      * @tc.steps: step1. Create frameNode.
1758      */
1759     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1760         AceType::MakeRefPtr<Pattern>());
1761     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1762     eventHub->AttachHost(frameNode);
1763     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1764     focusHub->focusStyleType_ = FocusStyleType::CUSTOM_REGION;
1765     std::list<RefPtr<FocusHub>> focusNodes;
1766     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1767     EXPECT_EQ(itNewFocusNode, focusNodes.end());
__anon7f48b3121202() 1768     focusHub->onClearFocusStateCallback_ = []() {};
1769     focusHub->ClearFocusState(true);
1770     focusHub->ClearFocusState(false);
1771     EXPECT_NE(focusHub->focusStyleType_, FocusStyleType::NONE);
1772 }
1773 
1774 /**
1775  * @tc.name: FocusHubTestNg0035
1776  * @tc.desc: Test the function RequestFocusImmediately.
1777  * @tc.type: FUNC
1778  */
1779 HWTEST_F(FocusHubTestNg, FocusHubTestNg0035, TestSize.Level1)
1780 {
1781     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1782     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1783     auto context = PipelineContext::GetCurrentContext();
1784     ASSERT_NE(context, nullptr);
1785 
1786     context->SetIsFocusingByTab(true);
1787     focusHub->SetFocusType(FocusType::DISABLE);
1788     focusHub->focusType_ = FocusType::NODE;
1789     focusHub->currentFocus_ = false;
__anon7f48b3121302() 1790     focusHub->onPreFocusCallback_ = []() {};
1791     EXPECT_FALSE(focusHub->RequestFocusImmediately());
1792     EXPECT_FALSE(focusHub->RequestFocusImmediately());
1793     context->SetIsFocusingByTab(false);
1794     focusHub->SetFocusType(FocusType::DISABLE);
1795     focusHub->currentFocus_ = true;
1796     EXPECT_TRUE(focusHub->RequestFocusImmediately());
1797 }
1798 
1799 /**
1800  * @tc.name: FocusHubTestNg0036
1801  * @tc.desc: Test the function OnFocusScope.
1802  * @tc.type: FUNC
1803  */
1804 HWTEST_F(FocusHubTestNg, FocusHubTestNg0036, TestSize.Level1)
1805 {
1806     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1807         AceType::MakeRefPtr<Pattern>());
1808     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1809         AceType::MakeRefPtr<ButtonPattern>());
1810     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1811         AceType::MakeRefPtr<ButtonPattern>());
1812     child->GetOrCreateFocusHub();
1813     child2->GetOrCreateFocusHub();
1814     frameNode->AddChild(child);
1815     frameNode->AddChild(child2);
1816     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1817     eventHub->AttachHost(frameNode);
1818     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1819     focusHub->currentFocus_ = true;
1820     std::list<RefPtr<FocusHub>> focusNodes;
1821     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1822     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1823     focusHub->OnFocusScope();
1824     EXPECT_TRUE(focusHub->currentFocus_);
1825 }
1826 
1827 /**
1828  * @tc.name: FocusHubTestNg0037
1829  * @tc.desc: Test the function IsFocusableScopeByTab.
1830  * @tc.type: FUNC
1831  */
1832 HWTEST_F(FocusHubTestNg, FocusHubTestNg0037, TestSize.Level1)
1833 {
1834     /**
1835      * @tc.steps: step1. Create frameNode.
1836      */
1837     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1838         AceType::MakeRefPtr<Pattern>());
1839     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1840         AceType::MakeRefPtr<ButtonPattern>());
1841     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
1842         AceType::MakeRefPtr<ButtonPattern>());
1843     child->GetOrCreateFocusHub();
1844     child2->GetOrCreateFocusHub();
1845     frameNode->AddChild(child);
1846     frameNode->AddChild(child2);
1847     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1848     eventHub->AttachHost(frameNode);
1849     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1850     focusHub->currentFocus_ = true;
1851     std::list<RefPtr<FocusHub>> focusNodes;
1852     auto itNewFocusNode = focusHub->FlushChildrenFocusHub(focusNodes);
1853     EXPECT_EQ(itNewFocusNode, focusNodes.end());
1854     EXPECT_TRUE(focusHub->IsFocusableScopeByTab());
1855 }
1856 
1857 /**
1858  * @tc.name: FocusHubTestNg0038
1859  * @tc.desc: Test the function IsCurrentFocusWholePath.
1860  * @tc.type: FUNC
1861  */
1862 HWTEST_F(FocusHubTestNg, FocusHubTestNg0038, TestSize.Level1)
1863 {
1864     /**
1865      * @tc.steps: step1. Create frameNode.
1866      */
1867     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1868         AceType::MakeRefPtr<Pattern>());
1869     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1870     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1871     ASSERT_NE(focusHub, nullptr);
1872     EXPECT_FALSE(focusHub->IsCurrentFocusWholePath());
1873     focusHub->currentFocus_ = true;
1874     EXPECT_FALSE(focusHub->IsCurrentFocusWholePath());
1875     focusHub->focusType_ = FocusType::NODE;
1876     EXPECT_TRUE(focusHub->IsCurrentFocusWholePath());
1877     focusHub->focusType_ = FocusType::SCOPE;
1878     EXPECT_FALSE(focusHub->IsCurrentFocusWholePath());
1879 }
1880 
1881 /**
1882  * @tc.name: FocusHubTestNg0039
1883  * @tc.desc: Test the function DumpFocusTree.
1884  * @tc.type: FUNC
1885  */
1886 HWTEST_F(FocusHubTestNg, FocusHubTestNg0039, TestSize.Level1)
1887 {
1888     /**
1889      * @tc.steps: step1. Create frameNode.
1890      */
1891     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1892         AceType::MakeRefPtr<Pattern>());
1893     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1894     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1895     ASSERT_NE(focusHub, nullptr);
1896     int32_t depth = 1;
1897     focusHub->focusType_ = FocusType::DISABLE;
1898     focusHub->DumpFocusTree(depth);
1899 }
1900 
1901 /**
1902  * @tc.name: FocusHubTestNg0040
1903  * @tc.desc: Test the function AcceptFocusOfLastFocus and AcceptFocusByRectOfLastFocus.
1904  * @tc.type: FUNC
1905  */
1906 HWTEST_F(FocusHubTestNg, FocusHubTestNg0040, TestSize.Level1)
1907 {
1908     /**
1909      * @tc.steps: step1. Create frameNode.
1910      */
1911     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1912         AceType::MakeRefPtr<Pattern>());
1913     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1914     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1915     ASSERT_NE(focusHub, nullptr);
1916     RectF childRect;
1917     focusHub->focusType_ = FocusType::SCOPE;
1918     EXPECT_FALSE(focusHub->AcceptFocusOfLastFocus());
1919     EXPECT_FALSE(focusHub->AcceptFocusByRectOfLastFocus(childRect));
1920     focusHub->focusType_ = FocusType::NODE;
1921     EXPECT_FALSE(focusHub->AcceptFocusOfLastFocus());
1922     EXPECT_FALSE(focusHub->AcceptFocusByRectOfLastFocus(childRect));
1923     focusHub->focusType_ = FocusType::DISABLE;
1924     EXPECT_FALSE(focusHub->AcceptFocusOfLastFocus());
1925     EXPECT_FALSE(focusHub->AcceptFocusByRectOfLastFocus(childRect));
1926 }
1927 
1928 /**
1929  * @tc.name: FocusHubTestNg0041
1930  * @tc.desc: Test the function SetShow, SetEnabled, SetEnabledNode and SetEnabledScope.
1931  * @tc.type: FUNC
1932  */
1933 HWTEST_F(FocusHubTestNg, FocusHubTestNg0041, TestSize.Level1)
1934 {
1935     /**
1936      * @tc.steps: step1. Create frameNode.
1937      */
1938     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1939         AceType::MakeRefPtr<Pattern>());
1940     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1941     eventHub->AttachHost(frameNode);
1942     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1943     ASSERT_NE(focusHub, nullptr);
1944     auto frameNode_test = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_COMPONENT_TAG, -1,
1945         AceType::MakeRefPtr<Pattern>());
1946     frameNode->parent_ = AceType::WeakClaim(AceType::RawPtr(frameNode_test));
1947     AceType::DynamicCast<FrameNodeOnTree>(frameNode->GetParent())
1948         ->GetLayoutProperty()
1949         ->UpdateVisibility(VisibleType::INVISIBLE);
1950     focusHub->IsShow();
1951 }
1952 
1953 /**
1954  * @tc.name: FocusHubTestNg0042
1955  * @tc.desc: Test the function OnClick.
1956  * @tc.type: FUNC
1957  */
1958 HWTEST_F(FocusHubTestNg, FocusHubTestNg0042, TestSize.Level1)
1959 {
1960     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
1961         AceType::MakeRefPtr<Pattern>());
1962     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1963     eventHub->AttachHost(frameNode);
1964     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1965     ASSERT_NE(focusHub, nullptr);
1966     KeyEvent keyEvent;
__anon7f48b3121402(GestureEvent&) 1967     focusHub->SetOnClickCallback([](GestureEvent&) { return; });
1968     EXPECT_TRUE(focusHub->OnClick(keyEvent));
1969 }
1970 
1971 /**
1972  * @tc.name: HasBackwardFocusMovementInChildren001
1973  * @tc.desc: Test the function HasBackwardFocusMovementInChildren.
1974  * @tc.type: FUNC
1975  */
1976 HWTEST_F(FocusHubTestNg, HasBackwardFocusMovementInChildren001, TestSize.Level1)
1977 {
1978     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
1979     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1980     eventHub->AttachHost(frameNode);
1981     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1982     ASSERT_NE(focusHub, nullptr);
1983     KeyEvent keyEvent;
1984     ASSERT_FALSE(focusHub->HasBackwardFocusMovementInChildren());
1985 }
1986 
1987 /**
1988  * @tc.name: HasForwardFocusMovementInChildren001
1989  * @tc.desc: Test the function HasForwardFocusMovementInChildren.
1990  * @tc.type: FUNC
1991  */
1992 HWTEST_F(FocusHubTestNg, HasForwardFocusMovementInChildren001, TestSize.Level1)
1993 {
1994     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
1995     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
1996     eventHub->AttachHost(frameNode);
1997     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
1998     ASSERT_NE(focusHub, nullptr);
1999     KeyEvent keyEvent;
2000     ASSERT_FALSE(focusHub->HasForwardFocusMovementInChildren());
2001 }
2002 
2003 /**
2004  * @tc.name: ClearFocusMovementFlagsInChildren001
2005  * @tc.desc: Test the function ClearFocusMovementFlagsInChildren.
2006  * @tc.type: FUNC
2007  */
2008 HWTEST_F(FocusHubTestNg, ClearFocusMovementFlagsInChildren001, TestSize.Level1)
2009 {
2010     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2011     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2012     eventHub->AttachHost(frameNode);
2013     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2014     ASSERT_NE(focusHub, nullptr);
2015     KeyEvent keyEvent;
2016     ASSERT_FALSE(focusHub->HasBackwardFocusMovement());
2017 }
2018 
2019 /**
2020  * @tc.name: SetLastWeakFocusToPreviousInFocusView001
2021  * @tc.desc: Test the function SetLastWeakFocusToPreviousInFocusView.
2022  * @tc.type: FUNC
2023  */
2024 HWTEST_F(FocusHubTestNg, SetLastWeakFocusToPreviousInFocusView001, TestSize.Level1)
2025 {
2026     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2027     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2028     eventHub->AttachHost(frameNode);
2029     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2030     ASSERT_NE(focusHub, nullptr);
2031     KeyEvent keyEvent;
2032     focusHub->SetLastWeakFocusToPreviousInFocusView();
2033     ASSERT_FALSE(focusHub->lastWeakFocusNode_.Upgrade());
2034 }
2035 
2036 /**
2037  * @tc.name: FocusHubFlushChildrenFocusHubTest001
2038  * @tc.desc: Test the function SetTabStop and IsTabStop
2039  * @tc.type: FUNC
2040  */
2041 HWTEST_F(FocusHubTestNg, FocusHubSetTabStopTest001, TestSize.Level1)
2042 {
2043     /**
2044      * @tc.steps: step1. Create frameNode
2045      */
2046     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
2047         AceType::MakeRefPtr<Pattern>());
2048     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2049     eventHub->AttachHost(frameNode);
2050     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2051     EXPECT_EQ(focusHub->IsTabStop(), false);
2052     focusHub->SetTabStop(true);
2053     EXPECT_EQ(focusHub->IsTabStop(), true);
2054     focusHub->SetTabStop(false);
2055     EXPECT_EQ(focusHub->IsTabStop(), false);
2056 }
2057 
2058 /**
2059  * @tc.name: FocusHubRequestNextFocusOfKeyEnterTest001
2060  * @tc.desc: Test the function RequestNextFocusOfKeyEnter
2061  * @tc.type: FUNC
2062  */
2063 HWTEST_F(FocusHubTestNg, FocusHubRequestNextFocusOfKeyEnterTest001, TestSize.Level1)
2064 {
2065     /**
2066      * @tc.steps: step1. Create frameNode
2067      */
2068     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
2069         AceType::MakeRefPtr<Pattern>());
2070     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2071     eventHub->AttachHost(frameNode);
2072     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2073     EXPECT_EQ(focusHub->RequestNextFocusOfKeyEnter(), false);
2074     focusHub->SetTabStop(true);
2075     focusHub->focusType_ = FocusType::NODE;
2076     EXPECT_EQ(focusHub->RequestNextFocusOfKeyEnter(), false);
2077     focusHub->SetTabStop(true);
2078     focusHub->focusType_ = FocusType::SCOPE;
2079     EXPECT_EQ(focusHub->RequestNextFocusOfKeyEnter(), true);
2080 }
2081 
2082 /**
2083  * @tc.name: FocusHubRequestNextFocusOfKeyEscTest001
2084  * @tc.desc: Test the function RequestNextFocusOfKeyEsc
2085  * @tc.type: FUNC
2086  */
2087 HWTEST_F(FocusHubTestNg, FocusHubRequestNextFocusOfKeyEscTest001, TestSize.Level1)
2088 {
2089     /**
2090      * @tc.steps: step1. Create frameNode
2091      */
2092     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
2093         AceType::MakeRefPtr<Pattern>());
2094     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
2095         AceType::MakeRefPtr<ButtonPattern>());
2096     auto child2 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1,
2097         AceType::MakeRefPtr<ButtonPattern>());
2098     child->GetOrCreateFocusHub();
2099     child2->GetOrCreateFocusHub();
2100     frameNode->AddChild(child);
2101     frameNode->AddChild(child2);
2102 
2103     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2104     eventHub->AttachHost(frameNode);
2105     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2106     EXPECT_EQ(focusHub->RequestNextFocusOfKeyEsc(), false);
2107 
2108     focusHub->SetTabStop(true);
2109     EXPECT_EQ(focusHub->RequestNextFocusOfKeyEsc(), false);
2110 
2111     focusHub->SetTabStop(false);
2112     RefPtr<EventHub> eventHub1 = AceType::MakeRefPtr<EventHub>();
2113     eventHub1->AttachHost(child);
2114     auto focusHub1 = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub1)));
2115     focusHub1->SetTabStop(true);
2116     EXPECT_EQ(focusHub1->RequestNextFocusOfKeyEsc(), false);
2117 }
2118 
2119 /**
2120  * @tc.name: FocusHubOnFocusAxisEvent001
2121  * @tc.desc: Test the function OnFocusKeyEvent.
2122  * @tc.type: FUNC
2123  */
2124 HWTEST_F(FocusHubTestNg, FocusHubOnFocusAxisEvent001, TestSize.Level1)
2125 {
2126     /**
2127      * @tc.steps1: create frameNode.
2128      */
2129     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1,
2130         AceType::MakeRefPtr<Pattern>());
2131 
2132     /**
2133      * @tc.steps2: create eventHub and focusHub.
2134      */
2135     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2136     eventHub->AttachHost(frameNode);
2137     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2138     FocusAxisEvent focusAxisEvent;
2139     focusAxisEvent.absXValue = 0.5;
2140     focusAxisEvent.absYValue = 0.5;
2141     focusAxisEvent.absZValue = 0.5;
2142     focusAxisEvent.absRzValue = 0.5;
2143     focusAxisEvent.absHat0XValue = 1;
2144     focusAxisEvent.absHat0YValue = 1;
2145     focusAxisEvent.absBrakeValue = 0.5;
2146     focusAxisEvent.absGasValue = 0.5;
2147     focusAxisEvent.sourceType = SourceType::MOUSE;
2148     focusAxisEvent.sourceTool = SourceTool::JOYSTICK;
2149     focusAxisEvent.deviceId = 10;
2150     std::chrono::microseconds microseconds(GetSysTimestamp());
2151     TimeStamp time(microseconds);
2152     focusAxisEvent.time = time;
2153     focusAxisEvent.pressedCodes.emplace_back(KeyCode::KEY_CTRL_LEFT);
2154 
2155     /**
2156      * @tc.steps3: call the function OnKeyEvent with FocusType::NODE.
2157      * @tc.expected: The return value of OnKeyEvent is true.
2158      */
2159     focusHub->SetFocusType(FocusType::NODE);
2160     focusHub->currentFocus_ = true;
2161     FocusAxisEventInfo axisEventInfo({});
__anon7f48b3121502(FocusAxisEventInfo& eventInfo) 2162     auto onFocusAxisEventCallback = [&axisEventInfo](FocusAxisEventInfo& eventInfo) {
2163         eventInfo.SetStopPropagation(true);
2164         axisEventInfo = eventInfo;
2165     };
2166     focusHub->SetOnFocusAxisCallback(std::move(onFocusAxisEventCallback));
2167     EXPECT_TRUE(focusHub->HandleEvent(focusAxisEvent));
2168     EXPECT_EQ(axisEventInfo.GetAbsXValue(), 0.5);
2169     EXPECT_EQ(axisEventInfo.GetAbsYValue(), 0.5);
2170     EXPECT_EQ(axisEventInfo.GetAbsZValue(), 0.5);
2171     EXPECT_EQ(axisEventInfo.GetAbsRzValue(), 0.5);
2172     EXPECT_EQ(axisEventInfo.GetAbsHat0XValue(), 1);
2173     EXPECT_EQ(axisEventInfo.GetAbsHat0YValue(), 1);
2174     EXPECT_EQ(axisEventInfo.GetAbsBrakeValue(), 0.5);
2175     EXPECT_EQ(axisEventInfo.GetAbsGasValue(), 0.5);
2176     EXPECT_EQ(axisEventInfo.GetSourceDevice(), SourceType::MOUSE);
2177     EXPECT_EQ(axisEventInfo.GetSourceTool(), SourceTool::JOYSTICK);
2178     EXPECT_EQ(axisEventInfo.GetDeviceId(), 10);
2179     EXPECT_EQ(axisEventInfo.GetTimeStamp().time_since_epoch().count(), time.time_since_epoch().count());
2180     EXPECT_EQ(axisEventInfo.GetPressedKeyCodes().size(), 1);
2181     EXPECT_EQ(axisEventInfo.IsStopPropagation(), true);
2182 }
2183 
2184 /**
2185  * @tc.name: FocusHubHandleFocusNavigation001
2186  * @tc.desc: FocusNavigation
2187  * @tc.type: FUNC
2188  */
2189 HWTEST_F(FocusHubTestNg, FocusHubHandleFocusNavigation001, TestSize.Level1)
2190 {
2191     /**
2192      * @tc.steps: step1. Create frameNode.
2193      */
2194     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2195     ASSERT_NE(frameNode, nullptr);
2196 
2197     /**
2198      * @tc.steps: step2. Create FocusHub.
2199      */
2200     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2201     eventHub->AttachHost(frameNode);
2202     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2203     ASSERT_NE(focusHub, nullptr);
2204 
2205     focusHub->lastWeakFocusNode_ = nullptr;
2206     KeyEvent keyEvent;
2207     keyEvent.pressedCodes.emplace_back(KeyCode::KEY_HOME);
2208     FocusEvent focusEvent(keyEvent);
2209 
2210     /**
2211      * @tc.steps: step3. Expect the result is false.
2212      */
2213     auto result = focusHub->HandleFocusNavigation(focusEvent);
2214     EXPECT_FALSE(result);
2215 }
2216 
2217 /**
2218  * @tc.name: HasCustomKeyEventDispatch001
2219  * @tc.desc: Test the function when event.event.eventType is UIInputEventType::KEY
2220  * @tc.type: FUNC
2221  */
2222 HWTEST_F(FocusHubTestNg, HasCustomKeyEventDispatch001, TestSize.Level1)
2223 {
2224     /**
2225      * @tc.steps: step1. Create focusEvent.
2226      */
2227     KeyEvent keyEvent;
2228     keyEvent.eventType = UIInputEventType::KEY;
2229     keyEvent.isPreIme = true;
2230     FocusEvent focusEvent(keyEvent);
2231 
2232     /**
2233      * @tc.steps: step2. Create focusHub.
2234      */
2235     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2236     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2237     ASSERT_NE(frameNode, nullptr);
2238     eventHub->AttachHost(frameNode);
2239     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2240     ASSERT_NE(focusHub, nullptr);
2241 
2242     /**
2243      * @tc.steps: step3. Expect the result is false.
2244      */
2245     auto result = focusHub->HasCustomKeyEventDispatch(focusEvent);
2246     EXPECT_FALSE(result);
2247 }
2248 
2249 /**
2250  * @tc.name: HasCustomKeyEventDispatch002
2251  * @tc.desc: Test the function when event.event.eventType is not UIInputEventType::KEY, keyEvent.isPreIme is false and
2252  * GetOnKeyEventDispatchCallback is not null
2253  * @tc.type: FUNC
2254  */
2255 HWTEST_F(FocusHubTestNg, HasCustomKeyEventDispatch002, TestSize.Level1)
2256 {
2257     /**
2258      * @tc.steps: step1. Create focusEvent.
2259      */
2260     KeyEvent keyEvent;
2261     keyEvent.eventType = UIInputEventType::KEY;
2262     keyEvent.isPreIme = false;
2263     FocusEvent focusEvent(keyEvent);
2264 
2265     /**
2266      * @tc.steps: step2. Create focusHub.
2267      */
2268     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2269     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2270     ASSERT_NE(frameNode, nullptr);
2271     eventHub->AttachHost(frameNode);
2272     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2273     ASSERT_NE(focusHub, nullptr);
2274 
2275     /**
2276      * @tc.steps: step3. Set the SetOnKeyEventDispatchCallback.
2277      */
__anon7f48b3121602(KeyEventInfo& info) 2278     auto onKeyEventDispatchCallback = [](KeyEventInfo& info) -> bool { return true; };
2279     focusHub->SetOnKeyEventDispatchCallback(std::move(onKeyEventDispatchCallback));
2280 
2281     /**
2282      * @tc.steps: step4. Expect the result is true.
2283      */
2284     auto result = focusHub->HasCustomKeyEventDispatch(focusEvent);
2285     EXPECT_TRUE(result);
2286 }
2287 
2288 /**
2289  * @tc.name: HasCustomKeyEventDispatch003
2290  * @tc.desc: Test the function when event.event.eventType is not UIInputEventType::KEY, keyEvent.isPreIme is true
2291  * @tc.type: FUNC
2292  */
2293 HWTEST_F(FocusHubTestNg, HasCustomKeyEventDispatch003, TestSize.Level1)
2294 {
2295     /**
2296      * @tc.steps: step1. Create focusEvent.
2297      */
2298     KeyEvent keyEvent;
2299     keyEvent.eventType = UIInputEventType::KEY;
2300     keyEvent.isPreIme = true;
2301     FocusEvent focusEvent(keyEvent);
2302 
2303     /**
2304      * @tc.steps: step2. Create focusHub.
2305      */
2306     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2307     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2308     ASSERT_NE(frameNode, nullptr);
2309     eventHub->AttachHost(frameNode);
2310     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2311     ASSERT_NE(focusHub, nullptr);
2312 
2313     /**
2314      * @tc.steps: step3. Set the SetOnKeyEventDispatchCallback.
2315      */
__anon7f48b3121702(KeyEventInfo& info) 2316     auto onKeyEventDispatchCallback = [](KeyEventInfo& info) -> bool { return true; };
2317     focusHub->SetOnKeyEventDispatchCallback(std::move(onKeyEventDispatchCallback));
2318 
2319     /**
2320      * @tc.steps: step4. Expect the result is false.
2321      */
2322     auto result = focusHub->HasCustomKeyEventDispatch(focusEvent);
2323     EXPECT_FALSE(result);
2324 }
2325 
2326 /**
2327  * @tc.name: HandleCustomEventDispatch001
2328  * @tc.desc: Test the function when onKeyEventDispatchCallback is true
2329  * @tc.type: FUNC
2330  */
2331 HWTEST_F(FocusHubTestNg, HandleCustomEventDispatch001, TestSize.Level1)
2332 {
2333     /**
2334      * @tc.steps: step1. Create focusEvent.
2335      */
2336     KeyEvent keyEvent;
2337     FocusEvent focusEvent(keyEvent);
2338 
2339     /**
2340      * @tc.steps: step2. Create focusHub.
2341      */
2342     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2343     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2344     ASSERT_NE(frameNode, nullptr);
2345     eventHub->AttachHost(frameNode);
2346     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2347     ASSERT_NE(focusHub, nullptr);
2348 
2349     /**
2350      * @tc.steps: step3. Set the SetOnKeyEventDispatchCallback.
2351      */
__anon7f48b3121802(KeyEventInfo& info) 2352     auto onKeyEventDispatchCallback = [](KeyEventInfo& info) -> bool { return true; };
2353     focusHub->SetOnKeyEventDispatchCallback(std::move(onKeyEventDispatchCallback));
2354 
2355     /**
2356      * @tc.steps: step4. Expect the result is true.
2357      */
2358     auto result = focusHub->HandleCustomEventDispatch(focusEvent);
2359     EXPECT_TRUE(result);
2360 }
2361 
2362 /**
2363  * @tc.name: HandleCustomEventDispatch002
2364  * @tc.desc: Test the function when onKeyEventDispatchCallback is false
2365  * @tc.type: FUNC
2366  */
2367 HWTEST_F(FocusHubTestNg, HandleCustomEventDispatch002, TestSize.Level1)
2368 {
2369     /**
2370      * @tc.steps: step1. Create focusEvent.
2371      */
2372     KeyEvent keyEvent;
2373     FocusEvent focusEvent(keyEvent);
2374 
2375     /**
2376      * @tc.steps: step2. Create focusHub.
2377      */
2378     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2379     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2380     ASSERT_NE(frameNode, nullptr);
2381     eventHub->AttachHost(frameNode);
2382     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2383     ASSERT_NE(focusHub, nullptr);
2384 
2385     /**
2386      * @tc.steps: step3. Set the SetOnKeyEventDispatchCallback.
2387      */
__anon7f48b3121902(KeyEventInfo& info) 2388     auto onKeyEventDispatchCallback = [](KeyEventInfo& info) -> bool { return false; };
2389     focusHub->SetOnKeyEventDispatchCallback(std::move(onKeyEventDispatchCallback));
2390 
2391     /**
2392      * @tc.steps: step4. Expect the result is true.
2393      */
2394     auto result = focusHub->HandleCustomEventDispatch(focusEvent);
2395     EXPECT_FALSE(result);
2396 }
2397 
2398 /**
2399  * @tc.name: GetKeyProcessingMode001
2400  * @tc.desc: GetKeyProcessingMode
2401  * @tc.type: FUNC
2402  */
2403 HWTEST_F(FocusHubTestNg, GetKeyProcessingMode001, TestSize.Level1)
2404 {
2405     /**
2406      * @tc.steps: step1. Create focusHub.
2407      */
2408     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2409     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2410     ASSERT_NE(frameNode, nullptr);
2411     eventHub->AttachHost(frameNode);
2412     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2413     ASSERT_NE(focusHub, nullptr);
2414 
2415     /**
2416      * @tc.steps: step2. Expect the result is static_cast<int32_t>(KeyProcessingMode::FOCUS_NAVIGATION).
2417      */
2418     auto result = focusHub->GetKeyProcessingMode();
2419     EXPECT_EQ(result, static_cast<int32_t>(KeyProcessingMode::FOCUS_NAVIGATION));
2420 }
2421 
2422 /**
2423  * @tc.name: GetKeyProcessingMode002
2424  * @tc.desc: GetKeyProcessingMode
2425  * @tc.type: FUNC
2426  */
2427 HWTEST_F(FocusHubTestNg, GetKeyProcessingMode002, TestSize.Level1)
2428 {
2429     /**
2430      * @tc.steps: step1. Create focusHub.
2431      */
2432     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2433     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2434     ASSERT_NE(frameNode, nullptr);
2435     eventHub->AttachHost(frameNode);
2436     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2437     ASSERT_NE(focusHub, nullptr);
2438 
2439     /**
2440      * @tc.steps: step1. Set keyProcessingMode_.
2441      */
2442     ASSERT_NE(focusHub->GetFrameNode(), nullptr);
2443     ASSERT_NE(focusHub->GetFrameNode()->GetContextRefPtr(), nullptr);
2444     ASSERT_NE(focusHub->GetFrameNode()->GetContextRefPtr()->GetOrCreateFocusManager(), nullptr);
2445     focusHub->GetFrameNode()->GetContextRefPtr()->GetOrCreateFocusManager()->keyProcessingMode_ =
2446         KeyProcessingMode::ANCESTOR_EVENT;
2447 
2448     /**
2449      * @tc.steps: step3. Expect the result is static_cast<int32_t>(KeyProcessingMode::ANCESTOR_EVENT).
2450      */
2451     auto result = focusHub->GetKeyProcessingMode();
2452     EXPECT_EQ(result, static_cast<int32_t>(KeyProcessingMode::ANCESTOR_EVENT));
2453 }
2454 
2455 /**
2456  * @tc.name: FocusHubPaintColorTest001
2457  * @tc.desc: Test the function GetPaintColorFromBox
2458  * @tc.type: FUNC
2459  */
2460 HWTEST_F(FocusHubTestNg, FocusHubPaintColorTest001, TestSize.Level1)
2461 {
2462     /**
2463      * @tc.steps: step1. Create focusHub.
2464      */
2465     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2466     ASSERT_NE(frameNode, nullptr);
2467     auto focusHub = frameNode->GetOrCreateFocusHub();
2468     ASSERT_NE(focusHub, nullptr);
2469     auto context = PipelineContext::GetCurrentContext();
2470     ASSERT_NE(context, nullptr);
2471     Color expectPaintColor;
2472     Color resultPaintColor;
2473 
2474     /**
2475      * @tc.steps: step2. Test without anything.
2476      */
2477     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
2478     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
2479     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr<AppTheme>()));
2480     auto appTheme = context->GetTheme<AppTheme>();
2481     appTheme->focusColor_ = Color::GREEN;
2482     expectPaintColor = Color::GREEN;
2483     focusHub->GetPaintColorFromBox(resultPaintColor);
2484     EXPECT_EQ(expectPaintColor, resultPaintColor);
2485 
2486     /**
2487      * @tc.steps: step3. Test with custom paintColor.
2488      */
2489     auto testFocusPaintParams = std::make_unique<FocusPaintParam>();
2490     testFocusPaintParams->paintColor = Color::BLACK;
2491     expectPaintColor = Color::BLACK;
2492     focusHub->focusPaintParamsPtr_ = std::move(testFocusPaintParams);
2493     focusHub->GetPaintColorFromBox(resultPaintColor);
2494     EXPECT_EQ(expectPaintColor, resultPaintColor);
2495 
2496     /**
2497      * @tc.steps: step4. Test with custom paintColor and focusbox.
2498      */
2499     FocusBoxStyle style = { Color::RED };
2500     expectPaintColor = Color::RED;
2501     focusHub->GetFocusBox().SetStyle(style);
2502     focusHub->GetPaintColorFromBox(resultPaintColor);
2503     EXPECT_EQ(expectPaintColor, resultPaintColor);
2504 }
2505 
2506 /**
2507  * @tc.name: FocusHubIsLeafFocusScopeTest001
2508  * @tc.desc: Test IsLeafFocusScope returns true when focusDepend_ is SELF
2509  * @tc.type: FUNC
2510  */
2511 HWTEST_F(FocusHubTestNg, FocusHubIsLeafFocusScopeTest001, TestSize.Level1)
2512 {
2513     /**
2514      * @tc.steps1: Create a page node and add a button child node.
2515      */
2516     auto pageNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::PAGE_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2517     auto button1 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1, AceType::MakeRefPtr<ButtonPattern>());
2518     button1->GetOrCreateFocusHub();
2519     pageNode->AddChild(button1);
2520 
2521     /**
2522      * @tc.steps2: Create EventHub and FocusHub for the page node.
2523      */
2524     RefPtr<EventHub> pageEventHub = AceType::MakeRefPtr<EventHub>();
2525     pageEventHub->AttachHost(pageNode);
2526     auto pageFocusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(pageEventHub)));
2527 
2528     /**
2529      * @tc.steps3: Set page visibility to INVISIBLE, set lastWeakFocusNode_ and focusDepend_ to SELF.
2530      * @tc.expected: IsLeafFocusScope returns true.
2531      */
2532     pageNode->layoutProperty_->propVisibility_ = VisibleType::INVISIBLE;
2533     RefPtr<FocusHub> childFocusHub = button1->GetFocusHub();
2534     ASSERT_NE(childFocusHub, nullptr);
2535     pageFocusHub->lastWeakFocusNode_ = AceType::WeakClaim(AceType::RawPtr(childFocusHub));
2536     pageFocusHub->focusDepend_ = FocusDependence::SELF;
2537     bool isLeaf = pageFocusHub->IsLeafFocusScope();
2538     EXPECT_TRUE(isLeaf);
2539     EXPECT_EQ(pageFocusHub->lastWeakFocusNode_.Upgrade(), childFocusHub);
2540 
2541     /**
2542      * @tc.steps4: Set page visibility to VISIBLE, and simulate key event delivery.
2543      * @tc.expected: Key event is successfully handled.
2544      */
2545     pageNode->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
2546     KeyEvent keyEvent;
2547     keyEvent.code = KeyCode::KEY_SPACE;
2548     keyEvent.action = KeyAction::DOWN;
__anon7f48b3121a02(const KeyEvent&) 2549     childFocusHub->SetOnKeyEventInternal([](const KeyEvent&) { return true; });
2550     childFocusHub->currentFocus_ = true;
2551     pageFocusHub->focusType_ = FocusType::SCOPE;
2552     pageFocusHub->currentFocus_ = true;
2553     EXPECT_TRUE(pageFocusHub->HandleEvent(keyEvent));
2554 }
2555 
2556 /**
2557  * @tc.name: FocusHubUpdateFocusViewTest001
2558  * @tc.desc: Test UpdateFocusView when the current node is not on the main tree.
2559  * @tc.type: FUNC
2560  */
2561 HWTEST_F(FocusHubTestNg, FocusHubUpdateFocusViewTest001, TestSize.Level1)
2562 {
2563     /**
2564      * @tc.steps1: Create a FrameNode with onMainTree_ set to false.
2565      */
2566     auto pattern = AceType::MakeRefPtr<Pattern>();
2567     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, pattern);
2568     frameNode->onMainTree_ = false;
2569 
2570     /**
2571      * @tc.steps2: Create EventHub and FocusHub, and set currentFocus_ to true.
2572      */
2573     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2574     eventHub->AttachHost(frameNode);
2575     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2576     focusHub->currentFocus_ = true;
2577 
2578     /**
2579      * @tc.steps3: Call UpdateFocusView and expect it to return true even if not on main tree.
2580      * @tc.expected: UpdateFocusView returns true.
2581      */
2582     EXPECT_TRUE(focusHub->UpdateFocusView());
2583 }
2584 
2585 /**
2586  * @tc.name: FocusEventHandlerOnFocusEventTest001
2587  * @tc.desc: Test that OnFocusEvent returns false when the node is not focused.
2588  * @tc.type: FUNC
2589  */
2590 HWTEST_F(FocusHubTestNg, FocusEventHandlerOnFocusEventTest001, TestSize.Level1)
2591 {
2592      /**
2593      * @tc.steps1: Create a FrameNode and attach it to an EventHub.
2594      */
2595     auto frameNode = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, 1, AceType::MakeRefPtr<Pattern>());
2596     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2597     ASSERT_NE(eventHub, nullptr);
2598     eventHub->AttachHost(frameNode);
2599 
2600     /**
2601      * @tc.steps2: Create a FocusHub with no current focus.
2602      */
2603     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2604 
2605      /**
2606      * @tc.steps3: Simulate a SPACE key event and wrap it in a FocusEvent.
2607      */
2608     KeyEvent keyEvent;
2609     keyEvent.code = KeyCode::KEY_SPACE;
2610     keyEvent.action = KeyAction::DOWN;
2611     FocusEvent focusEvent(keyEvent);
2612 
2613      /**
2614      * @tc.steps4: Call OnFocusEvent when the node is not focused.
2615      * @tc.expected: The return value is false, indicating no handling.
2616      */
2617     EXPECT_FALSE(focusHub->OnFocusEvent(focusEvent));
2618 }
2619 
2620 /**
2621  * @tc.name: FocusHubOnClickOnlyFocusActiveTest001
2622  * @tc.desc: Test that onClick event only triggers when in FocusActive state.
2623  * @tc.type: FUNC
2624  */
2625 HWTEST_F(FocusHubTestNg, FocusHubOnClickOnlyFocusActiveTest001, TestSize.Level1)
2626 {
2627     /**
2628      * @tc.steps1: Create a column node and a button child node.
2629      */
2630     auto column = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2631     auto button1 = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1, AceType::MakeRefPtr<ButtonPattern>());
2632     auto eventHub1 = AceType::MakeRefPtr<EventHub>();
2633     eventHub1->AttachHost(button1);
2634     column->AddChild(button1);
2635 
2636     /**
2637      * @tc.steps2: Configure the button node with focus properties and onClick callback.
2638      */
2639     auto button1Hub = button1->GetOrCreateFocusHub();
2640     ASSERT_NE(button1Hub, nullptr);
2641     button1Hub->SetFocusType(FocusType::NODE);
2642     button1Hub->focusable_ = true;
2643     button1Hub->currentFocus_ = true;
2644     bool clicked = false;
__anon7f48b3121b02(GestureEvent&) 2645     button1Hub->SetOnClickCallback([&clicked](GestureEvent&) { clicked = true; });
2646 
2647     /**
2648      * @tc.steps3: Simulate a SPACE key down event.
2649      */
2650     KeyEvent keyEvent;
2651     keyEvent.action = KeyAction::DOWN;
2652     keyEvent.code = KeyCode::KEY_SPACE;
2653 
2654     /**
2655      * @tc.steps4: Set up focusManager and themeManager, disable focusHandleClick.
2656      */
2657     auto pipeline = PipelineContext::GetCurrentContext();
2658     ASSERT_NE(pipeline, nullptr);
2659     auto focusManager = pipeline->GetOrCreateFocusManager();
2660     EXPECT_NE(focusManager, nullptr);
2661     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
2662     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
2663     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr<AppTheme>()));
2664     auto appTheme = pipeline->GetTheme<AppTheme>();
2665     appTheme->focusHandleClick_ = false;
2666     EXPECT_FALSE(appTheme->NeedFocusHandleClick());
2667 
2668     /**
2669      * @tc.steps5: Set focus state to inactive, expect onClick not triggered.
2670      * @tc.expected: HandleKeyEvent returns false, clicked is false.
2671      */
2672     focusManager->SetIsFocusActive(false);
2673     EXPECT_FALSE(pipeline->GetIsFocusActive());
2674     clicked = false;
2675     EXPECT_FALSE(button1Hub->HandleKeyEvent(keyEvent, FocusIntension::SPACE));
2676     EXPECT_FALSE(clicked);
2677 
2678     /**
2679      * @tc.steps6: Set focus state to active, expect onClick triggered.
2680      * @tc.expected: HandleKeyEvent returns true, clicked is true.
2681      */
2682     focusManager->SetIsFocusActive(true);
2683     EXPECT_TRUE(pipeline->GetIsFocusActive());
2684     clicked = false;
2685     EXPECT_TRUE(button1Hub->HandleKeyEvent(keyEvent, FocusIntension::SPACE));
2686     EXPECT_TRUE(clicked);
2687 }
2688 
2689 /**
2690  * @tc.name: FocusHubFixRefocusTest001
2691  * @tc.desc: Test refocus logic and ensure Enter key triggers next focus with correct priority.
2692  * @tc.type: FUNC
2693  */
2694 HWTEST_F(FocusHubTestNg, FocusHubFixRefocusTest001, TestSize.Level1)
2695 {
2696     /**
2697      * @tc.steps1: Create a frame node and attach it to an EventHub and FocusHub.
2698      */
2699     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2700     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2701     eventHub->AttachHost(frameNode);
2702     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2703 
2704     /**
2705      * @tc.steps2: Set focusHub to SCOPE type, enable tab stop, set focusDepend_ to SELF, isSwitchByEnter_ to true.
2706      * @tc.expected: IsLeafFocusScope returns false, focusDepend_ updated to AUTO.
2707      */
2708     focusHub->SetFocusType(FocusType::SCOPE);
2709     focusHub->SetTabStop(true);
2710     focusHub->focusDepend_ = FocusDependence::SELF;
2711     focusHub->isSwitchByEnter_ = true;
2712     EXPECT_FALSE(focusHub->IsLeafFocusScope());
2713     EXPECT_EQ(focusHub->focusDepend_, FocusDependence::AUTO);
2714 
2715     /**
2716      * @tc.steps3: Add a focusable child node to the frame, and set focusHub as currently focused.
2717      */
2718     auto child = AceType::MakeRefPtr<FrameNodeOnTree>(V2::BUTTON_ETS_TAG, -1, AceType::MakeRefPtr<ButtonPattern>());
2719     child->GetOrCreateFocusHub();
2720     frameNode->AddChild(child);
2721     focusHub->currentFocus_ = true;
2722 
2723     /**
2724      * @tc.steps4: Request focus switch via Enter key.
2725      * @tc.expected: Child node gains focus successfully.
2726      */
2727     EXPECT_TRUE(focusHub->RequestNextFocusOfKeyEnter());
2728     EXPECT_TRUE(child->GetFocusHub()->IsCurrentFocus());
2729 
2730     /**
2731      * @tc.steps5: Call OnFocusScope again and verify no redundant focus callback is triggered.
2732      * @tc.expected: Focus callback count remains 0.
2733      */
2734     int32_t callbackCount = 0;
__anon7f48b3121c02() 2735     focusHub->SetOnFocusCallback([&callbackCount]() { callbackCount++; });
2736     focusHub->OnFocusScope(true);
2737     EXPECT_EQ(callbackCount, 0);
2738 }
2739 
2740 /**
2741  * @tc.name: FocusHubCalculateRect001
2742  * @tc.desc: Test that CalculateRect does not return false when childHub is not null.
2743  * @tc.type: FUNC
2744  */
2745 HWTEST_F(FocusHubTestNg, FocusHubCalculateRect001, TestSize.Level1)
2746 {
2747     /**
2748      * @tc.steps1: Create a FrameNode and attach it to EventHub.
2749      */
2750     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2751     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2752     eventHub->AttachHost(frameNode);
2753 
2754     /**
2755      * @tc.steps2: Create a parent FocusHub and a child FocusHub sharing the same EventHub.
2756      */
2757     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2758     RefPtr<FocusHub> childHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2759 
2760     /**
2761      * @tc.steps3: Call CalculateRect with a valid childHub.
2762      * @tc.expected: Function returns true, indicating rect calculation continues instead of returning false on check.
2763      */
2764     RectF rect;
2765     EXPECT_TRUE(focusHub->CalculateRect(childHub, rect));
2766 }
2767 
2768 /**
2769  * @tc.name: FocusHubPaintFocusStateWithMarginTest001
2770  * @tc.desc: Test that margin property in focusBox style takes effect when focus style is CUSTOM_REGION.
2771  * @tc.type: FUNC
2772  */
2773 HWTEST_F(FocusHubTestNg, FocusHubPaintFocusStateWithMarginTest001, TestSize.Level1)
2774 {
2775     /**
2776      * @tc.steps1: Create a FrameNode and bind it to EventHub and FocusHub.
2777      */
2778     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2779     auto eventHub = AceType::MakeRefPtr<EventHub>();
2780     eventHub->AttachHost(frameNode);
2781     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2782 
2783     /**
2784      * @tc.steps2: Set up pipeline context, theme manager, and get AppTheme.
2785      */
2786     auto pipeline = PipelineContext::GetCurrentContext();
2787     ASSERT_NE(pipeline, nullptr);
2788     auto focusManager = pipeline->GetOrCreateFocusManager();
2789     EXPECT_NE(focusManager, nullptr);
2790     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
2791     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
2792     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr<AppTheme>()));
2793     auto appTheme = pipeline->GetTheme<AppTheme>();
2794 
2795     /**
2796      * @tc.steps3: Set focus style to CUSTOM_REGION and assign boxStyle with margin.
2797      */
2798     focusHub->focusStyleType_ = FocusStyleType::CUSTOM_REGION;
2799     focusHub->currentFocus_ = true;
2800 
2801     FocusBoxStyle boxStyle;
2802     boxStyle.margin = Dimension(20.0_vp);
2803     boxStyle.strokeColor = Color::RED;
2804     boxStyle.strokeWidth = Dimension(5.0_vp);
2805     focusHub->box_.paintStyle_ = boxStyle;
2806 
2807     /**
2808      * @tc.steps4: Activate focus and call PaintInnerFocusState.
2809      * @tc.expected: Function returns true, indicating margin takes effect successfully.
2810      */
2811     focusManager->SetIsFocusActive(true);
2812     RoundRect rect;
2813     bool result = focusHub->PaintInnerFocusState(rect, true);
2814     EXPECT_TRUE(result);
2815 }
2816 
2817 /**
2818  * @tc.name: FocusHubClearFocusStateTest001
2819  * @tc.desc: Test that ClearFocusState properly triggers or skips callback depending on input flags.
2820  * @tc.type: FUNC
2821  */
2822 HWTEST_F(FocusHubTestNg, FocusHubClearFocusStateTest001, TestSize.Level1)
2823 {
2824     /**
2825      * @tc.steps1: Create a FrameNode and attach EventHub and FocusHub.
2826      */
2827     auto frameNode = AceType::MakeRefPtr<FrameNodeOnTree>(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr<Pattern>());
2828     RefPtr<EventHub> eventHub = AceType::MakeRefPtr<EventHub>();
2829     eventHub->AttachHost(frameNode);
2830     auto focusHub = AceType::MakeRefPtr<FocusHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
2831 
2832     /**
2833      * @tc.steps2: Register a focus clear callback to validate invocation.
2834      */
2835     bool callbackCalled = false;
__anon7f48b3121d02() 2836     focusHub->SetOnClearFocusStateInternal([&callbackCalled]() { callbackCalled = true; });
2837 
2838     /**
2839      * @tc.steps3: Test ClearFocusState(true, true), should trigger callback.
2840      * @tc.expected: callbackCalled is true.
2841      */
2842     callbackCalled = false;
2843     focusHub->ClearFocusState(true, true);
2844     EXPECT_TRUE(callbackCalled);
2845 
2846     /**
2847      * @tc.steps4: Test ClearFocusState(true, false), should skip callback.
2848      * @tc.expected: callbackCalled is false.
2849      */
2850     callbackCalled = false;
2851     focusHub->ClearFocusState(true, false);
2852     EXPECT_FALSE(callbackCalled);
2853 
2854     /**
2855      * @tc.steps5: Test ClearFocusState(false, true), should trigger callback.
2856      * @tc.expected: callbackCalled is true.
2857      */
2858     callbackCalled = false;
2859     focusHub->ClearFocusState(false, true);
2860     EXPECT_TRUE(callbackCalled);
2861 
2862     /**
2863      * @tc.steps6: Test ClearFocusState(false, false), should skip callback.
2864      * @tc.expected: callbackCalled is false.
2865      */
2866     callbackCalled = false;
2867     focusHub->ClearFocusState(false, false);
2868     EXPECT_FALSE(callbackCalled);
2869 }
2870 
2871 /**
2872  * @tc.name: FocusEventGetFocusIntensionTest001
2873  * @tc.desc: Test that various key combinations correctly map to FocusIntension values.
2874  * @tc.type: FUNC
2875  */
2876 HWTEST_F(FocusHubTestNg, FocusEventGetFocusIntensionTest001, TestSize.Level1)
2877 {
2878     /**
2879      * @tc.steps1: Prepare a key event with type KEY, action DOWN, not pre-IME.
2880      */
2881     KeyEvent keyEvent;
2882     keyEvent.eventType = UIInputEventType::KEY;
2883     keyEvent.action = KeyAction::DOWN;
2884     keyEvent.isPreIme = false;
2885     NonPointerEvent& event = keyEvent;
2886 
2887     /**
2888      * @tc.steps2: Test plain UP key without modifiers.
2889      * @tc.expected: FocusIntension::UP
2890      */
2891     keyEvent.code = KeyCode::KEY_DPAD_UP;
2892     keyEvent.pressedCodes.clear();
2893     EXPECT_EQ(FocusEvent::GetFocusIntension(event), FocusIntension::UP);
2894 
2895     /**
2896      * @tc.steps3: Test UP key with Shift modifier.
2897      * @tc.expected: FocusIntension::UP
2898      */
2899     keyEvent.code = KeyCode::KEY_DPAD_UP;
2900     keyEvent.pressedCodes = { KeyCode::KEY_SHIFT_LEFT };
2901     EXPECT_EQ(FocusEvent::GetFocusIntension(event), FocusIntension::UP);
2902 
2903     /**
2904      * @tc.steps4: Test DOWN key with Shift modifier.
2905      * @tc.expected: FocusIntension::DOWN
2906      */
2907     keyEvent.code = KeyCode::KEY_DPAD_DOWN;
2908     keyEvent.pressedCodes = { KeyCode::KEY_SHIFT_LEFT };
2909     EXPECT_EQ(FocusEvent::GetFocusIntension(event), FocusIntension::DOWN);
2910 
2911     /**
2912      * @tc.steps5: Test LEFT key with Shift modifier.
2913      * @tc.expected: FocusIntension::LEFT
2914      */
2915     keyEvent.code = KeyCode::KEY_DPAD_LEFT;
2916     keyEvent.pressedCodes = { KeyCode::KEY_SHIFT_LEFT };
2917     EXPECT_EQ(FocusEvent::GetFocusIntension(event), FocusIntension::LEFT);
2918 
2919     /**
2920      * @tc.steps6: Test RIGHT key with Shift modifier.
2921      * @tc.expected: FocusIntension::RIGHT
2922      */
2923     keyEvent.code = KeyCode::KEY_DPAD_RIGHT;
2924     keyEvent.pressedCodes = { KeyCode::KEY_SHIFT_LEFT };
2925     EXPECT_EQ(FocusEvent::GetFocusIntension(event), FocusIntension::RIGHT);
2926 
2927     /**
2928      * @tc.steps7: Test Shift + Tab key combination.
2929      * @tc.expected: FocusIntension::SHIFT_TAB
2930      */
2931     keyEvent.code = KeyCode::KEY_TAB;
2932     keyEvent.pressedCodes = { KeyCode::KEY_SHIFT_LEFT, KeyCode::KEY_TAB };
2933     EXPECT_EQ(FocusEvent::GetFocusIntension(keyEvent), FocusIntension::SHIFT_TAB);
2934 }
2935 
2936 /**
2937  * @tc.name: LostFocusToTabstopTest001
2938  * @tc.desc: Test LostFocusToTabstop.
2939  * @tc.type: FUNC
2940  */
2941 HWTEST_F(FocusHubTestNg, LostFocusToTabstopTest001, TestSize.Level1)
2942 {
2943     /**
2944      * @tc.steps1: CreateTree.
2945      */
2946     auto context = MockPipelineContext::GetCurrent();
2947     auto focusManager = context->GetOrCreateFocusManager();
2948     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
2949     auto pageNode = FrameNode::CreateFrameNode(V2::PAGE_ETS_TAG, 1, pagePattern);
2950     pageNode->onMainTree_ = true;
2951     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
2952     context->rootNode_->AddChild(pageNode);
2953     auto column = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, 2, AceType::MakeRefPtr<LinearLayoutPattern>(true));
2954     auto column2 = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, 2, AceType::MakeRefPtr<LinearLayoutPattern>(true));
2955     auto column3 = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, 2, AceType::MakeRefPtr<LinearLayoutPattern>(true));
2956     column->onMainTree_ = true;
2957     column2->onMainTree_ = true;
2958     column3->onMainTree_ = true;
2959     auto columnFocusHub = column->GetOrCreateFocusHub();
2960     auto columnFocusHub2 = column2->GetOrCreateFocusHub();
2961     auto columnFocusHub3 = column3->GetOrCreateFocusHub();
2962     auto buttonNode = FrameNode::CreateFrameNode(V2::BUTTON_ETS_TAG, 3, AceType::MakeRefPtr<ButtonPattern>());
2963     buttonNode->onMainTree_ = true;
2964     auto buttonFocusHub = buttonNode->GetOrCreateFocusHub();
2965     pageNode->AddChild(column);
2966     column->AddChild(column2);
2967     column2->AddChild(column3);
2968     column3->AddChild(buttonNode);
2969     pagePattern->FocusViewShow();
2970     context->FlushFocusView();
2971     pagePattern->TriggerFocusMove();
2972     EXPECT_EQ(buttonFocusHub->IsCurrentFocus(), true);
2973 
2974     /**
2975      * @tc.steps2: SetTabStop and test RequestNextFocusOfKeyEsc.
2976      */
2977     columnFocusHub->SetTabStop(true);
2978     columnFocusHub2->SetTabStop(true);
2979     buttonFocusHub->RequestNextFocusOfKeyEsc();
2980     EXPECT_EQ(columnFocusHub2->IsCurrentFocus(), true);
2981     EXPECT_EQ(buttonFocusHub->IsCurrentFocus(), false);
2982     EXPECT_EQ(columnFocusHub3->IsCurrentFocus(), false);
2983     columnFocusHub2->RequestNextFocusOfKeyEsc();
2984     EXPECT_EQ(columnFocusHub->IsCurrentFocus(), true);
2985     EXPECT_EQ(columnFocusHub2->IsCurrentFocus(), false);
2986     columnFocusHub3->RequestNextFocusOfKeyEsc();
2987     EXPECT_EQ(columnFocusHub->IsCurrentFocus(), true);
2988 }
2989 } // namespace OHOS::Ace::NG
2990