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