1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <optional>
17 
18 #include "gtest/gtest.h"
19 #define private public
20 #define protected public
21 
22 #include "test/mock/core/common/mock_container.h"
23 #include "test/mock/core/pipeline/mock_pipeline_context.h"
24 
25 #include "core/components_ng/animation/geometry_transition.h"
26 #include "core/components_ng/base/ui_node.h"
27 #include "core/components_ng/manager/focus/focus_view.h"
28 #include "core/components_ng/pattern/bubble/bubble_pattern.h"
29 #include "core/components_ng/pattern/button/button_pattern.h"
30 #include "core/components_ng/pattern/dialog/dialog_pattern.h"
31 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
32 #include "core/components_ng/pattern/menu/menu_pattern.h"
33 #include "core/components_ng/pattern/navigation/nav_bar_pattern.h"
34 #include "core/components_ng/pattern/navigation/navigation_pattern.h"
35 #include "core/components_ng/pattern/navrouter/navdestination_pattern.h"
36 #include "core/components_ng/pattern/overlay/modal_presentation_pattern.h"
37 #include "core/components_ng/pattern/overlay/sheet_presentation_pattern.h"
38 #include "core/components_ng/pattern/root/root_pattern.h"
39 #include "core/components_ng/pattern/stage/page_pattern.h"
40 #include "core/components_v2/inspector/inspector_constants.h"
41 #include "test/unittest/core/event/frame_node_on_tree.h"
42 
43 using namespace testing;
44 using namespace testing::ext;
45 namespace OHOS::Ace::NG {
46 
47 class FocusViewTestNg : public testing::Test {
48 public:
49     static void SetUpTestCase();
50     static void TearDownTestCase();
51 };
52 
SetUpTestCase()53 void FocusViewTestNg::SetUpTestCase()
54 {
55     MockPipelineContext::SetUp();
56     MockContainer::SetUp();
57 }
58 
TearDownTestCase()59 void FocusViewTestNg::TearDownTestCase()
60 {
61     MockPipelineContext::TearDown();
62     MockContainer::TearDown();
63 }
64 
65 /**
66  * @tc.name: FocusViewTest001
67  * @tc.desc: FocusViewShow / FocusViewClose / GetCurrentFocusView() / GetEntryFocusView()
68  * @tc.type: FUNC
69  * @tc.author: catpoison
70  */
71 HWTEST_F(FocusViewTestNg, FocusViewTest001, TestSize.Level1)
72 {
73     /**
74      * @tc.steps: step1. construct all kinds of FocusView.
75      */
76     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
77     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
78 
79     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
80     auto pageNode = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern);
81     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
82     rootNode->AddChild(pageNode);
83 
84     auto bubblePattern = AceType::MakeRefPtr<BubblePattern>();
85     auto bubbleNode = FrameNodeOnTree::CreateFrameNode(V2::POPUP_ETS_TAG, -1, bubblePattern);
86     auto bubbleFocusHub = bubbleNode->GetOrCreateFocusHub();
87     rootNode->AddChild(bubbleNode);
88 
89     auto dialogPattern = AceType::MakeRefPtr<DialogPattern>(nullptr, nullptr);
90     auto dialogNode = FrameNodeOnTree::CreateFrameNode(V2::DIALOG_ETS_TAG, -1, dialogPattern);
91     auto dialogFocusHub = dialogNode->GetOrCreateFocusHub();
92     rootNode->AddChild(dialogNode);
93 
94     auto menuPattern = AceType::MakeRefPtr<MenuPattern>(-1, "Menu", MenuType::MENU);
95     auto menuNode = FrameNodeOnTree::CreateFrameNode(V2::MENU_ETS_TAG, -1, menuPattern);
96     auto menuFocusHub = menuNode->GetOrCreateFocusHub();
97     rootNode->AddChild(menuNode);
98 
99     auto modalPattern = AceType::MakeRefPtr<ModalPresentationPattern>(-1, ModalTransition::DEFAULT, nullptr);
100     auto modalNode = FrameNodeOnTree::CreateFrameNode(V2::MODAL_PAGE_TAG, -1, modalPattern);
101     auto modalFocusHub = modalNode->GetOrCreateFocusHub();
102     rootNode->AddChild(modalNode);
103 
104     auto sheetPattern = AceType::MakeRefPtr<SheetPresentationPattern>(-1, "", nullptr);
105     auto sheetNode = FrameNodeOnTree::CreateFrameNode(V2::SHEET_PAGE_TAG, -1, sheetPattern);
106     auto sheetFocusHub = sheetNode->GetOrCreateFocusHub();
107     rootNode->AddChild(sheetNode);
108 
109     auto navigationPattern = AceType::MakeRefPtr<NavigationPattern>();
110     auto navigationNode = FrameNodeOnTree::CreateFrameNode(V2::NAVIGATION_VIEW_ETS_TAG, -1, navigationPattern);
111     auto navigationFocusHub = navigationNode->GetOrCreateFocusHub();
112 
113     auto navbarPattern = AceType::MakeRefPtr<NavBarPattern>();
114     auto navbarNode = FrameNodeOnTree::CreateFrameNode(V2::NAVBAR_ETS_TAG, -1, navbarPattern);
115     auto navbarFocusHub = navbarNode->GetOrCreateFocusHub();
116 
117     auto navdestinationPattern = AceType::MakeRefPtr<NavDestinationPattern>(nullptr);
118     auto navdestinationNode = FrameNodeOnTree::CreateFrameNode(V2::POPUP_ETS_TAG, -1, navdestinationPattern);
119     auto navdestinationFocusHub = navdestinationNode->GetOrCreateFocusHub();
120 
121     pageNode->AddChild(navigationNode);
122     navigationNode->AddChild(navbarNode);
123     navigationNode->AddChild(navdestinationNode);
124 
125     /**
126      * @tc.steps: step2. GetCurrentFocusView expect equal with the view showed.
127      */
128     pagePattern->FocusViewShow();
129     EXPECT_EQ(FocusView::GetCurrentFocusView(), pagePattern);
130     EXPECT_EQ(pagePattern->GetEntryFocusView(), pagePattern);
131 
132     bubblePattern->FocusViewShow();
133     EXPECT_EQ(FocusView::GetCurrentFocusView(), bubblePattern);
134     EXPECT_EQ(bubblePattern->GetEntryFocusView(), bubblePattern);
135 
136     dialogPattern->FocusViewShow();
137     EXPECT_EQ(FocusView::GetCurrentFocusView(), dialogPattern);
138     EXPECT_EQ(dialogPattern->GetEntryFocusView(), dialogPattern);
139 
140     menuPattern->FocusViewShow();
141     EXPECT_EQ(FocusView::GetCurrentFocusView(), menuPattern);
142     EXPECT_EQ(menuPattern->GetEntryFocusView(), menuPattern);
143 
144     modalPattern->FocusViewShow();
145     EXPECT_EQ(FocusView::GetCurrentFocusView(), modalPattern);
146     EXPECT_EQ(modalPattern->GetEntryFocusView(), modalPattern);
147 
148     sheetPattern->FocusViewShow();
149     EXPECT_EQ(FocusView::GetCurrentFocusView(), sheetPattern);
150     EXPECT_EQ(sheetPattern->GetEntryFocusView(), sheetPattern);
151 
152     navbarPattern->FocusViewShow();
153     EXPECT_EQ(FocusView::GetCurrentFocusView(), navbarPattern);
154     EXPECT_EQ(navbarPattern->GetEntryFocusView(), pagePattern);
155 
156     navdestinationPattern->FocusViewShow();
157     EXPECT_EQ(FocusView::GetCurrentFocusView(), navdestinationPattern);
158     EXPECT_EQ(navdestinationPattern->GetEntryFocusView(), pagePattern);
159 
160     /**
161      * @tc.steps: step2. GetCurrentFocusView expect equal with the last view after FocusViewClose.
162      */
163     navdestinationPattern->FocusViewClose();
164     EXPECT_EQ(FocusView::GetCurrentFocusView(), navbarPattern);
165     EXPECT_EQ(navbarPattern->GetEntryFocusView(), pagePattern);
166 
167     navbarPattern->FocusViewClose();
168     EXPECT_EQ(FocusView::GetCurrentFocusView(), sheetPattern);
169     EXPECT_EQ(sheetPattern->GetEntryFocusView(), sheetPattern);
170 
171     sheetPattern->FocusViewClose();
172     EXPECT_EQ(FocusView::GetCurrentFocusView(), modalPattern);
173     EXPECT_EQ(modalPattern->GetEntryFocusView(), modalPattern);
174 
175     modalPattern->FocusViewClose();
176     EXPECT_EQ(FocusView::GetCurrentFocusView(), menuPattern);
177     EXPECT_EQ(menuPattern->GetEntryFocusView(), menuPattern);
178 
179     menuPattern->FocusViewClose();
180     EXPECT_EQ(FocusView::GetCurrentFocusView(), dialogPattern);
181     EXPECT_EQ(dialogPattern->GetEntryFocusView(), dialogPattern);
182 
183     dialogPattern->FocusViewClose();
184     EXPECT_EQ(FocusView::GetCurrentFocusView(), bubblePattern);
185     EXPECT_EQ(bubblePattern->GetEntryFocusView(), bubblePattern);
186 
187     bubblePattern->FocusViewClose();
188     EXPECT_EQ(FocusView::GetCurrentFocusView(), pagePattern);
189     EXPECT_EQ(pagePattern->GetEntryFocusView(), pagePattern);
190 
191     pagePattern->FocusViewClose();
192     EXPECT_EQ(FocusView::GetCurrentFocusView(), nullptr);
193 }
194 
195 /**
196  * @tc.name: FocusViewTest002
197  * @tc.desc: Page first call FocusViewShow without defaultFocus
198  * @tc.type: FUNC
199  * @tc.author: catpoison
200  */
201 HWTEST_F(FocusViewTestNg, FocusViewTest002, TestSize.Level1)
202 {
203     /**
204      * @tc.steps: step1. construct components.
205      * - Page
206      *   - Column
207      *     - Button
208      *     - Button
209      */
210     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
211     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
212 
213     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
214     auto pageNode = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern);
215     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
216     rootNode->AddChild(pageNode);
217 
218     auto columnPattern = AceType::MakeRefPtr<LinearLayoutPattern>(true);
219     auto columnNode = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern);
220     auto columnFocusHub = columnNode->GetOrCreateFocusHub();
221 
222     auto buttonPattern1 = AceType::MakeRefPtr<ButtonPattern>();
223     auto buttonNode1 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern1);
224     auto buttonFocusHub1 = buttonNode1->GetOrCreateFocusHub();
225 
226     auto buttonPattern2 = AceType::MakeRefPtr<ButtonPattern>();
227     auto buttonNode2 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern2);
228     auto buttonFocusHub2 = buttonNode2->GetOrCreateFocusHub();
229 
230     pageNode->AddChild(columnNode);
231     columnNode->AddChild(buttonNode1);
232     columnNode->AddChild(buttonNode2);
233 
234     /**
235      * @tc.steps: step2. Get pagePattern's ViewRootScope
236      * expected: columnFocusHub
237      */
238     EXPECT_EQ(pagePattern->GetViewRootScope(), columnFocusHub);
239 
240     /**
241      * @tc.steps: step3. Page execute FocusViewShow()
242      * expected: pagePattern->isViewHasFocused_ is false.
243      */
244     pagePattern->FocusViewShow();
245     EXPECT_FALSE(pagePattern->isViewHasFocused_);
246 
247     /**
248      * @tc.steps: step4. FlushFocusView()
249      * expected: Page / Column get focused.
250      */
251     PipelineContext::GetCurrentContext()->FlushFocusView();
252     EXPECT_TRUE(pagePattern->isViewHasFocused_);
253     EXPECT_TRUE(pagePattern->isViewRootScopeFocused_);
254     EXPECT_TRUE(pagePattern->neverShown_);
255     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
256     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
257     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
258     EXPECT_FALSE(buttonFocusHub1->IsCurrentFocus());
259     EXPECT_FALSE(buttonFocusHub2->IsCurrentFocus());
260 }
261 
262 /**
263  * @tc.name: FocusViewTest003
264  * @tc.desc: Page first call FocusViewShow with defaultFocus
265  * @tc.type: FUNC
266  * @tc.author: catpoison
267  */
268 HWTEST_F(FocusViewTestNg, FocusViewTest003, TestSize.Level1)
269 {
270     /**
271      * @tc.steps: step1. construct components.
272      * - Page
273      *   - Column
274      *     - Button
275      *     - Button
276      */
277     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
278     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
279 
280     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
281     auto pageNode = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern);
282     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
283     rootNode->AddChild(pageNode);
284 
285     auto columnPattern = AceType::MakeRefPtr<LinearLayoutPattern>(true);
286     auto columnNode = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern);
287     auto columnFocusHub = columnNode->GetOrCreateFocusHub();
288 
289     auto buttonPattern1 = AceType::MakeRefPtr<ButtonPattern>();
290     auto buttonNode1 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern1);
291     auto buttonFocusHub1 = buttonNode1->GetOrCreateFocusHub();
292 
293     auto buttonPattern2 = AceType::MakeRefPtr<ButtonPattern>();
294     auto buttonNode2 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern2);
295     auto buttonFocusHub2 = buttonNode2->GetOrCreateFocusHub();
296     buttonFocusHub2->SetIsDefaultFocus(true);
297 
298     pageNode->AddChild(columnNode);
299     columnNode->AddChild(buttonNode1);
300     columnNode->AddChild(buttonNode2);
301 
302     /**
303      * @tc.steps: step2. Get pagePattern's ViewRootScope
304      * expected: columnFocusHub
305      */
306     EXPECT_EQ(pagePattern->GetViewRootScope(), columnFocusHub);
307 
308     /**
309      * @tc.steps: step3. Page execute FocusViewShow()
310      * expected: pagePattern->isViewHasFocused_ is false.
311      */
312     pagePattern->FocusViewShow();
313     EXPECT_FALSE(pagePattern->isViewHasFocused_);
314 
315     /**
316      * @tc.steps: step4. FlushFocusView()
317      * expected: Page / Column / Button2(defaultFocus) get focused.
318      */
319     PipelineContext::GetCurrentContext()->FlushFocusView();
320     EXPECT_TRUE(pagePattern->isViewHasFocused_);
321     EXPECT_FALSE(pagePattern->isViewRootScopeFocused_);
322     EXPECT_FALSE(pagePattern->neverShown_);
323     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
324     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
325     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
326     EXPECT_FALSE(buttonFocusHub1->IsCurrentFocus());
327     EXPECT_TRUE(buttonFocusHub2->IsCurrentFocus());
328 }
329 
330 /**
331  * @tc.name: FocusViewTest004
332  * @tc.desc: Page call FocusViewShow with SetIsViewRootScopeFocused(false)
333  * @tc.type: FUNC
334  * @tc.author: catpoison
335  */
336 HWTEST_F(FocusViewTestNg, FocusViewTest004, TestSize.Level1)
337 {
338     /**
339      * @tc.steps: step1. construct components.
340      * - Page
341      *   - Column
342      *     - Button
343      *     - Button
344      */
345     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
346     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
347 
348     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
349     auto pageNode = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern);
350     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
351     rootNode->AddChild(pageNode);
352 
353     auto columnPattern = AceType::MakeRefPtr<LinearLayoutPattern>(true);
354     auto columnNode = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern);
355     auto columnFocusHub = columnNode->GetOrCreateFocusHub();
356 
357     auto buttonPattern1 = AceType::MakeRefPtr<ButtonPattern>();
358     auto buttonNode1 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern1);
359     auto buttonFocusHub1 = buttonNode1->GetOrCreateFocusHub();
360 
361     auto buttonPattern2 = AceType::MakeRefPtr<ButtonPattern>();
362     auto buttonNode2 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern2);
363     auto buttonFocusHub2 = buttonNode2->GetOrCreateFocusHub();
364 
365     pageNode->AddChild(columnNode);
366     columnNode->AddChild(buttonNode1);
367     columnNode->AddChild(buttonNode2);
368 
369     /**
370      * @tc.steps: step2. Get pagePattern's ViewRootScope
371      * expected: columnFocusHub
372      */
373     EXPECT_EQ(pagePattern->GetViewRootScope(), columnFocusHub);
374 
375     /**
376      * @tc.steps: step3. Page execute FocusViewShow()
377      * expected: pagePattern->isViewHasFocused_ is false.
378      */
379     pagePattern->SetIsViewRootScopeFocused(false);
380     pagePattern->FocusViewShow();
381     EXPECT_FALSE(pagePattern->isViewHasFocused_);
382 
383     /**
384      * @tc.steps: step4. FlushFocusView()
385      * expected: Page / Column / Button1 get focused.
386      */
387     PipelineContext::GetCurrentContext()->FlushFocusView();
388     EXPECT_TRUE(pagePattern->isViewHasFocused_);
389     EXPECT_FALSE(pagePattern->isViewRootScopeFocused_);
390     EXPECT_TRUE(pagePattern->neverShown_);
391     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
392     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
393     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
394     EXPECT_TRUE(buttonFocusHub1->IsCurrentFocus());
395     EXPECT_FALSE(buttonFocusHub2->IsCurrentFocus());
396 }
397 
398 /**
399  * @tc.name: FocusViewTest005
400  * @tc.desc: Page1 FocusViewShow / Page2 FocusViewShow
401  * @tc.type: FUNC
402  * @tc.author: catpoison
403  */
404 HWTEST_F(FocusViewTestNg, FocusViewTest005, TestSize.Level1)
405 {
406     /**
407      * @tc.steps: step1. construct components.
408      * - Page1
409      *   - Column1
410      *     - Button11
411      *     - Button12
412      * - Page2
413      *   - Column2
414      *     - Button21
415      *     - Button22
416      */
417     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
418     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
419 
420     auto pagePattern1 = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
421     auto pageNode1 = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern1);
422     auto pageFocusHub1 = pageNode1->GetOrCreateFocusHub();
423     rootNode->AddChild(pageNode1);
424 
425     auto columnPattern1 = AceType::MakeRefPtr<LinearLayoutPattern>(true);
426     auto columnNode1 = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern1);
427     auto columnFocusHub1 = columnNode1->GetOrCreateFocusHub();
428 
429     auto buttonPattern11 = AceType::MakeRefPtr<ButtonPattern>();
430     auto buttonNode11 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern11);
431     auto buttonFocusHub11 = buttonNode11->GetOrCreateFocusHub();
432 
433     auto buttonPattern12 = AceType::MakeRefPtr<ButtonPattern>();
434     auto buttonNode12 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern12);
435     auto buttonFocusHub12 = buttonNode12->GetOrCreateFocusHub();
436 
437     pageNode1->AddChild(columnNode1);
438     columnNode1->AddChild(buttonNode11);
439     columnNode1->AddChild(buttonNode12);
440 
441     auto pagePattern2 = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
442     auto pageNode2 = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern2);
443     auto pageFocusHub2 = pageNode2->GetOrCreateFocusHub();
444     rootNode->AddChild(pageNode2);
445 
446     auto columnPattern2 = AceType::MakeRefPtr<LinearLayoutPattern>(true);
447     auto columnNode2 = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern2);
448     auto columnFocusHub2 = columnNode2->GetOrCreateFocusHub();
449 
450     auto buttonPattern21 = AceType::MakeRefPtr<ButtonPattern>();
451     auto buttonNode21 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern21);
452     auto buttonFocusHub21 = buttonNode21->GetOrCreateFocusHub();
453 
454     auto buttonPattern22 = AceType::MakeRefPtr<ButtonPattern>();
455     auto buttonNode22 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern22);
456     auto buttonFocusHub22 = buttonNode22->GetOrCreateFocusHub();
457 
458     pageNode2->AddChild(columnNode2);
459     columnNode2->AddChild(buttonNode21);
460     columnNode2->AddChild(buttonNode22);
461 
462     /**
463      * @tc.steps: step2. Get pagePattern's ViewRootScope
464      * expected: pagePattern1 -> columnFocusHub1 / pagePattern2 -> columnFocusHub2
465      */
466     EXPECT_EQ(pagePattern1->GetViewRootScope(), columnFocusHub1);
467     EXPECT_EQ(pagePattern2->GetViewRootScope(), columnFocusHub2);
468 
469     /**
470      * @tc.steps: step3. Page execute FocusViewShow()
471      * expected: pagePattern1->isViewHasFocused_ is false.
472      */
473     pagePattern1->FocusViewShow();
474     EXPECT_FALSE(pagePattern1->isViewHasFocused_);
475 
476     /**
477      * @tc.steps: step4. FlushFocusView()
478      * expected:
479      * - Page1 *
480      *   - Column1 *
481      *     - Button11
482      *     - Button12
483      * - Page2
484      *   - Column2
485      *     - Button21
486      *     - Button22
487      */
488     PipelineContext::GetCurrentContext()->FlushFocusView();
489     EXPECT_TRUE(pagePattern1->isViewHasFocused_);
490     EXPECT_TRUE(pagePattern1->isViewRootScopeFocused_);
491     EXPECT_TRUE(pagePattern1->neverShown_);
492     EXPECT_TRUE(pageFocusHub1->IsCurrentFocus());
493     EXPECT_TRUE(pagePattern1->IsRootScopeCurrentFocus());
494     EXPECT_TRUE(columnFocusHub1->IsCurrentFocus());
495     EXPECT_FALSE(buttonFocusHub11->IsCurrentFocus());
496     EXPECT_FALSE(buttonFocusHub12->IsCurrentFocus());
497 
498     EXPECT_FALSE(pagePattern2->isViewHasFocused_);
499     EXPECT_TRUE(pagePattern2->isViewRootScopeFocused_);
500     EXPECT_TRUE(pagePattern2->neverShown_);
501     EXPECT_FALSE(pageFocusHub2->IsCurrentFocus());
502     EXPECT_FALSE(pagePattern2->IsRootScopeCurrentFocus());
503     EXPECT_FALSE(columnFocusHub2->IsCurrentFocus());
504     EXPECT_FALSE(buttonFocusHub21->IsCurrentFocus());
505     EXPECT_FALSE(buttonFocusHub22->IsCurrentFocus());
506 
507     /**
508      * @tc.steps: step5. Page execute FocusViewShow()
509      * expected: pagePattern2->isViewHasFocused_ is false.
510      */
511     pagePattern2->FocusViewShow();
512     EXPECT_FALSE(pagePattern2->isViewHasFocused_);
513 
514     /**
515      * @tc.steps: step6. FlushFocusView()
516      * expected:
517      * - Page1
518      *   - Column1
519      *     - Button11
520      *     - Button12
521      * - Page2 *
522      *   - Column2 *
523      *     - Button21
524      *     - Button22
525      */
526     PipelineContext::GetCurrentContext()->FlushFocusView();
527     EXPECT_TRUE(pagePattern1->isViewHasFocused_);
528     EXPECT_TRUE(pagePattern1->isViewRootScopeFocused_);
529     EXPECT_TRUE(pagePattern1->neverShown_);
530     EXPECT_FALSE(pageFocusHub1->IsCurrentFocus());
531     EXPECT_FALSE(pagePattern1->IsRootScopeCurrentFocus());
532     EXPECT_FALSE(columnFocusHub1->IsCurrentFocus());
533     EXPECT_FALSE(buttonFocusHub11->IsCurrentFocus());
534     EXPECT_FALSE(buttonFocusHub12->IsCurrentFocus());
535 
536     EXPECT_TRUE(pagePattern2->isViewHasFocused_);
537     EXPECT_TRUE(pagePattern2->isViewRootScopeFocused_);
538     EXPECT_TRUE(pagePattern2->neverShown_);
539     EXPECT_TRUE(pageFocusHub2->IsCurrentFocus());
540     EXPECT_TRUE(pagePattern2->IsRootScopeCurrentFocus());
541     EXPECT_TRUE(columnFocusHub2->IsCurrentFocus());
542     EXPECT_FALSE(buttonFocusHub21->IsCurrentFocus());
543     EXPECT_FALSE(buttonFocusHub22->IsCurrentFocus());
544 
545     /**
546      * @tc.steps: step7. Page2 execute FocusViewClose()
547      * expected: pagePattern1->isViewHasFocused_ is false.
548      */
549     pagePattern2->FocusViewClose();
550 
551     /**
552      * @tc.steps: step8. FlushFocusView()
553      * expected:
554      * - Page1 *
555      *   - Column1 *
556      *     - Button11
557      *     - Button12
558      * - Page2
559      *   - Column2
560      *     - Button21
561      *     - Button22
562      */
563     PipelineContext::GetCurrentContext()->FlushFocusView();
564     EXPECT_TRUE(pagePattern1->isViewHasFocused_);
565     EXPECT_TRUE(pagePattern1->isViewRootScopeFocused_);
566     EXPECT_TRUE(pagePattern1->neverShown_);
567     EXPECT_TRUE(pageFocusHub1->IsCurrentFocus());
568     EXPECT_TRUE(pagePattern1->IsRootScopeCurrentFocus());
569     EXPECT_TRUE(columnFocusHub1->IsCurrentFocus());
570     EXPECT_FALSE(buttonFocusHub11->IsCurrentFocus());
571     EXPECT_FALSE(buttonFocusHub12->IsCurrentFocus());
572 
573     EXPECT_TRUE(pagePattern2->isViewHasFocused_);
574     EXPECT_TRUE(pagePattern2->isViewRootScopeFocused_);
575     EXPECT_TRUE(pagePattern2->neverShown_);
576     EXPECT_FALSE(pageFocusHub2->IsCurrentFocus());
577     EXPECT_FALSE(pagePattern2->IsRootScopeCurrentFocus());
578     EXPECT_FALSE(columnFocusHub2->IsCurrentFocus());
579     EXPECT_FALSE(buttonFocusHub21->IsCurrentFocus());
580     EXPECT_FALSE(buttonFocusHub22->IsCurrentFocus());
581 }
582 
583 /**
584  * @tc.name: FocusViewTest006
585  * @tc.desc: TriggerFocusMove without tabIndex
586  * @tc.type: FUNC
587  * @tc.author: catpoison
588  */
589 HWTEST_F(FocusViewTestNg, FocusViewTest006, TestSize.Level1)
590 {
591     /**
592      * @tc.steps: step1. construct components.
593      * - Page
594      *   - Column
595      *     - Button
596      *     - Button
597      */
598     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
599     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
600 
601     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
602     auto pageNode = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern);
603     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
604     rootNode->AddChild(pageNode);
605 
606     auto columnPattern = AceType::MakeRefPtr<LinearLayoutPattern>(true);
607     auto columnNode = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern);
608     auto columnFocusHub = columnNode->GetOrCreateFocusHub();
609 
610     auto buttonPattern1 = AceType::MakeRefPtr<ButtonPattern>();
611     auto buttonNode1 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern1);
612     auto buttonFocusHub1 = buttonNode1->GetOrCreateFocusHub();
613 
614     auto buttonPattern2 = AceType::MakeRefPtr<ButtonPattern>();
615     auto buttonNode2 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern2);
616     auto buttonFocusHub2 = buttonNode2->GetOrCreateFocusHub();
617 
618     pageNode->AddChild(columnNode);
619     columnNode->AddChild(buttonNode1);
620     columnNode->AddChild(buttonNode2);
621 
622     /**
623      * @tc.steps: step2. Get pagePattern's ViewRootScope
624      * expected: columnFocusHub
625      */
626     EXPECT_EQ(pagePattern->GetViewRootScope(), columnFocusHub);
627 
628     /**
629      * @tc.steps: step3. Page execute FocusViewShow()
630      * expected: pagePattern->isViewHasFocused_ is false.
631      */
632     pagePattern->FocusViewShow();
633     EXPECT_FALSE(pagePattern->isViewHasFocused_);
634 
635     /**
636      * @tc.steps: step4. FlushFocusView()
637      * expected: Page / Column get focused.
638      */
639     PipelineContext::GetCurrentContext()->FlushFocusView();
640     EXPECT_TRUE(pagePattern->isViewHasFocused_);
641     EXPECT_TRUE(pagePattern->isViewRootScopeFocused_);
642     EXPECT_TRUE(pagePattern->neverShown_);
643     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
644     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
645     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
646     EXPECT_FALSE(buttonFocusHub1->IsCurrentFocus());
647     EXPECT_FALSE(buttonFocusHub2->IsCurrentFocus());
648 
649     /**
650      * @tc.steps: step5. TriggerFocusMove()
651      * expected: Page / Column / Button1 get focused.
652      */
653     pagePattern->TriggerFocusMove();
654     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
655     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
656     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
657     EXPECT_TRUE(buttonFocusHub1->IsCurrentFocus());
658     EXPECT_FALSE(buttonFocusHub2->IsCurrentFocus());
659 }
660 
661 /**
662  * @tc.name: FocusViewTest007
663  * @tc.desc: TriggerFocusMove with tabIndex
664  * @tc.type: FUNC
665  * @tc.author: catpoison
666  */
667 HWTEST_F(FocusViewTestNg, FocusViewTest007, TestSize.Level1)
668 {
669     /**
670      * @tc.steps: step1. construct components.
671      * - Page
672      *   - Column
673      *     - Button
674      *     - Button
675      */
676     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
677     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
678 
679     auto pagePattern = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
680     auto pageNode = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern);
681     auto pageFocusHub = pageNode->GetOrCreateFocusHub();
682     rootNode->AddChild(pageNode);
683 
684     auto columnPattern = AceType::MakeRefPtr<LinearLayoutPattern>(true);
685     auto columnNode = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern);
686     auto columnFocusHub = columnNode->GetOrCreateFocusHub();
687 
688     auto buttonPattern1 = AceType::MakeRefPtr<ButtonPattern>();
689     auto buttonNode1 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern1);
690     auto buttonFocusHub1 = buttonNode1->GetOrCreateFocusHub();
691 
692     auto buttonPattern2 = AceType::MakeRefPtr<ButtonPattern>();
693     auto buttonNode2 = FrameNodeOnTree::CreateFrameNode(V2::BUTTON_ETS_TAG, -1, buttonPattern2);
694     auto buttonFocusHub2 = buttonNode2->GetOrCreateFocusHub();
695     buttonFocusHub2->SetTabIndex(1);
696 
697     pageNode->AddChild(columnNode);
698     columnNode->AddChild(buttonNode1);
699     columnNode->AddChild(buttonNode2);
700 
701     /**
702      * @tc.steps: step2. Get pagePattern's ViewRootScope
703      * expected: columnFocusHub
704      */
705     EXPECT_EQ(pagePattern->GetViewRootScope(), columnFocusHub);
706 
707     /**
708      * @tc.steps: step3. Page execute FocusViewShow()
709      * expected: pagePattern->isViewHasFocused_ is false.
710      */
711     pagePattern->FocusViewShow();
712     EXPECT_FALSE(pagePattern->isViewHasFocused_);
713 
714     /**
715      * @tc.steps: step4. FlushFocusView()
716      * expected: Page / Column get focused.
717      */
718     PipelineContext::GetCurrentContext()->FlushFocusView();
719     EXPECT_TRUE(pagePattern->isViewHasFocused_);
720     EXPECT_TRUE(pagePattern->isViewRootScopeFocused_);
721     EXPECT_TRUE(pagePattern->neverShown_);
722     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
723     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
724     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
725     EXPECT_FALSE(buttonFocusHub1->IsCurrentFocus());
726     EXPECT_FALSE(buttonFocusHub2->IsCurrentFocus());
727 
728     /**
729      * @tc.steps: step5. TriggerFocusMove()
730      * expected: Page / Column / Button2 get focused.
731      */
732     pagePattern->TriggerFocusMove();
733     EXPECT_TRUE(pageFocusHub->IsCurrentFocus());
734     EXPECT_TRUE(pagePattern->IsRootScopeCurrentFocus());
735     EXPECT_TRUE(columnFocusHub->IsCurrentFocus());
736     EXPECT_FALSE(buttonFocusHub1->IsCurrentFocus());
737     EXPECT_TRUE(buttonFocusHub2->IsCurrentFocus());
738 }
739 
740 /**
741  * @tc.name: FocusViewTest008
742  * @tc.desc: RearrangeViewStack
743  * @tc.type: FUNC
744  * @tc.author: catpoison
745  */
746 HWTEST_F(FocusViewTestNg, FocusViewTest008, TestSize.Level1)
747 {
748     /**
749      * @tc.steps: step1. construct components.
750      * - Page1
751      *   - Column1
752      * - Page2
753      *   - Column2
754      */
755     auto rootNode = FrameNodeOnTree::CreateFrameNode(V2::ROOT_ETS_TAG, -1, AceType::MakeRefPtr<RootPattern>());
756     auto rootFocusHub = rootNode->GetOrCreateFocusHub();
757 
758     auto pagePattern1 = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
759     auto pageNode1 = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern1);
760     auto pageFocusHub1 = pageNode1->GetOrCreateFocusHub();
761     rootNode->AddChild(pageNode1);
762 
763     auto columnPattern1 = AceType::MakeRefPtr<LinearLayoutPattern>(true);
764     auto columnNode1 = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern1);
765     auto columnFocusHub1 = columnNode1->GetOrCreateFocusHub();
766 
767     pageNode1->AddChild(columnNode1);
768 
769     auto pagePattern2 = AceType::MakeRefPtr<PagePattern>(AceType::MakeRefPtr<PageInfo>());
770     auto pageNode2 = FrameNodeOnTree::CreateFrameNode(V2::PAGE_ETS_TAG, -1, pagePattern2);
771     auto pageFocusHub2 = pageNode2->GetOrCreateFocusHub();
772     rootNode->AddChild(pageNode2);
773 
774     auto columnPattern2 = AceType::MakeRefPtr<LinearLayoutPattern>(true);
775     auto columnNode2 = FrameNodeOnTree::CreateFrameNode(V2::COLUMN_ETS_TAG, -1, columnPattern2);
776     auto columnFocusHub2 = columnNode2->GetOrCreateFocusHub();
777 
778     pageNode2->AddChild(columnNode2);
779 
780     /**
781      * @tc.steps: step2. Page execute FocusViewShow()
782      * expected: pagePattern1->isViewHasFocused_ is false.
783      */
784     pagePattern1->FocusViewShow();
785     EXPECT_FALSE(pagePattern1->isViewHasFocused_);
786 
787     /**
788      * @tc.steps: step3. FlushFocusView()
789      * expected:
790      * - Page1 *
791      *   - Column1 *
792      * - Page2
793      *   - Column2
794      */
795     PipelineContext::GetCurrentContext()->FlushFocusView();
796     EXPECT_TRUE(pagePattern1->isViewHasFocused_);
797     EXPECT_TRUE(pagePattern1->isViewRootScopeFocused_);
798     EXPECT_TRUE(pageFocusHub1->IsCurrentFocus());
799     EXPECT_TRUE(pagePattern1->IsRootScopeCurrentFocus());
800     EXPECT_TRUE(columnFocusHub1->IsCurrentFocus());
801 
802 
803     EXPECT_FALSE(pagePattern2->isViewHasFocused_);
804     EXPECT_TRUE(pagePattern2->isViewRootScopeFocused_);
805     EXPECT_FALSE(pageFocusHub2->IsCurrentFocus());
806     EXPECT_FALSE(pagePattern2->IsRootScopeCurrentFocus());
807     EXPECT_FALSE(columnFocusHub2->IsCurrentFocus());
808 
809     /**
810      * @tc.steps: step4. Set AutoFocusTransfer False
811      * expected: isAutoFocusTransfer_ is false.
812      */
813     auto focusManager = PipelineContext::GetCurrentContext()->GetFocusManager();
814     focusManager->SetIsAutoFocusTransfer(false);
815     EXPECT_FALSE(focusManager->IsAutoFocusTransfer());
816 
817 
818     /**
819      * @tc.steps: step5. Page execute FocusViewShow()
820      * expected: pagePattern2->isViewHasFocused_ is false.
821      */
822     pagePattern2->FocusViewShow();
823     EXPECT_FALSE(pagePattern2->isViewHasFocused_);
824 
825     /**
826      * @tc.steps: step6. FlushFocusView()
827      * expected:
828      * - Page1 *
829      *   - Column1 *
830      * - Page2
831      *   - Column2
832      */
833     PipelineContext::GetCurrentContext()->FlushFocusView();
834     EXPECT_TRUE(pagePattern1->isViewHasFocused_);
835     EXPECT_TRUE(pagePattern1->isViewRootScopeFocused_);
836     EXPECT_TRUE(pageFocusHub1->IsCurrentFocus());
837     EXPECT_TRUE(pagePattern1->IsRootScopeCurrentFocus());
838     EXPECT_TRUE(columnFocusHub1->IsCurrentFocus());
839 
840     EXPECT_TRUE(pagePattern2->isViewHasFocused_);
841     EXPECT_TRUE(pagePattern2->isViewRootScopeFocused_);
842     EXPECT_FALSE(pageFocusHub2->IsCurrentFocus());
843     EXPECT_FALSE(pagePattern2->IsRootScopeCurrentFocus());
844     EXPECT_FALSE(columnFocusHub2->IsCurrentFocus());
845 
846     /**
847      * @tc.steps: step7. Page2 execute FocusViewClose()
848      * expected: pagePattern1->isViewHasFocused_ is false.
849      */
850     pagePattern2->FocusViewClose();
851 
852     /**
853      * @tc.steps: step8. FlushFocusView()
854      * expected:
855      * - Page1 *
856      *   - Column1 *
857      * - Page2
858      *   - Column2
859      */
860     PipelineContext::GetCurrentContext()->FlushFocusView();
861     EXPECT_TRUE(pagePattern1->isViewHasFocused_);
862     EXPECT_TRUE(pagePattern1->isViewRootScopeFocused_);
863     EXPECT_TRUE(pageFocusHub1->IsCurrentFocus());
864     EXPECT_TRUE(pagePattern1->IsRootScopeCurrentFocus());
865     EXPECT_TRUE(columnFocusHub1->IsCurrentFocus());
866 
867     EXPECT_TRUE(pagePattern2->isViewHasFocused_);
868     EXPECT_TRUE(pagePattern2->isViewRootScopeFocused_);
869     EXPECT_FALSE(pageFocusHub2->IsCurrentFocus());
870     EXPECT_FALSE(pagePattern2->IsRootScopeCurrentFocus());
871     EXPECT_FALSE(columnFocusHub2->IsCurrentFocus());
872 }
873 } // namespace OHOS::Ace::NG
874