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