1 /*
2 * Copyright (c) 2022-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 #include "mock_navigation_route.h"
20 #include "mock_navigation_stack.h"
21
22 #define protected public
23 #define private public
24 #include "test/mock/base/mock_task_executor.h"
25 #include "core/components/button/button_theme.h"
26 #include "core/components_ng/base/frame_node.h"
27 #include "core/components_ng/base/ui_node.h"
28 #include "core/components_ng/pattern/button/button_pattern.h"
29 #include "core/components_ng/pattern/navigation/navigation_content_layout_algorithm.h"
30 #include "core/components_ng/pattern/navigation/navigation_content_pattern.h"
31 #include "core/components_ng/pattern/navigation/navigation_layout_property.h"
32 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
33 #include "core/components_ng/pattern/navigation/navigation_pattern.h"
34 #include "core/components_ng/pattern/navigation/title_bar_pattern.h"
35 #include "core/components_ng/pattern/scroll/scroll_pattern.h"
36 #include "core/components_ng/pattern/text/text_pattern.h"
37 #include "test/mock/core/common/mock_theme_manager.h"
38 #include "test/mock/core/pipeline/mock_pipeline_context.h"
39 #include "test/mock/core/common/mock_container.h"
40
41 using namespace testing;
42 using namespace testing::ext;
43 namespace OHOS::Ace::NG {
44 namespace {
45 const InspectorFilter filter;
46 const std::string NAVIGATION_TITLE = "NavigationTestNg";
47 const std::string TEST_TAG = "test";
48 constexpr float DEFAULT_ROOT_HEIGHT = 800.f;
49 constexpr float DEFAULT_ROOT_WIDTH = 480.f;
50 } // namespace
51
52 class NavigationTestNg : public testing::Test {
53 public:
54 static void SetUpTestSuite();
55 static void TearDownTestSuite();
56 void MockPipelineContextGetTheme();
57 static void RunMeasureAndLayout(RefPtr<LayoutWrapperNode>& layoutWrapper, float width = DEFAULT_ROOT_WIDTH);
58 static RefPtr<NavDestinationGroupNode> CreateDestination(const std::string name);
59 };
60
SetUpTestSuite()61 void NavigationTestNg::SetUpTestSuite()
62 {
63 MockPipelineContext::SetUp();
64 MockContainer::SetUp();
65 MockContainer::Current()->SetNavigationRoute(AceType::MakeRefPtr<MockNavigationRoute>(""));
66 auto context = MockPipelineContext::GetCurrent();
67 if (context) {
68 context->stageManager_ = nullptr;
69 }
70 }
71
TearDownTestSuite()72 void NavigationTestNg::TearDownTestSuite()
73 {
74 MockPipelineContext::TearDown();
75 MockContainer::TearDown();
76 }
77
RunMeasureAndLayout(RefPtr<LayoutWrapperNode> & layoutWrapper,float width)78 void NavigationTestNg::RunMeasureAndLayout(RefPtr<LayoutWrapperNode>& layoutWrapper, float width)
79 {
80 layoutWrapper->SetActive();
81 layoutWrapper->SetRootMeasureNode();
82 LayoutConstraintF LayoutConstraint;
83 LayoutConstraint.parentIdealSize = { width, DEFAULT_ROOT_HEIGHT };
84 LayoutConstraint.percentReference = { width, DEFAULT_ROOT_HEIGHT };
85 LayoutConstraint.selfIdealSize = { width, DEFAULT_ROOT_HEIGHT };
86 LayoutConstraint.maxSize = { width, DEFAULT_ROOT_HEIGHT };
87 layoutWrapper->Measure(LayoutConstraint);
88 layoutWrapper->Layout();
89 layoutWrapper->MountToHostOnMainThread();
90 }
91
MockPipelineContextGetTheme()92 void NavigationTestNg::MockPipelineContextGetTheme()
93 {
94 auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
95 MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
96 EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr<NavigationBarTheme>()));
97 EXPECT_CALL(*themeManager, GetTheme(_, _)).WillRepeatedly(Return(AceType::MakeRefPtr<NavigationBarTheme>()));
98 }
99
CreateDestination(const std::string name)100 RefPtr<NavDestinationGroupNode> NavigationTestNg::CreateDestination(const std::string name)
101 {
102 auto* stack = ViewStackProcessor::GetInstance();
103 // navDestination node
104 int32_t nodeId = stack->ClaimNodeId();
105 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId);
106 auto frameNode = NavDestinationGroupNode::GetOrCreateGroupNode(
107 V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
108 EXPECT_NE(frameNode, nullptr);
109 auto pattern = AceType::DynamicCast<NavDestinationPattern>(frameNode->GetPattern());
110 EXPECT_NE(pattern, nullptr);
111 pattern->SetName(name);
112 auto context = AceType::MakeRefPtr<NavDestinationContext>();
113 auto pathInfo = AceType::MakeRefPtr<NavPathInfo>();
114 pathInfo->name_ = name;
115 context->SetNavPathInfo(pathInfo);
116 return frameNode;
117 }
118
119 struct TestProperty {
120 std::optional<bool> isOn = std::nullopt;
121 std::optional<Color> selectedColor = std::nullopt;
122 std::optional<Color> backgroundColor = std::nullopt;
123 };
124
125 /**
126 * @tc.name: NavigationModelTest004
127 * @tc.desc: Test NavigationModel SetTitle & SetSubTitle.
128 * @tc.type: FUNC
129 */
130 HWTEST_F(NavigationTestNg, NavigationModelTest004, TestSize.Level1)
131 {
132 MockPipelineContextGetTheme();
133 NavigationModelNG navigationModel;
134 navigationModel.Create();
135 navigationModel.SetNavigationStack();
136 navigationModel.SetTitle("navigationView", true);
137 navigationModel.SetSubtitle("subtitle");
138 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
139 ASSERT_NE(frameNode, nullptr);
140 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
141 ASSERT_NE(navigationGroupNode, nullptr);
142 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
143 ASSERT_NE(navBarNode, nullptr);
144 }
145
146 /**
147 * @tc.name: NavigationModelTest003
148 * @tc.desc: Test NavigationModel SetHideToolBar false.
149 * @tc.type: FUNC
150 */
151 HWTEST_F(NavigationTestNg, NavigationModelTest003, TestSize.Level1)
152 {
153 NavigationModelNG navigationModel;
154 navigationModel.Create();
155 navigationModel.SetNavigationStack();
156 navigationModel.SetTitle("navigationModel", false);
157 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
158 EXPECT_NE(frameNode, nullptr);
159 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
160 EXPECT_NE(navigationGroupNode, nullptr);
161 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
162 EXPECT_NE(navBarNode, nullptr);
163 auto navBarLayoutProperty = navBarNode->GetLayoutProperty<NavBarLayoutProperty>();
164 EXPECT_NE(navBarLayoutProperty, nullptr);
165 navigationModel.SetHideToolBar(false);
166 EXPECT_EQ(navBarLayoutProperty->GetHideToolBar().value_or(false), false);
167 }
168
169 /**
170 * @tc.name: NavigationModelNG007
171 * @tc.desc: Test NavigationPattern::CheckTopNavPathChange
172 * @tc.type: FUNC
173 */
174 HWTEST_F(NavigationTestNg, NavigationModelNG007, TestSize.Level1)
175 {
176 /**
177 * @tc.steps: step1. create navigation.
178 */
179 NavigationModelNG model;
180 model.Create();
181 model.SetNavigationStack();
182 auto navigation = AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainFrameNode());
183 ASSERT_NE(navigation, nullptr);
184 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
185 ASSERT_NE(navigationPattern, nullptr);
186 auto narBarNode = AceType::DynamicCast<NavBarNode>(navigation->GetNavBarNode());
187 ASSERT_NE(narBarNode, nullptr);
188 /**
189 * @tc.steps: step2. construct correct arguments of navigationPattern->CheckTopNavPathChange then call it.
190 * @tc.expected: check whether the properties is correct.
191 */
192 auto preTopNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0302() 193 V2::NAVDESTINATION_VIEW_ETS_TAG, 100, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
194 auto newTopNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0402() 195 V2::NAVDESTINATION_VIEW_ETS_TAG, 101, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
196
197 auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon57e04fdf0502() 198 "titleBarNode", 102, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
199 ASSERT_NE(titleBarNode, nullptr);
200 narBarNode->titleBarNode_ = titleBarNode;
201 preTopNavDestination->titleBarNode_ = titleBarNode;
202 newTopNavDestination->titleBarNode_ = titleBarNode;
203 navigationPattern->SetNavigationMode(NavigationMode::STACK);
204 navigationPattern->TransitionWithAnimation(nullptr, nullptr, false);
205 navigationPattern->TransitionWithAnimation(preTopNavDestination, nullptr, false);
206 ASSERT_EQ(preTopNavDestination->transitionType_, PageTransitionType::EXIT_POP);
207 navigationPattern->TransitionWithAnimation(preTopNavDestination, newTopNavDestination, false);
208 ASSERT_EQ(newTopNavDestination->transitionType_, PageTransitionType::ENTER_PUSH);
209 navigationPattern->TransitionWithAnimation(preTopNavDestination, newTopNavDestination, true);
210 ASSERT_EQ(preTopNavDestination->transitionType_, PageTransitionType::EXIT_POP);
211 }
212
213 /**
214 * @tc.name: NavigationModelNG008
215 * @tc.desc: Test NavigationPattern::OnNavBarStateChange
216 * @tc.type: FUNC
217 */
218 HWTEST_F(NavigationTestNg, NavigationModelNG008, TestSize.Level1)
219 {
220 /**
221 * @tc.steps: step1. create navigation.
222 */
223 NavigationModelNG model;
224 model.Create();
225 model.SetNavigationStack();
226 auto navigation = AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainFrameNode());
227 ASSERT_NE(navigation, nullptr);
228 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
229 ASSERT_NE(navigationPattern, nullptr);
230 ASSERT_NE(AceType::DynamicCast<NavBarNode>(navigation->GetNavBarNode()), nullptr);
231
232 /**
233 * @tc.steps: step2. construct correct condition of navigationPattern->OnNavBarStateChange then call it.
234 * @tc.expected: check whether the properties is correct.
235 */
236 navigationPattern->navigationMode_ = NavigationMode::SPLIT;
237 navigationPattern->GetLayoutProperty<NavigationLayoutProperty>()->propHideNavBar_ = false;
238 navigationPattern->OnNavBarStateChange(true);
239 ASSERT_FALSE(navigationPattern->GetLayoutProperty<NavigationLayoutProperty>()->propHideNavBar_.value());
240
241 navigationPattern->navigationMode_ = NavigationMode::STACK;
242 navigationPattern->GetLayoutProperty<NavigationLayoutProperty>()->propHideNavBar_ = false;
243 auto preTopNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0602() 244 V2::NAVDESTINATION_VIEW_ETS_TAG, 100, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
245 navigationPattern->navigationStack_->Add("preTopNavDestination", preTopNavDestination);
246 navigationPattern->OnNavBarStateChange(true);
247 ASSERT_FALSE(navigationPattern->navigationStack_->Empty());
248
249 navigationPattern->navBarVisibilityChange_ = false;
250 navigationPattern->OnNavBarStateChange(false);
251
252 navigationPattern->navBarVisibilityChange_ = true;
253 navigationPattern->navigationMode_ = NavigationMode::STACK;
254 navigationPattern->OnNavBarStateChange(false);
255
256 navigationPattern->navBarVisibilityChange_ = true;
257 navigationPattern->navigationMode_ = NavigationMode::SPLIT;
258 navigationPattern->OnNavBarStateChange(false);
259 ASSERT_FALSE(navigationPattern->navBarVisibilityChange_);
260
261 navigationPattern->navBarVisibilityChange_ = true;
262 navigationPattern->navigationMode_ = NavigationMode::SPLIT;
263 navigationPattern->GetLayoutProperty<NavigationLayoutProperty>()->propHideNavBar_ = true;
264 navigationPattern->OnNavBarStateChange(false);
265 ASSERT_FALSE(navigationPattern->navBarVisibilityChange_);
266 }
267
268 /**
269 * @tc.name: NavigationModelNG0011
270 * @tc.desc: Test NavigationModelNG::SetCustomToolBar && SetToolBarItems
271 * @tc.type: FUNC
272 */
273 HWTEST_F(NavigationTestNg, NavigationModelNG0011, TestSize.Level1)
274 {
275 /**
276 * @tc.steps: step1. create navigation.
277 */
278 NavigationModelNG model;
279 model.Create();
280 model.SetNavigationStack();
281 auto navigation =
282 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
283 ASSERT_NE(navigation, nullptr);
284 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
285 ASSERT_NE(navigationPattern, nullptr);
286 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigation->GetNavBarNode());
287 ASSERT_NE(navBarNode, nullptr);
288
289 auto customNode = FrameNode::CreateFrameNode("text", 113, AceType::MakeRefPtr<TextPattern>());
290 model.SetCustomToolBar(customNode);
291 ASSERT_EQ(navBarNode->GetToolBarNodeOperationValue(), ChildNodeOperation::REPLACE);
292
293 navBarNode->propPrevToolBarIsCustom_ = true;
294 model.SetCustomToolBar(customNode);
295 ASSERT_EQ(navBarNode->GetToolBarNodeOperationValue(), ChildNodeOperation::REPLACE);
296
297 customNode =
298 FrameNode::CreateFrameNode("text", navBarNode->GetToolBarNode()->GetId(), AceType::MakeRefPtr<TextPattern>());
299 model.SetCustomToolBar(customNode);
300 ASSERT_EQ(navBarNode->GetToolBarNodeOperationValue(), ChildNodeOperation::NONE);
301
302 std::vector<NG::BarItem> toolBarItems;
303 model.SetToolBarItems(std::move(toolBarItems));
304 ASSERT_EQ(navBarNode->GetToolBarNodeOperationValue(), ChildNodeOperation::REPLACE);
305
306 navBarNode->preToolBarNode_ = nullptr;
307 model.SetToolBarItems(std::move(toolBarItems));
308 ASSERT_EQ(navBarNode->GetToolBarNodeOperationValue(), ChildNodeOperation::REPLACE);
309 }
310
311 /**
312 * @tc.name: NavigationModelNG0012
313 * @tc.desc: Test NavigationModelNG::SetToolbarConfiguration
314 * @tc.type: FUNC
315 */
316 HWTEST_F(NavigationTestNg, NavigationModelNG0012, TestSize.Level1)
317 {
318 /**
319 * @tc.steps: step1. create navigation.
320 */
321 NavigationModelNG model;
322 model.Create();
323 model.SetNavigationStack();
324 auto navigation =
325 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
326 ASSERT_NE(navigation, nullptr);
327 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
328 ASSERT_NE(navigationPattern, nullptr);
329 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigation->GetNavBarNode());
330 ASSERT_NE(navBarNode, nullptr);
331
332 navBarNode->propPrevToolBarIsCustom_ = true;
333 std::vector<NG::BarItem> toolBarItems;
334 model.SetToolbarConfiguration(std::move(toolBarItems));
335 ASSERT_EQ(navBarNode->GetToolBarNodeOperationValue(), ChildNodeOperation::REPLACE);
336 }
337
338 /**
339 * @tc.name: NavigationModelNG0013
340 * @tc.desc: Test NavigationContentLayoutAlgorithm::Measure
341 * @tc.type: FUNC
342 */
343 HWTEST_F(NavigationTestNg, NavigationModelNG0013, TestSize.Level1)
344 {
345 /**
346 * @tc.steps: step1. create navigation.
347 */
348 auto navigation = NavigationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0702() 349 "navigation", 120, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
350 ASSERT_NE(navigation, nullptr);
351 auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
352 ASSERT_NE(navigationStack, nullptr);
353 navigation->GetPattern<NavigationPattern>()->SetNavigationStack(std::move(navigationStack));
354 auto layoutWrapper = navigation->CreateLayoutWrapper();
355
356 auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0802() 357 "navDestination", 121, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
358 auto navDestinationWrapper1 = navDestination->CreateLayoutWrapper();
359
360 ASSERT_EQ(layoutWrapper->GetTotalChildCount(), 0);
361 ASSERT_NE(layoutWrapper->GetLayoutProperty(), nullptr);
362 ASSERT_NE(navDestinationWrapper1->GetLayoutAlgorithm(), nullptr);
363 ASSERT_NE(navDestinationWrapper1->GetLayoutAlgorithm()->GetLayoutAlgorithm(), nullptr);
364
365 auto temp1 = AceType::MakeRefPtr<NavDestinationLayoutAlgorithm>();
366 navDestinationWrapper1->layoutAlgorithm_->layoutAlgorithm_ = temp1;
367
368 layoutWrapper->AppendChild(navDestinationWrapper1);
369
370 NavigationContentLayoutAlgorithm algorithm;
371 algorithm.Measure(AceType::RawPtr(layoutWrapper));
372
373 auto navDestination2 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0902() 374 "navDestination", 121, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
375 auto navDestinationWrapper2 = navDestination2->CreateLayoutWrapper();
376 auto temp2 = AceType::MakeRefPtr<NavDestinationLayoutAlgorithm>();
377 temp2->isShown_ = true;
378 navDestinationWrapper2->layoutAlgorithm_->layoutAlgorithm_ = temp2;
379 layoutWrapper->AppendChild(navDestinationWrapper2);
380 algorithm.Measure(AceType::RawPtr(layoutWrapper));
381 ASSERT_TRUE(temp2->isShown_);
382 temp1->isShown_ = true;
383 algorithm.Measure(AceType::RawPtr(layoutWrapper));
384 ASSERT_TRUE(temp1->isShown_);
385 }
386
387 /**
388 * @tc.name: NavigationModelNG0015
389 * @tc.desc: Test NavigationModelNG::UpdateNavDestinationNodeWithoutMarkDirty
390 * @tc.type: FUNC
391 */
392 HWTEST_F(NavigationTestNg, NavigationModelNG0015, TestSize.Level1)
393 {
394 /**
395 * @tc.steps: step1. create navigation.
396 */
397 NavigationModelNG model;
398 model.Create();
399 model.SetNavigationStack();
400 auto navigation =
401 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
402 ASSERT_NE(navigation, nullptr);
403 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
404 ASSERT_NE(navigationPattern, nullptr);
405
406 auto navigationContentNode =
407 FrameNode::CreateFrameNode("navigationContent", 123, AceType::MakeRefPtr<ButtonPattern>());
408 navigation->contentNode_ = navigationContentNode;
409 ASSERT_NE(navigationPattern->navigationStack_, nullptr);
410 /**
411 * @tc.steps: step2. create navDestination.
412 */
413 auto navDestination1 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0a02() 414 "NavDestination", 124, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
415 auto navDestination2 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0b02() 416 "NavDestination", 125, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
417 auto navDestination3 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0c02() 418 "NavDestination", 126, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
419 auto navDestination4 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0d02() 420 "NavDestination", 127, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
421 auto navDestination5 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0e02() 422 "NavDestination", 129, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
423 auto navDestination6 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf0f02() 424 "NavDestination", 130, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
425 auto navDestination7 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1002() 426 "NavDestination", 131, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
427 auto child8 = FrameNode::CreateFrameNode("NavDestination", 132, AceType::MakeRefPtr<ButtonPattern>());
428
429 auto temp = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1102() 430 "NavDestination", 133, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
431 /**
432 * @tc.steps: step3. add element to navigationPattern->navigationStack_.
433 */
434 navigationPattern->navigationStack_->Add("navDestination1", navDestination1);
435 navigationPattern->navigationStack_->Add("navDestination2", navDestination2);
436 navigationPattern->navigationStack_->Add("navDestination3", navDestination3);
437
438 auto pattern5 = navDestination5->GetPattern<NavDestinationPattern>();
439 pattern5->customNode_ = AceType::RawPtr(navDestination5);
440
441 pattern5->shallowBuilder_ = AceType::MakeRefPtr<ShallowBuilder>(
__anon57e04fdf1202() 442 []() { return FrameNode::CreateFrameNode("temp", 234, AceType::MakeRefPtr<ButtonPattern>()); });
443 navDestination5->contentNode_ = FrameNode::CreateFrameNode("temp", 235, AceType::MakeRefPtr<ButtonPattern>());
444
445 auto pattern6 = navDestination6->GetPattern<NavDestinationPattern>();
446 pattern6->customNode_ = AceType::RawPtr(navDestination6);
447
448 auto pattern7 = navDestination7->GetPattern<NavDestinationPattern>();
449 pattern7->customNode_ = AceType::RawPtr(navDestination7);
450
451 ASSERT_NE(navDestination7->GetPattern<NavDestinationPattern>()->GetCustomNode(), nullptr);
452 /**
453 * @tc.steps: step4. add element to navigationContentNode->children_.
454 */
455 navigationContentNode->children_.push_back(navDestination1);
456 navigationContentNode->children_.push_back(navDestination4);
457 navigationContentNode->children_.push_back(navDestination2);
458 navigationContentNode->children_.push_back(navDestination5);
459 navigationContentNode->children_.push_back(navDestination6);
460 navigationContentNode->children_.push_back(navDestination7);
461 navigationContentNode->children_.push_back(child8);
462
463 navigation->UpdateNavDestinationNodeWithoutMarkDirty(temp);
464 }
465
466 /**
467 * @tc.name: NavigationModelNG0016
468 * @tc.desc: Test NavigationModelNG::GetNavDestinationNode
469 * @tc.type: FUNC
470 */
471 HWTEST_F(NavigationTestNg, NavigationModelNG0016, TestSize.Level1)
472 {
473 /**
474 * @tc.steps: step1. create navigation.
475 */
476 NavigationModelNG model;
477 model.Create();
478 model.SetNavigationStack();
479 auto navigation =
480 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
481 ASSERT_NE(navigation, nullptr);
482 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
483 ASSERT_NE(navigationPattern, nullptr);
484
485 auto navigationContentNode =
486 FrameNode::CreateFrameNode("navigationContent", 123, AceType::MakeRefPtr<ButtonPattern>());
487 navigation->contentNode_ = navigationContentNode;
488
489 auto result = navigation->GetNavDestinationNode(navigationContentNode);
490 ASSERT_EQ(result, nullptr);
491 }
492
493 /**
494 * @tc.name: NavigationModelNG0017
495 * @tc.desc: Test NavigationModelNG::CheckCanHandleBack
496 * @tc.type: FUNC
497 */
498 HWTEST_F(NavigationTestNg, NavigationModelNG0017, TestSize.Level1)
499 {
500 /**
501 * @tc.steps: step1. create navigation.
502 */
503 NavigationModelNG model;
504 model.Create();
505 model.SetNavigationStack();
506 auto navigation =
507 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
508 ASSERT_NE(navigation, nullptr);
509 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
510 ASSERT_NE(navigationPattern, nullptr);
511
512 auto navigationContentNode =
513 FrameNode::CreateFrameNode("navigationContent", 123, AceType::MakeRefPtr<ButtonPattern>());
514 navigation->contentNode_ = navigationContentNode;
515
516 auto child = FrameNode::CreateFrameNode("navigationContent", 345, AceType::MakeRefPtr<ButtonPattern>());
517 navigationContentNode->children_.push_back(child);
518
519 bool isEntry = false;
520 navigation->CheckCanHandleBack(isEntry);
521 ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::AUTO);
522 navigationPattern->navigationMode_ = NavigationMode::SPLIT;
523 navigation->CheckCanHandleBack(isEntry);
524 ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::SPLIT);
525 auto child2 = FrameNode::CreateFrameNode("navigationContent", 346, AceType::MakeRefPtr<ButtonPattern>());
526 navigationContentNode->children_.push_back(child2);
527 navigationPattern->navigationMode_ = NavigationMode::SPLIT;
528 navigation->CheckCanHandleBack(isEntry);
529 ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::SPLIT);
530 }
531
532 /**
533 * @tc.name: NavigationModelNG0018
534 * @tc.desc: Test NavigationModelNG::UpdateNavDestinationNodeWithoutMarkDirty
535 * @tc.type: FUNC
536 */
537 HWTEST_F(NavigationTestNg, NavigationModelNG0018, TestSize.Level1)
538 {
539 /**
540 * @tc.steps: step1. create navigation.
541 */
542 NavigationModelNG model;
543 model.Create();
544 model.SetNavigationStack();
545 auto navigation =
546 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
547 ASSERT_NE(navigation, nullptr);
548 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
549 ASSERT_NE(navigationPattern, nullptr);
550
551 auto navigationContentNode =
552 FrameNode::CreateFrameNode("navigationContent", 123, AceType::MakeRefPtr<ButtonPattern>());
553 navigation->contentNode_ = navigationContentNode;
554 ASSERT_NE(navigationPattern->navigationStack_, nullptr);
555 /**
556 * @tc.steps: step2. create navDestination.
557 */
558 auto navDestination1 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1302() 559 "NavDestination", 154, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
560 auto navDestination2 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1402() 561 "NavDestination", 155, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
562 auto navDestination3 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1502() 563 "NavDestination", 156, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
564 auto navDestination4 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1602() 565 "NavDestination", 157, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
566 auto navDestination5 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1702() 567 "NavDestination", 159, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
568 auto navDestination6 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1802() 569 "NavDestination", 160, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
570 auto navDestination7 = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1902() 571 "NavDestination", 161, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
572 auto child8 = FrameNode::CreateFrameNode("NavDestination", 132, AceType::MakeRefPtr<ButtonPattern>());
573
574 auto temp = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1a02() 575 "NavDestination", 163, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
576
577 auto pattern5 = navDestination5->GetPattern<NavDestinationPattern>();
578 pattern5->customNode_ = AceType::RawPtr(navDestination5);
579
580 pattern5->shallowBuilder_ = AceType::MakeRefPtr<ShallowBuilder>(
__anon57e04fdf1b02() 581 []() { return FrameNode::CreateFrameNode("temp", 236, AceType::MakeRefPtr<ButtonPattern>()); });
582 navDestination5->contentNode_ = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
583
584 auto pattern6 = navDestination6->GetPattern<NavDestinationPattern>();
585 pattern6->customNode_ = AceType::RawPtr(navDestination6);
586
587 auto pattern7 = navDestination7->GetPattern<NavDestinationPattern>();
588 pattern7->customNode_ = AceType::RawPtr(temp);
589
590 ASSERT_NE(navDestination7->GetPattern<NavDestinationPattern>()->GetCustomNode(), nullptr);
591 /**
592 * @tc.steps: step4. add element to navigationContentNode->children_.
593 */
594 navigationContentNode->children_.push_back(navDestination1);
595 navigationContentNode->children_.push_back(navDestination4);
596 navigationContentNode->children_.push_back(navDestination2);
597 navigationContentNode->children_.push_back(navDestination5);
598 navigationContentNode->children_.push_back(navDestination6);
599 navigationContentNode->children_.push_back(navDestination7);
600 navigationContentNode->children_.push_back(child8);
601
602 navigation->UpdateNavDestinationNodeWithoutMarkDirty(temp);
603 }
604
605 /**
606 * @tc.name: NavigationModelNG0019
607 * @tc.desc: Test NavigationLayoutAlgorithm::IsAutoHeight
608 * @tc.type: FUNC
609 */
610 HWTEST_F(NavigationTestNg, NavigationModelNG0019, TestSize.Level1)
611 {
612 /**
613 * @tc.steps: step1. create navigation.
614 */
615 NavigationModelNG model;
616 model.Create();
617 model.SetNavigationStack();
618 auto navigation =
619 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
620 ASSERT_NE(navigation, nullptr);
621
622 auto property = AceType::MakeRefPtr<LayoutProperty>();
623 std::unique_ptr<MeasureProperty> calcLayoutConstraint = std::make_unique<MeasureProperty>();
624 std::optional<CalcLength> len = CalcLength("auto");
625 calcLayoutConstraint->selfIdealSize = CalcSize(std::nullopt, len);
626 property->calcLayoutConstraint_ = std::move(calcLayoutConstraint);
627
628 auto& test = property->GetCalcLayoutConstraint();
629 ASSERT_NE(test, nullptr);
630 ASSERT_TRUE(test->selfIdealSize.has_value());
631 ASSERT_TRUE(test->selfIdealSize->Height().has_value());
632 ASSERT_NE(test->selfIdealSize->Height().value().ToString().find("auto"), std::string::npos);
633
634 NavigationLayoutAlgorithm algorithm;
635 auto result = algorithm.IsAutoHeight(property);
636 ASSERT_TRUE(result);
637
638 len = CalcLength("");
639 property->calcLayoutConstraint_->selfIdealSize = CalcSize(std::nullopt, len);
640 result = algorithm.IsAutoHeight(property);
641 ASSERT_FALSE(result);
642
643 property->calcLayoutConstraint_->selfIdealSize = CalcSize(std::nullopt, std::nullopt);
644 result = algorithm.IsAutoHeight(property);
645 ASSERT_FALSE(result);
646
647 property->calcLayoutConstraint_->selfIdealSize = std::nullopt;
648 result = algorithm.IsAutoHeight(property);
649 ASSERT_FALSE(result);
650
651 property->calcLayoutConstraint_ = nullptr;
652 result = algorithm.IsAutoHeight(property);
653 ASSERT_FALSE(result);
654 }
655
656 /**
657 * @tc.name: NavigationModelNG0020
658 * @tc.desc: Test NavigationLayoutAlgorithm::SizeCalculationSplit
659 * @tc.type: FUNC
660 */
661 HWTEST_F(NavigationTestNg, NavigationModelNG0020, TestSize.Level1)
662 {
663 /**
664 * @tc.steps: step1. create navigation.
665 */
666 NavigationModelNG model;
667 model.Create();
668 model.SetNavigationStack();
669 auto navigation =
670 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
671 ASSERT_NE(navigation, nullptr);
672
673 auto algorithm = AceType::MakeRefPtr<NavigationLayoutAlgorithm>();
674 auto property = AceType::MakeRefPtr<NavigationLayoutProperty>();
675 property->propHideNavBar_ = true;
676 property->layoutConstraint_ = LayoutConstraintF();
677
678 algorithm->SizeCalculationSplit(navigation, property, SizeF());
679 property->propHideNavBar_ = false;
680 algorithm->realNavBarWidth_ = -1.0f;
681 algorithm->SizeCalculationSplit(navigation, property, SizeF(0.0f, 0.0f));
682 }
683
684 /**
685 * @tc.name: NavigationModelNG0021
686 * @tc.desc: Test NavigationLayoutAlgorithm::CheckSizeInSplit
687 * @tc.type: FUNC
688 */
689 HWTEST_F(NavigationTestNg, NavigationModelNG0021, TestSize.Level1)
690 {
691 /**
692 * @tc.steps: step1. create navigation.
693 */
694 NavigationModelNG model;
695 model.Create();
696 model.SetNavigationStack();
697 auto navigation =
698 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
699 ASSERT_NE(navigation, nullptr);
700
701 auto algorithm = AceType::MakeRefPtr<NavigationLayoutAlgorithm>();
702 auto property = AceType::MakeRefPtr<NavigationLayoutProperty>();
703 property->propHideNavBar_ = true;
704 property->layoutConstraint_ = LayoutConstraintF();
705
706 algorithm->userSetMinContentFlag_ = true;
707 algorithm->userSetNavBarRangeFlag_ = false;
708 algorithm->CheckSizeInSplit(0, 0, 0, 0);
709 ASSERT_EQ(algorithm->realNavBarWidth_, 0.0f);
710
711 algorithm->CheckSizeInSplit(50, 0, 0, 0);
712 algorithm->realNavBarWidth_ = 60;
713 algorithm->CheckSizeInSplit(50, 0, 0, 0);
714 ASSERT_FALSE(algorithm->userSetNavBarRangeFlag_);
715
716 algorithm->userSetMinContentFlag_ = false;
717 algorithm->userSetNavBarRangeFlag_ = false;
718 algorithm->userSetNavBarWidthFlag_ = true;
719 algorithm->CheckSizeInSplit(50, 0, 0, 0);
720 ASSERT_FALSE(algorithm->userSetMinContentFlag_);
721
722 algorithm->userSetNavBarWidthFlag_ = false;
723 algorithm->realNavBarWidth_ = 0;
724 algorithm->CheckSizeInSplit(50, 0, 0, 0);
725 ASSERT_FALSE(algorithm->userSetNavBarWidthFlag_);
726
727 algorithm->realNavBarWidth_ = 60;
728 algorithm->userSetNavBarWidthFlag_ = false;
729 algorithm->CheckSizeInSplit(100, 0, 0, 50);
730 ASSERT_FALSE(algorithm->userSetNavBarWidthFlag_);
731
732 algorithm->userSetMinContentFlag_ = true;
733 algorithm->userSetNavBarRangeFlag_ = true;
734 algorithm->realNavBarWidth_ = 40;
735 algorithm->userSetNavBarWidthFlag_ = false;
736 algorithm->CheckSizeInSplit(100, 0, 60, 50);
737 ASSERT_TRUE(algorithm->userSetMinContentFlag_);
738 }
739
740 /**
741 * @tc.name: NavigationModelNG0022
742 * @tc.desc: Test NavigationLayoutAlgorithm::MeasureContentChild
743 * @tc.type: FUNC
744 */
745 HWTEST_F(NavigationTestNg, NavigationModelNG0022, TestSize.Level1)
746 {
747 /**
748 * @tc.steps: step1. create navigation.
749 */
750 NavigationModelNG model;
751 model.Create();
752 model.SetNavigationStack();
753 auto navigation =
754 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
755 ASSERT_NE(navigation, nullptr);
756 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
757 ASSERT_NE(navigationPattern, nullptr);
758 auto contentNode = FrameNode::CreateFrameNode("content", 454, AceType::MakeRefPtr<ButtonPattern>());
759 navigation->contentNode_ = contentNode;
760 navigation->children_.push_back(contentNode);
761
762 auto layoutWrapper = navigation->CreateLayoutWrapper();
763 auto navigationLayoutProperty = AceType::MakeRefPtr<NavigationLayoutProperty>();
764
765 layoutWrapper->layoutProperty_ = navigationLayoutProperty;
766 auto contentWrapper = contentNode->CreateLayoutWrapper();
767 layoutWrapper->AppendChild(contentWrapper);
768 contentNode->children_.push_back(FrameNode::CreateFrameNode("content", 456, AceType::MakeRefPtr<ButtonPattern>()));
769
770 auto algorithm = AceType::MakeRefPtr<NavigationLayoutAlgorithm>();
771 algorithm->MeasureContentChild(AceType::RawPtr(layoutWrapper), navigation, navigationLayoutProperty, SizeF());
772 ASSERT_FALSE(contentNode->children_.empty());
773
774 std::unique_ptr<MeasureProperty> calcLayoutConstraint = std::make_unique<MeasureProperty>();
775 std::optional<CalcLength> len = CalcLength(200);
776 calcLayoutConstraint->selfIdealSize = CalcSize(std::nullopt, len);
777 navigationLayoutProperty->calcLayoutConstraint_ = std::move(calcLayoutConstraint);
778 algorithm->MeasureContentChild(AceType::RawPtr(layoutWrapper), navigation, navigationLayoutProperty, SizeF());
779 algorithm->MeasureNavBarOrHomeDestination(
780 AceType::RawPtr(layoutWrapper), navigation, navigationLayoutProperty, SizeF());
781 LayoutConstraintF constraint;
782 constraint.selfIdealSize = OptionalSizeF(20, 20);
783 navigationLayoutProperty->layoutConstraint_ = LayoutConstraintF();
784 algorithm->Measure(AceType::RawPtr(layoutWrapper));
785 ASSERT_FALSE(contentNode->children_.empty());
786 }
787
788 /**
789 * @tc.name: NavigationModelNG0023
790 * @tc.desc: Test NavigationLayoutAlgorithm::SetNavigationHeight
791 * @tc.type: FUNC
792 */
793 HWTEST_F(NavigationTestNg, NavigationModelNG0023, TestSize.Level1)
794 {
795 /**
796 * @tc.steps: step1. create navigation.
797 */
798 NavigationModelNG model;
799 model.Create();
800 model.SetNavigationStack();
801 auto navigation =
802 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
803 ASSERT_NE(navigation, nullptr);
804 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
805 ASSERT_NE(navigationPattern, nullptr);
806 auto contentNode = FrameNode::CreateFrameNode("content", 454, AceType::MakeRefPtr<ButtonPattern>());
807
808 auto layoutWrapper = navigation->CreateLayoutWrapper();
809
810 auto algorithm = AceType::MakeRefPtr<NavigationLayoutAlgorithm>();
811 SizeF size;
812 algorithm->SetNavigationHeight(AceType::RawPtr(layoutWrapper), size);
813
814 navigationPattern->navigationStack_->Add("11", contentNode);
815 algorithm->SetNavigationHeight(AceType::RawPtr(layoutWrapper), size);
816 ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::AUTO);
817
818 navigationPattern->navigationMode_ = NavigationMode::STACK;
819 algorithm->SetNavigationHeight(AceType::RawPtr(layoutWrapper), size);
820 ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::STACK);
821
822 navigationPattern->navigationMode_ = NavigationMode::SPLIT;
823 algorithm->SetNavigationHeight(AceType::RawPtr(layoutWrapper), size);
824 ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::SPLIT);
825 }
826
827 /**
828 * @tc.name: NavigationModelNG0025
829 * @tc.desc: Test NavBarPattern::OnWindowSizeChanged
830 * @tc.type: FUNC
831 */
832 HWTEST_F(NavigationTestNg, NavigationModelNG0025, TestSize.Level1)
833 {
834 /**
835 * @tc.steps: step1. create navigation.
836 */
837 NavigationModelNG model;
838 model.Create();
839 model.SetNavigationStack();
840 auto navigation =
841 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
842 ASSERT_NE(navigation, nullptr);
843 auto navigationPattern = navigation->GetPattern<NavigationPattern>();
844 ASSERT_NE(navigationPattern, nullptr);
845 auto contentNode = FrameNode::CreateFrameNode("content", 454, AceType::MakeRefPtr<ButtonPattern>());
846
847 auto navBar =
__anon57e04fdf1c02() 848 NavBarNode::GetOrCreateNavBarNode("navBar", 300, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
849 ASSERT_NE(navBar, nullptr);
850 auto navBarPattern = navBar->GetPattern<NavBarPattern>();
851 ASSERT_NE(navBarPattern, nullptr);
852 navBarPattern->OnWindowSizeChanged(20, 20, WindowSizeChangeReason::RESIZE);
853 auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon57e04fdf1d02() 854 "titleBarNode", 301, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
855 ASSERT_EQ(titleBarNode->menu_, nullptr);
856 navBar->titleBarNode_ = titleBarNode;
857 navBarPattern->OnWindowSizeChanged(20, 20, WindowSizeChangeReason::RESIZE);
858 auto menu = FrameNode::CreateFrameNode("menu", 302, AceType::MakeRefPtr<ButtonPattern>());
859 auto barItem = BarItemNode::GetOrCreateBarItemNode(
__anon57e04fdf1e02() 860 V2::BAR_ITEM_ETS_TAG, 303, []() { return AceType::MakeRefPtr<Pattern>(); });
861 menu->children_.push_back(barItem);
862 titleBarNode->menu_ = menu;
863 barItem->isMoreItemNode_ = true;
864 navBarPattern->OnWindowSizeChanged(20, 20, WindowSizeChangeReason::RECOVER);
865 ASSERT_TRUE(barItem->isMoreItemNode_);
866 barItem->isMoreItemNode_ = false;
867 navBarPattern->OnWindowSizeChanged(20, 20, WindowSizeChangeReason::RECOVER);
868 ASSERT_FALSE(barItem->isMoreItemNode_);
869 }
870
871 HWTEST_F(NavigationTestNg, NavigationStackTest001, TestSize.Level1)
872 {
873 /**
874 * @tc.steps: step1.create navigation, and set the navigation stack
875 */
876 auto context = MockPipelineContext::GetCurrent();
877 ASSERT_NE(context, nullptr);
878 NavigationModelNG navigationModel;
879 navigationModel.Create();
880 navigationModel.SetNavigationStack();
881 navigationModel.SetTitle("navigationModel", false);
882 RefPtr<NavigationGroupNode> navigationNode =
883 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
884 ASSERT_NE(navigationNode, nullptr);
885 navigationNode->AttachToMainTree(false, AceType::RawPtr(context));
886
887 /**
888 * @tc.steps: step2.add page A
889 */
890 auto* viewStack = ViewStackProcessor::GetInstance();
891 ASSERT_NE(viewStack, nullptr);
892 // navDestination node
893 int32_t nodeId = viewStack->ClaimNodeId();
894 auto frameNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf1f02() 895 V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
896 auto pattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
897 auto stack = pattern->GetNavigationStack();
898 stack->Add("A", frameNode);
899 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
900 navigationPattern->OnModifyDone();
901 navigationPattern->MarkNeedSyncWithJsStack();
902 navigationPattern->SyncWithJsStackIfNeeded();
903 auto targetNode = navigationPattern->GetNavigationStack()->Get();
904 ASSERT_EQ(frameNode, targetNode);
905
906 /**
907 * @tc.steps: step3. replace pageA
908 */
909 nodeId = viewStack->ClaimNodeId();
910 auto replaceNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf2002() 911 V2::NAVDESTINATION_VIEW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
912 stack->Pop();
913 stack->Add("C", replaceNode);
914 navigationPattern->OnModifyDone();
915 navigationPattern->MarkNeedSyncWithJsStack();
916 navigationPattern->SyncWithJsStackIfNeeded();
917 ASSERT_EQ(replaceNode, stack->Get());
918 }
919
920 HWTEST_F(NavigationTestNg, NavigationStackTest002, TestSize.Level1)
921 {
922 /**
923 * @tc.steps: step1.create navigation, and set the navigation stack
924 */
925 NavigationModelNG navigationModel;
926 navigationModel.Create();
927 navigationModel.SetTitle("navigationModel", false);
928 RefPtr<NavigationGroupNode> navigationNode =
929 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
930 ASSERT_NE(navigationNode, nullptr);
931 auto pattern = navigationNode->GetPattern<NavigationPattern>();
932 ASSERT_NE(pattern, nullptr);
933 pattern->SetNavigationStack(AceType::MakeRefPtr<MockNavigationStack>());
934 /**
935 * @tc.steps: step2.add page A
936 */
937 RefPtr<FrameNode> frameNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<NavDestinationPattern>());
938 auto stack = pattern->GetNavigationStack();
939 stack->Add("A", frameNode);
940 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
941 navigationPattern->OnModifyDone();
942 navigationPattern->MarkNeedSyncWithJsStack();
943 navigationPattern->SyncWithJsStackIfNeeded();
944 ASSERT_EQ(stack->Size(), 1);
945
946 /**
947 * @tc.steps: step3. replace pageA
948 */
949 RefPtr<FrameNode> replaceNode = FrameNode::CreateFrameNode("temp", 245,
950 AceType::MakeRefPtr<NavDestinationPattern>());
951 stack->Remove();
952 stack->Add("B", replaceNode);
953 navigationPattern->OnModifyDone();
954 navigationPattern->MarkNeedSyncWithJsStack();
955 navigationPattern->SyncWithJsStackIfNeeded();
956 ASSERT_EQ(stack->Size(), 1);
957
958 /**
959 * @tc.steps: step4. push pageC
960 */
961 stack->Add("C", frameNode);
962 navigationPattern->OnModifyDone();
963 navigationPattern->MarkNeedSyncWithJsStack();
964 navigationPattern->SyncWithJsStackIfNeeded();
965 ASSERT_EQ(stack->Size(), 2);
966 }
967
968 HWTEST_F(NavigationTestNg, NavigationReplaceTest001, TestSize.Level1)
969 {
970 /**
971 * @tc.steps: step1.create navigation, and set the navigation stack
972 */
973 NavigationModelNG navigationModel;
974 navigationModel.Create();
975 auto navigationStack = AceType::MakeRefPtr<MockNavigationStack>();
976 navigationModel.SetNavigationStack(navigationStack);
977 navigationModel.SetTitle("navigationModel", false);
978 RefPtr<NavigationGroupNode> navigationNode =
979 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
980 ASSERT_NE(navigationNode, nullptr);
981 auto pattern = navigationNode->GetPattern<NavigationPattern>();
982 auto stack = pattern->GetNavigationStack();
983 ASSERT_EQ(stack->GetReplaceValue(), 0);
984
985 /**
986 * @tc.steps: step2.add page A to stack
987 */
988 RefPtr<FrameNode> frameNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
989 stack->Add("A", frameNode);
990 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
991 navigationPattern->SetNavigationMode(NavigationMode::STACK);
992 navigationPattern->OnModifyDone();
993 navigationPattern->MarkNeedSyncWithJsStack();
994 navigationPattern->SyncWithJsStackIfNeeded();
995 ASSERT_EQ(stack->GetReplaceValue(), 0);
996
997 /**
998 * @tc.steps: step2.replace page A in stack
999 */
1000 RefPtr<FrameNode> replaceNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1001 stack->Remove();
1002 stack->Add("B", replaceNode);
1003 stack->UpdateReplaceValue(1);
1004 ASSERT_EQ(stack->GetReplaceValue(), 1);
1005 navigationPattern->OnModifyDone();
1006 navigationPattern->MarkNeedSyncWithJsStack();
1007 navigationPattern->SyncWithJsStackIfNeeded();
1008 ASSERT_EQ(stack->GetReplaceValue(), 0);
1009
1010 /**
1011 * @tc.steps: step2.push A
1012 */
1013 stack->Add("C", frameNode);
1014 navigationPattern->OnModifyDone();
1015 navigationPattern->MarkNeedSyncWithJsStack();
1016 navigationPattern->SyncWithJsStackIfNeeded();
1017 ASSERT_EQ(stack->GetReplaceValue(), 0);
1018 }
1019
1020 HWTEST_F(NavigationTestNg, NavigationReplaceTest002, TestSize.Level1)
1021 {
1022 /**
1023 * @tc.steps: step1.create navigation, and set the navigation stack
1024 */
1025 NavigationModelNG navigationModel;
1026 navigationModel.Create();
1027 auto navigationStack = AceType::MakeRefPtr<MockNavigationStack>();
1028 navigationModel.SetNavigationStack(navigationStack);
1029 navigationModel.SetTitle("navigationModel", false);
1030 RefPtr<NavigationGroupNode> navigationNode =
1031 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
1032 ASSERT_NE(navigationNode, nullptr);
1033 auto pattern = navigationNode->GetPattern<NavigationPattern>();
1034 auto stack = pattern->GetNavigationStack();
1035 ASSERT_EQ(stack->GetReplaceValue(), 0);
1036
1037 /**
1038 * @tc.steps: step2.add page A to stack
1039 */
1040 RefPtr<FrameNode> frameNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1041 stack->Add("A", frameNode);
1042 stack->Add("A", frameNode);
1043 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1044 navigationPattern->SetNavigationMode(NavigationMode::STACK);
1045 navigationPattern->OnModifyDone();
1046 navigationPattern->MarkNeedSyncWithJsStack();
1047 navigationPattern->SyncWithJsStackIfNeeded();
1048 ASSERT_EQ(stack->GetReplaceValue(), 0);
1049
1050 /**
1051 * @tc.steps: step2.replace page A in stack
1052 */
1053 RefPtr<FrameNode> replaceNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1054 stack->Remove();
1055 stack->Add("B", replaceNode);
1056 stack->UpdateReplaceValue(1);
1057 ASSERT_EQ(stack->GetReplaceValue(), 1);
1058 navigationPattern->OnModifyDone();
1059 navigationPattern->MarkNeedSyncWithJsStack();
1060 navigationPattern->SyncWithJsStackIfNeeded();
1061 ASSERT_EQ(stack->GetReplaceValue(), 0);
1062
1063 /**
1064 * @tc.steps: step3.pop page B
1065 */
1066 stack->Remove();
1067 navigationPattern->OnModifyDone();
1068 navigationPattern->MarkNeedSyncWithJsStack();
1069 navigationPattern->SyncWithJsStackIfNeeded();
1070 ASSERT_EQ(stack->GetReplaceValue(), 0);
1071 }
1072
1073 HWTEST_F(NavigationTestNg, NavigationReplaceTest003, TestSize.Level1)
1074 {
1075 /**
1076 * @tc.steps: step1.create navigation, and set the navigation stack
1077 */
1078 NavigationModelNG navigationModel;
1079 navigationModel.Create();
1080 auto navigationStack = AceType::MakeRefPtr<MockNavigationStack>();
1081 navigationModel.SetNavigationStack(navigationStack);
1082 navigationModel.SetTitle("navigationModel", false);
1083 RefPtr<NavigationGroupNode> navigationNode =
1084 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
1085 ASSERT_NE(navigationNode, nullptr);
1086 auto pattern = navigationNode->GetPattern<NavigationPattern>();
1087 auto stack = pattern->GetNavigationStack();
1088 ASSERT_EQ(stack->GetReplaceValue(), 0);
1089
1090 /**
1091 * @tc.steps: step2.add page A to stack
1092 */
1093 RefPtr<FrameNode> frameNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1094 stack->Add("A", frameNode);
1095 stack->Add("A", frameNode);
1096 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1097 navigationPattern->SetNavigationMode(NavigationMode::STACK);
1098 navigationPattern->OnModifyDone();
1099 navigationPattern->MarkNeedSyncWithJsStack();
1100 navigationPattern->SyncWithJsStackIfNeeded();
1101 ASSERT_EQ(stack->GetReplaceValue(), 0);
1102
1103 /**
1104 * @tc.steps: step2.replace page A in stack
1105 */
1106 RefPtr<FrameNode> replaceNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1107 stack->Remove();
1108 stack->Add("B", replaceNode);
1109 stack->UpdateReplaceValue(1);
1110 ASSERT_EQ(stack->GetReplaceValue(), 1);
1111 navigationPattern->OnModifyDone();
1112 navigationPattern->MarkNeedSyncWithJsStack();
1113 navigationPattern->SyncWithJsStackIfNeeded();
1114 ASSERT_EQ(stack->GetReplaceValue(), 0);
1115
1116 /**
1117 * @tc.steps: step3.pop page B
1118 */
1119 stack->Clear();
1120 navigationPattern->OnModifyDone();
1121 navigationPattern->MarkNeedSyncWithJsStack();
1122 navigationPattern->SyncWithJsStackIfNeeded();
1123 ASSERT_EQ(stack->GetReplaceValue(), 0);
1124 }
1125
1126 /**
1127 * @tc.name: NavDestinationTest001
1128 * @tc.desc: Test Dialog page visibility
1129 * @tc.type: FUNC
1130 */
1131 HWTEST_F(NavigationTestNg, NavDestinationDialogTest001, TestSize.Level1)
1132 {
1133 /**
1134 * @tc.steps: step1. create navigation stack
1135 */
1136 NavigationModelNG navigationModel;
1137 navigationModel.Create();
1138 auto navigationStack = AceType::MakeRefPtr<MockNavigationStack>();
1139 navigationModel.SetNavigationStack(navigationStack);
1140 RefPtr<NavigationGroupNode> navigationNode =
1141 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
1142 ASSERT_NE(navigationNode, nullptr);
1143
1144 /**
1145 * @tc.steps: step2.push page A to navDestination
1146 * @tc.expected: navbar is visible,page is visible
1147 */
1148 auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(V2::NAVDESTINATION_VIEW_ETS_TAG,
__anon57e04fdf2102() 1149 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1150 navDestination->SetNavDestinationMode(NavDestinationMode::DIALOG);
1151 navigationStack->Add("A", navDestination);
1152 auto pattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1153 EXPECT_NE(pattern, nullptr);
1154 pattern->SetNavigationMode(NavigationMode::STACK);
1155 pattern->OnModifyDone();
1156 pattern->MarkNeedSyncWithJsStack();
1157 pattern->SyncWithJsStackIfNeeded();
1158 PipelineContext::GetCurrentContext()->FlushBuildFinishCallbacks();
1159 auto destinationProperty = AceType::DynamicCast<NavDestinationLayoutProperty>(navDestination->GetLayoutProperty());
1160 EXPECT_TRUE(destinationProperty != nullptr);
1161 destinationProperty->UpdateHideTitleBar(true);
1162 EXPECT_EQ(destinationProperty->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::VISIBLE);
1163 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationNode->GetNavBarNode());
1164 EXPECT_NE(navBarNode, nullptr);
1165 auto navBarProperty = navBarNode->GetLayoutProperty();
1166 EXPECT_EQ(navBarProperty->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::VISIBLE);
1167
1168 /**
1169 * @tc.steps: step2. push navdestination page B
1170 * @tc.expected: page A is visible, page B is visible
1171 */
1172 auto navDestinationB = NavDestinationGroupNode::GetOrCreateGroupNode(V2::NAVDESTINATION_VIEW_ETS_TAG,
__anon57e04fdf2202() 1173 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1174 navDestinationB->SetNavDestinationMode(NavDestinationMode::DIALOG);
1175 auto navDestinationBPattern = navDestinationB->GetPattern<NavDestinationPattern>();
1176 EXPECT_NE(navDestinationBPattern, nullptr);
1177 navDestinationBPattern->SetNavigationNode(navigationNode);
1178 navigationStack->Add("B", navDestinationB);
1179 pattern->OnModifyDone();
1180 pattern->MarkNeedSyncWithJsStack();
1181 pattern->SyncWithJsStackIfNeeded();
1182 auto layoutPropertyB = AceType::DynamicCast<NavDestinationLayoutProperty>(navDestinationB->GetLayoutProperty());
1183 EXPECT_NE(layoutPropertyB, nullptr);
1184 layoutPropertyB->UpdateHideTitleBar(true);
1185 PipelineContext::GetCurrentContext()->FlushBuildFinishCallbacks();
1186 EXPECT_EQ(layoutPropertyB->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::VISIBLE);
1187 EXPECT_EQ(destinationProperty->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::VISIBLE);
1188
1189 /**
1190 * @tc.steps: step3. push standard page C
1191 * @tc.expected: page A is invisible, pageB is invisible, navBar is invisible, pageC is visible
1192 */
1193 auto navDestinationC = NavDestinationGroupNode::GetOrCreateGroupNode(V2::NAVDESTINATION_VIEW_ETS_TAG,
__anon57e04fdf2302() 1194 ElementRegister::GetInstance()->MakeUniqueId(), []() {
1195 return AceType::MakeRefPtr<NavDestinationPattern>();
1196 });
1197 auto navDestinationCPattern = navDestinationC->GetPattern<NavDestinationPattern>();
1198 EXPECT_NE(navDestinationBPattern, nullptr);
1199 navDestinationCPattern->SetNavigationNode(navigationNode);
1200 auto layoutPropertyC = AceType::DynamicCast<NavDestinationLayoutProperty>(navDestinationC->GetLayoutProperty());
1201 EXPECT_NE(layoutPropertyC, nullptr);
1202 layoutPropertyC->UpdateHideTitleBar(true);
1203 navigationStack->Add("C", navDestinationC);
1204 pattern->OnModifyDone();
1205 pattern->MarkNeedSyncWithJsStack();
1206 pattern->SyncWithJsStackIfNeeded();
1207 navigationNode->hideNodes_.emplace_back(std::make_pair(navDestination, false));
1208 PipelineContext::GetCurrentContext()->FlushBuildFinishCallbacks();
1209 EXPECT_EQ(layoutPropertyB->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::INVISIBLE);
1210 EXPECT_EQ(destinationProperty->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::INVISIBLE);
1211 EXPECT_EQ(layoutPropertyC->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::VISIBLE);
1212 }
1213
1214 /**
1215 * @tc.name: NavDestinationDialogTest003
1216 * @tc.desc: Test window lifecycle event
1217 * @tc.type: FUNC
1218 */
1219 HWTEST_F(NavigationTestNg, NavDestinationDialogTest003, TestSize.Level1)
1220 {
1221 /**
1222 * @tc.steps: step1.create navigation stack
1223 */
1224 NavigationModelNG navigationModel;
1225 navigationModel.Create();
1226 auto navigationStack = AceType::MakeRefPtr<MockNavigationStack>();
1227 navigationModel.SetNavigationStack(navigationStack);
1228 RefPtr<NavigationGroupNode> navigationNode =
1229 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
1230 ASSERT_NE(navigationNode, nullptr);
1231 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1232 ASSERT_NE(navigationPattern, nullptr);
1233
1234 /**
1235 * @tc.steps: step2. push standard page C
1236 */
1237 auto navDestinationC = NavDestinationGroupNode::GetOrCreateGroupNode(V2::NAVDESTINATION_VIEW_ETS_TAG,
__anon57e04fdf2402() 1238 ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1239 navigationStack->Add("C", navDestinationC);
1240 RefPtr<GeometryNode> geometryNode = AceType::MakeRefPtr<GeometryNode>();
1241 ASSERT_NE(geometryNode, nullptr);
1242 auto layoutWrapper =
1243 AceType::MakeRefPtr<LayoutWrapperNode>(navigationNode, geometryNode, navigationNode->GetLayoutProperty());
1244 ASSERT_NE(layoutWrapper, nullptr);
1245 DirtySwapConfig config;
1246 config.skipMeasure = true;
1247 config.skipLayout = true;
1248 navigationPattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config);
1249 auto layoutPropertyC = navDestinationC->GetLayoutProperty();
1250 EXPECT_NE(layoutPropertyC, nullptr);
1251 EXPECT_EQ(layoutPropertyC->GetVisibilityValue(VisibleType::VISIBLE), VisibleType::VISIBLE);
1252 }
1253
1254 /**
1255 * @tc.name: NavigationSetStackTest001
1256 * @tc.desc: Test setting of NavigationStack
1257 * @tc.type: FUNC
1258 */
1259 HWTEST_F(NavigationTestNg, NavigationSetStackTest001, TestSize.Level1)
1260 {
1261 /**
1262 * @tc.steps: step1. create navigation
1263 */
1264 NavigationModelNG navigationModel;
1265 navigationModel.Create();
1266
1267 int numOfCreatorCall = 0;
1268 int numOfUpdaterCall = 0;
1269 RefPtr<MockNavigationStack> stack;
__anon57e04fdf2502() 1270 auto stackCreator = [&numOfCreatorCall, &stack]() -> RefPtr<MockNavigationStack> {
1271 numOfCreatorCall++;
1272 stack = AceType::MakeRefPtr<MockNavigationStack>();
1273 return stack;
1274 };
__anon57e04fdf2602(RefPtr<NG::NavigationStack> stack) 1275 auto stackUpdater = [&numOfUpdaterCall, &navigationModel](RefPtr<NG::NavigationStack> stack) {
1276 numOfUpdaterCall++;
1277 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1278 ASSERT_NE(mockStack, nullptr);
1279 };
1280
1281 /**
1282 * @tc.steps: step1. set stack's creator and updater
1283 * @tc.expected: check number of function calls
1284 */
1285 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1286 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1287 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1288 ASSERT_NE(stack, nullptr);
1289 ASSERT_NE(stack->GetOnStateChangedCallback(), nullptr);
1290 EXPECT_EQ(numOfCreatorCall, 1);
1291 EXPECT_EQ(numOfUpdaterCall, 3);
1292 }
1293
1294 /**
1295 * @tc.name: NavigationNewStackTest001
1296 * @tc.desc: Test stack operation of Navigation
1297 * @tc.type: FUNC
1298 */
1299 HWTEST_F(NavigationTestNg, NavigationNewStackTest001, TestSize.Level1)
1300 {
1301 /**
1302 * @tc.steps: step1. create navigation, set NavigationStack
1303 */
1304 NavigationModelNG navigationModel;
1305 navigationModel.Create();
__anon57e04fdf2702() 1306 auto stackCreator = []() -> RefPtr<MockNavigationStack> {
1307 return AceType::MakeRefPtr<MockNavigationStack>();
1308 };
__anon57e04fdf2802(RefPtr<NG::NavigationStack> stack) 1309 auto stackUpdater = [&navigationModel](RefPtr<NG::NavigationStack> stack) {
1310 navigationModel.SetNavigationStackProvided(false);
1311 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1312 ASSERT_NE(mockStack, nullptr);
1313 };
1314 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1315
1316 /**
1317 * @tc.steps: step2. get onStateChangedCallback
1318 * @tc.expected: check if callback has been setted.
1319 */
1320 RefPtr<NavigationGroupNode> navigationNode =
1321 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->Finish());
1322 ASSERT_NE(navigationNode, nullptr);
1323 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1324 ASSERT_NE(navigationPattern, nullptr);
1325 EXPECT_FALSE(navigationPattern->GetNavigationStackProvided());
1326 auto stack = navigationPattern->GetNavigationStack();
1327 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1328 ASSERT_NE(mockStack, nullptr);
1329 auto stateChangedCallback = mockStack->GetOnStateChangedCallback();
1330 ASSERT_NE(stateChangedCallback, nullptr);
1331
1332 /**
1333 * @tc.steps: step2.add page A
1334 */
1335 RefPtr<FrameNode> frameNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1336 mockStack->Add("A", frameNode);
1337 ASSERT_FALSE(navigationPattern->NeedSyncWithJsStackMarked());
1338 stateChangedCallback();
1339 ASSERT_TRUE(navigationPattern->NeedSyncWithJsStackMarked());
1340 MockPipelineContext::GetCurrent()->FlushBuildFinishCallbacks();
1341 ASSERT_FALSE(navigationPattern->NeedSyncWithJsStackMarked());
1342 ASSERT_EQ(mockStack->Size(), 1);
1343
1344 /**
1345 * @tc.steps: step3. replace pageA
1346 */
1347 RefPtr<FrameNode> replaceNode = FrameNode::CreateFrameNode("temp", 245, AceType::MakeRefPtr<ButtonPattern>());
1348 mockStack->Remove();
1349 mockStack->Add("B", replaceNode);
1350 ASSERT_FALSE(navigationPattern->NeedSyncWithJsStackMarked());
1351 stateChangedCallback();
1352 ASSERT_TRUE(navigationPattern->NeedSyncWithJsStackMarked());
1353 MockPipelineContext::GetCurrent()->FlushBuildFinishCallbacks();
1354 ASSERT_FALSE(navigationPattern->NeedSyncWithJsStackMarked());
1355 ASSERT_EQ(mockStack->Size(), 1);
1356
1357 /**
1358 * @tc.steps: step4. push pageC
1359 */
1360 mockStack->Add("C", frameNode);
1361 ASSERT_FALSE(navigationPattern->NeedSyncWithJsStackMarked());
1362 stateChangedCallback();
1363 ASSERT_TRUE(navigationPattern->NeedSyncWithJsStackMarked());
1364 MockPipelineContext::GetCurrent()->FlushBuildFinishCallbacks();
1365 ASSERT_FALSE(navigationPattern->NeedSyncWithJsStackMarked());
1366 ASSERT_EQ(mockStack->Size(), 2);
1367 }
1368
1369 /**
1370 * @tc.name: NestedNavigationTest001
1371 * @tc.desc: Test case of nested Navigation
1372 * @tc.type: FUNC
1373 */
1374 HWTEST_F(NavigationTestNg, NestedNavigationTest001, TestSize.Level1)
1375 {
1376 /**
1377 * @tc.steps: step1. create NavigationStack, setup mock function
1378 */
1379
1380 auto context = MockPipelineContext::GetCurrent();
1381 ASSERT_NE(context, nullptr);
1382 ScopedViewStackProcessor scopedViewStackProcessor;
1383 auto outerStack = AceType::MakeRefPtr<MockNavigationStack>();
1384 auto innerStack = AceType::MakeRefPtr<MockNavigationStack>();
1385 EXPECT_CALL(*outerStack, OnAttachToParent(_)).Times(0);
1386 EXPECT_CALL(*innerStack, OnAttachToParent(_)).Times(1);
1387
1388 /**
1389 * @tc.steps: step1. create outer navigation and set stack
1390 */
1391 NavigationModelNG navigationModel;
1392 navigationModel.Create();
1393 navigationModel.SetNavigationStackWithCreatorAndUpdater(
__anon57e04fdf2902() 1394 [&outerStack]() -> RefPtr<MockNavigationStack> {
1395 return outerStack;
1396 }, [](RefPtr<NG::NavigationStack> stack) {
1397 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1398 ASSERT_NE(mockStack, nullptr);
1399 });
1400 auto groupNode = AceType::DynamicCast<NavigationGroupNode>(
1401 ViewStackProcessor::GetInstance()->GetMainElementNode());
1402 ASSERT_NE(groupNode, nullptr);
1403 groupNode->AttachToMainTree(true, AceType::RawPtr(context));
1404
1405 /**
1406 * @tc.steps: step2. create inner navigation and set stack
1407 */
1408 navigationModel.Create();
1409 navigationModel.SetNavigationStackWithCreatorAndUpdater(
__anon57e04fdf2b02() 1410 [&innerStack]() -> RefPtr<MockNavigationStack> {
1411 return innerStack;
1412 }, [](RefPtr<NG::NavigationStack> stack) {
1413 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1414 ASSERT_NE(mockStack, nullptr);
1415 });
1416
1417 /**
1418 * @tc.steps: step3. attach navigation to main tree
1419 * @tc.expected: check number of NavigationStack's OnAttachToParent function calls
1420 */
1421 ViewStackProcessor::GetInstance()->Pop();
1422 }
1423
1424 /*
1425 * @tc.name: NavigationInterceptionTest001
1426 * @tc.desc: Test navigation interception
1427 * @tc.type: FUNC
1428 */
1429 HWTEST_F(NavigationTestNg, NavigationInterceptionTest001, TestSize.Level1)
1430 {
1431 /**
1432 * @tc.steps: step1. create navigation, set NavigationStack
1433 */
1434 NavigationModelNG navigationModel;
1435 navigationModel.Create();
__anon57e04fdf2d02() 1436 auto stackCreator = []() -> RefPtr<MockNavigationStack> {
1437 return AceType::MakeRefPtr<MockNavigationStack>();
1438 };
__anon57e04fdf2e02(RefPtr<NG::NavigationStack> stack) 1439 auto stackUpdater = [&navigationModel](RefPtr<NG::NavigationStack> stack) {
1440 navigationModel.SetNavigationStackProvided(false);
1441 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1442 ASSERT_NE(mockStack, nullptr);
1443 };
1444 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1445
1446 /**
1447 * @tc.steps: step2.set navigation before and after interception during destination transition
1448 */
1449 auto navigationNode = AceType::DynamicCast<NavigationGroupNode>(
1450 ViewStackProcessor::GetInstance()->GetMainElementNode());
1451 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1452 EXPECT_NE(navigationPattern, nullptr);
1453 auto mockStack = AceType::DynamicCast<MockNavigationStack>(navigationPattern->GetNavigationStack());
1454 EXPECT_NE(mockStack, nullptr);
1455 mockStack->SetInterceptionBeforeCallback([stack = WeakPtr<MockNavigationStack>(mockStack)]
1456 (const RefPtr<NavDestinationContext>& from,
__anon57e04fdf2f02(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1457 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1458 ASSERT_EQ(from, nullptr);
1459 ASSERT_NE(to, nullptr);
1460 auto info = to->GetNavPathInfo();
1461 ASSERT_NE(info, nullptr);
1462 ASSERT_EQ(info->GetName(), "A");
1463 ASSERT_EQ(operation, NavigationOperation::PUSH);
1464 ASSERT_EQ(isAnimated, true);
1465 auto navigationStack = stack.Upgrade();
1466 ASSERT_NE(navigationStack, nullptr);
1467 navigationStack->Remove();
1468 RefPtr<FrameNode> frameNode = NavigationTestNg::CreateDestination("B");
1469 navigationStack->Add("B", frameNode);
1470 navigationStack->UpdateReplaceValue(true);
1471 navigationStack->UpdateAnimatedValue(true);
1472 });
1473
1474 mockStack->SetInterceptionAfterCallback([](const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3002(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1475 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1476 EXPECT_EQ(from, nullptr);
1477 EXPECT_NE(to, nullptr);
1478 auto info = to->GetNavPathInfo();
1479 ASSERT_NE(info->GetName(), "B");
1480 ASSERT_EQ(operation, NavigationOperation::REPLACE);
1481 ASSERT_EQ(isAnimated, false);
1482 });
1483
1484 /**
1485 * @tc.steps: step3. sync navigation stack
1486 * @tc.expected: step3. trigger navigation interception before and after callback
1487 */
1488 auto frameNode = NavigationTestNg::CreateDestination("A");
1489 mockStack->Add("A", frameNode);
1490 navigationPattern->MarkNeedSyncWithJsStack();
1491 MockPipelineContext::GetCurrent()->GetNavigationManager()->FireNavigationUpdateCallback();
1492 }
1493
1494 /**
1495 * @tc.name: NavigationInterceptionTest002
1496 * @tc.desc: Test navigation interception
1497 * @tc.type: FUNC
1498 */
1499 HWTEST_F(NavigationTestNg, NavigationInterceptionTest002, TestSize.Level1)
1500 {
1501 /**
1502 * @tc.steps: step1. create navigation, set NavigationStack
1503 */
1504 NavigationModelNG navigationModel;
1505 navigationModel.Create();
__anon57e04fdf3102() 1506 auto stackCreator = []() -> RefPtr<MockNavigationStack> {
1507 return AceType::MakeRefPtr<MockNavigationStack>();
1508 };
__anon57e04fdf3202(RefPtr<NG::NavigationStack> stack) 1509 auto stackUpdater = [&navigationModel](RefPtr<NG::NavigationStack> stack) {
1510 navigationModel.SetNavigationStackProvided(false);
1511 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1512 ASSERT_NE(mockStack, nullptr);
1513 };
1514 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1515
1516 /**
1517 * @tc.steps: step2. push A to navigation stack
1518 */
1519 auto navigationNode = AceType::DynamicCast<NavigationGroupNode>(
1520 ViewStackProcessor::GetInstance()->GetMainElementNode());
1521 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1522 EXPECT_NE(navigationPattern, nullptr);
1523 auto mockStack = AceType::DynamicCast<MockNavigationStack>(navigationPattern->GetNavigationStack());
1524 EXPECT_NE(mockStack, nullptr);
1525 auto frameNode = NavigationTestNg::CreateDestination("A");
1526 mockStack->Add("A", frameNode);
1527 navigationPattern->MarkNeedSyncWithJsStack();
1528 MockPipelineContext::GetCurrent()->GetNavigationManager()->FireNavigationUpdateCallback();
1529
1530 /**
1531 * @tc.steps: step2.set navigation before and after interception during destination transition
1532 */
1533 mockStack->SetInterceptionBeforeCallback([stack = WeakPtr<NavigationStack>(mockStack)](
1534 const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3302( const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1535 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1536 ASSERT_EQ(to, nullptr);
1537 ASSERT_NE(from, nullptr);
1538 auto info = from->GetNavPathInfo();
1539 ASSERT_EQ(info->name_, "A");
1540 ASSERT_EQ(operation, NavigationOperation::POP);
1541 ASSERT_EQ(isAnimated, true);
1542 auto navigationStack = stack.Upgrade();
1543 ASSERT_NE(navigationStack, nullptr);
1544 auto frameNode = NavigationTestNg::CreateDestination("B");
1545 ASSERT_NE(frameNode, nullptr);
1546 navigationStack->Add("B", frameNode);
1547 });
1548
1549 mockStack->SetInterceptionAfterCallback([](const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3402(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1550 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1551 EXPECT_NE(from, nullptr);
1552 EXPECT_NE(to, nullptr);
1553 auto fromInfo = from->GetNavPathInfo();
1554 ASSERT_NE(fromInfo, nullptr);
1555 ASSERT_EQ(fromInfo->GetName(), "A");
1556 auto toInfo = to->GetNavPathInfo();
1557 ASSERT_NE(toInfo, nullptr);
1558 ASSERT_EQ(toInfo->name_, "A");
1559 ASSERT_EQ(operation, NavigationOperation::PUSH);
1560 ASSERT_EQ(isAnimated, false);
1561 });
1562
1563 /**
1564 * @tc.steps: step3. sync navigation stack
1565 * @tc.expected: step3. trigger navigation interception before and after callback
1566 */
1567 mockStack->Remove();
1568 navigationPattern->MarkNeedSyncWithJsStack();
1569 MockPipelineContext::GetCurrent()->GetNavigationManager()->FireNavigationUpdateCallback();
1570 }
1571
1572 /**
1573 * @tc.name: NavigationInterceptionTest003
1574 * @tc.desc: Test navigation interception
1575 * @tc.type: FUNC
1576 */
1577 HWTEST_F(NavigationTestNg, NavigationInterceptionTest003, TestSize.Level1)
1578 {
1579 /**
1580 * @tc.steps: step1. create navigation, set NavigationStack
1581 */
1582 NavigationModelNG navigationModel;
1583 navigationModel.Create();
__anon57e04fdf3502() 1584 auto stackCreator = []() -> RefPtr<MockNavigationStack> {
1585 return AceType::MakeRefPtr<MockNavigationStack>();
1586 };
__anon57e04fdf3602(RefPtr<NG::NavigationStack> stack) 1587 auto stackUpdater = [&navigationModel](RefPtr<NG::NavigationStack> stack) {
1588 navigationModel.SetNavigationStackProvided(false);
1589 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1590 ASSERT_NE(mockStack, nullptr);
1591 };
1592 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1593
1594 /**
1595 * @tc.steps: step2. push A to navigation stack
1596 */
1597 auto navigationNode = AceType::DynamicCast<NavigationGroupNode>(
1598 ViewStackProcessor::GetInstance()->GetMainElementNode());
1599 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1600 EXPECT_NE(navigationPattern, nullptr);
1601 auto mockStack = AceType::DynamicCast<MockNavigationStack>(navigationPattern->GetNavigationStack());
1602 EXPECT_NE(mockStack, nullptr);
1603 auto frameNode = NavigationTestNg::CreateDestination("A");
1604 mockStack->Add("A", frameNode);
1605 mockStack->UpdateReplaceValue(true);
1606
1607 /**
1608 * @tc.steps: step2.set navigation before and after interception during destination transition
1609 */
1610 mockStack->SetInterceptionBeforeCallback([](const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3702(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1611 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1612 ASSERT_EQ(to, nullptr);
1613 ASSERT_NE(from, nullptr);
1614 auto info = from->GetNavPathInfo();
1615 ASSERT_EQ(info->name_, "A");
1616 ASSERT_EQ(operation, NavigationOperation::REPLACE);
1617 ASSERT_EQ(isAnimated, true);
1618 });
1619
1620 mockStack->SetInterceptionAfterCallback([](const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3802(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1621 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1622 ASSERT_EQ(to, nullptr);
1623 ASSERT_NE(from, nullptr);
1624 auto info = from->GetNavPathInfo();
1625 ASSERT_EQ(info->name_, "A");
1626 ASSERT_EQ(operation, NavigationOperation::REPLACE);
1627 ASSERT_EQ(isAnimated, true);
1628 });
1629
1630 /**
1631 * @tc.steps: step3. sync navigation stack.
1632 * @tc.expected: step3. trigger navigation before and after callback.
1633 */
1634 navigationPattern->MarkNeedSyncWithJsStack();
1635 MockPipelineContext::GetCurrent()->GetNavigationManager()->FireNavigationUpdateCallback();
1636 }
1637
1638 /**
1639 * @tc.name: NavigationInterceptionTest004
1640 * @tc.desc: Test navigation interception
1641 * @tc.type: FUNC
1642 */
1643 HWTEST_F(NavigationTestNg, NavigationInterceptionTest004, TestSize.Level1)
1644 {
1645 /**
1646 * @tc.steps: step1. create navigation, set NavigationStack
1647 */
1648 NavigationModelNG navigationModel;
1649 navigationModel.Create();
__anon57e04fdf3902() 1650 auto stackCreator = []() -> RefPtr<MockNavigationStack> {
1651 return AceType::MakeRefPtr<MockNavigationStack>();
1652 };
__anon57e04fdf3a02(RefPtr<NG::NavigationStack> stack) 1653 auto stackUpdater = [&navigationModel](RefPtr<NG::NavigationStack> stack) {
1654 navigationModel.SetNavigationStackProvided(false);
1655 auto mockStack = AceType::DynamicCast<MockNavigationStack>(stack);
1656 ASSERT_NE(mockStack, nullptr);
1657 };
1658 navigationModel.SetNavigationStackWithCreatorAndUpdater(stackCreator, stackUpdater);
1659
1660 /**
1661 * @tc.steps: step2.set navigation before and after interception during destination transition.
1662 * Remove top Destination during interception before callback.
1663 * @tc.expected: trigger before interception and not trigger after interception.
1664 */
1665 auto navigationNode = AceType::DynamicCast<NavigationGroupNode>(
1666 ViewStackProcessor::GetInstance()->GetMainElementNode());
1667 auto navigationPattern = AceType::DynamicCast<NavigationPattern>(navigationNode->GetPattern());
1668 EXPECT_NE(navigationPattern, nullptr);
1669 auto mockStack = AceType::DynamicCast<MockNavigationStack>(navigationPattern->GetNavigationStack());
1670 EXPECT_NE(mockStack, nullptr);
1671 mockStack->SetInterceptionBeforeCallback([stack = WeakPtr<NavigationStack>(mockStack)]
1672 (const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3b02(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1673 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1674 ASSERT_EQ(to, nullptr);
1675 ASSERT_NE(from, nullptr);
1676 auto info = from->GetNavPathInfo();
1677 ASSERT_EQ(info->name_, "A");
1678 ASSERT_EQ(operation, NavigationOperation::REPLACE);
1679 ASSERT_EQ(isAnimated, true);
1680 auto navigationStack = stack.Upgrade();
1681 EXPECT_NE(navigationStack, nullptr);
1682 navigationStack->Remove();
1683 });
1684
1685 uint32_t times = 0;
1686 mockStack->SetInterceptionAfterCallback([time = ×](const RefPtr<NavDestinationContext>& from,
__anon57e04fdf3c02(const RefPtr<NavDestinationContext>& from, const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) 1687 const RefPtr<NavDestinationContext>& to, NavigationOperation operation, bool isAnimated) {
1688 (*time)++;
1689 });
1690
1691 /**
1692 * @tc.steps: step3. push destination A and sync navigation stack.
1693 * @tc.expected: step3. don't trigger interception after callback.times is 0.
1694 */
1695 auto frameNode = NavigationTestNg::CreateDestination("A");
1696 mockStack->Add("A", frameNode);
1697 navigationPattern->MarkNeedSyncWithJsStack();
1698 MockPipelineContext::GetCurrent()->GetNavigationManager()->FireNavigationUpdateCallback();
1699 EXPECT_EQ(times, 0);
1700 }
1701
1702 /**
1703 * @tc.name: NavigationCommonTitleTest001
1704 * @tc.desc: Test Navigation CommonTitle.
1705 * @tc.type: FUNC
1706 */
1707 HWTEST_F(NavigationTestNg, NavigationCommonTitleTest001, TestSize.Level1)
1708 {
1709 MockPipelineContextGetTheme();
1710 NavigationModelNG navigationModel;
1711 navigationModel.Create();
1712 navigationModel.SetNavigationStack();
1713 navigationModel.SetTitle("Title", true);
1714 navigationModel.SetSubtitle("subTitle");
1715 auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
1716 ASSERT_NE(frameNode, nullptr);
1717 auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(frameNode);
1718 ASSERT_NE(navigationGroupNode, nullptr);
1719 auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
1720 ASSERT_NE(navBarNode, nullptr);
1721 }
1722
1723 /**
1724 * @tc.name: CreatePrimaryContentIfNeeded001
1725 * @tc.desc: Branch: if (!manager->IsForceSplitSupported()) { => true
1726 * @tc.type: FUNC
1727 */
1728 HWTEST_F(NavigationTestNg, CreatePrimaryContentIfNeeded001, TestSize.Level1)
1729 {
1730 MockPipelineContextGetTheme();
1731 auto context = PipelineContext::GetCurrentContext();
1732 ASSERT_NE(context, nullptr);
1733 auto manager = context->GetNavigationManager();
1734 ASSERT_NE(manager, nullptr);
1735 NavigationModelNG navigationModel;
1736 auto navNode = NavigationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf3d02() 1737 V2::NAVIGATION_VIEW_ETS_TAG, 1, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
1738 ASSERT_NE(navNode, nullptr);
1739 auto pattern = navNode->GetPattern<NavigationPattern>();
1740 ASSERT_NE(pattern, nullptr);
1741 auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1742 ASSERT_NE(navigationStack, nullptr);
1743 pattern->SetNavigationStack(navigationStack);
1744
1745 manager->isForceSplitSupported_ = false;
1746 ASSERT_TRUE(navigationModel.CreatePrimaryContentIfNeeded(navNode));
1747 }
1748
1749 /**
1750 * @tc.name: CreatePrimaryContentIfNeeded002
1751 * @tc.desc: Branch: if (!manager->IsForceSplitSupported()) { => false
1752 * if (navigationGroupNode->GetPrimaryContentNode()) { => true
1753 * @tc.type: FUNC
1754 */
1755 HWTEST_F(NavigationTestNg, CreatePrimaryContentIfNeeded002, TestSize.Level1)
1756 {
1757 MockPipelineContextGetTheme();
1758 auto context = PipelineContext::GetCurrentContext();
1759 ASSERT_NE(context, nullptr);
1760 auto manager = context->GetNavigationManager();
1761 ASSERT_NE(manager, nullptr);
1762 NavigationModelNG navigationModel;
1763 auto navNode = NavigationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf3e02() 1764 V2::NAVIGATION_VIEW_ETS_TAG, 1, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
1765 ASSERT_NE(navNode, nullptr);
1766 auto pattern = navNode->GetPattern<NavigationPattern>();
1767 ASSERT_NE(pattern, nullptr);
1768 auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1769 ASSERT_NE(navigationStack, nullptr);
1770 pattern->SetNavigationStack(navigationStack);
1771 auto contentNode = FrameNode::GetOrCreateFrameNode(
__anon57e04fdf3f02() 1772 V2::PRIMARY_CONTENT_NODE_ETS_TAG, 2, []() { return AceType::MakeRefPtr<NavigationContentPattern>(); });
1773 ASSERT_NE(contentNode, nullptr);
1774
1775 manager->isForceSplitSupported_ = true;
1776 navNode->primaryContentNode_ = contentNode;
1777 ASSERT_TRUE(navigationModel.CreatePrimaryContentIfNeeded(navNode));
1778 }
1779
1780 /**
1781 * @tc.name: CreatePrimaryContentIfNeeded003
1782 * @tc.desc: Branch: if (!manager->IsForceSplitSupported()) { => false
1783 * if (navigationGroupNode->GetPrimaryContentNode()) { => false
1784 * @tc.type: FUNC
1785 */
1786 HWTEST_F(NavigationTestNg, CreatePrimaryContentIfNeeded003, TestSize.Level1)
1787 {
1788 MockPipelineContextGetTheme();
1789 auto context = PipelineContext::GetCurrentContext();
1790 ASSERT_NE(context, nullptr);
1791 auto manager = context->GetNavigationManager();
1792 ASSERT_NE(manager, nullptr);
1793 NavigationModelNG navigationModel;
1794 auto navNode = NavigationGroupNode::GetOrCreateGroupNode(
__anon57e04fdf4002() 1795 V2::NAVIGATION_VIEW_ETS_TAG, 1, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
1796 ASSERT_NE(navNode, nullptr);
1797 auto pattern = navNode->GetPattern<NavigationPattern>();
1798 ASSERT_NE(pattern, nullptr);
1799 auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1800 ASSERT_NE(navigationStack, nullptr);
1801 pattern->SetNavigationStack(navigationStack);
1802
1803 manager->isForceSplitSupported_ = true;
1804 navNode->primaryContentNode_ = nullptr;
1805 ASSERT_TRUE(navigationModel.CreatePrimaryContentIfNeeded(navNode));
1806 }
1807
1808 /**
1809 * @tc.name: SizeCalculationSplit001
1810 * @tc.desc: Branch: if (pattern->IsForceSplitSuccess() && pattern->IsForceSplitUseNavBar()) { => true
1811 * @tc.type: FUNC
1812 */
1813 HWTEST_F(NavigationTestNg, SizeCalculationSplit001, TestSize.Level1)
1814 {
1815 NavigationModelNG model;
1816 model.Create();
1817 model.SetNavigationStack();
1818 auto navigation =
1819 AceType::DynamicCast<NavigationGroupNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
1820 ASSERT_NE(navigation, nullptr);
1821 auto pattern = navigation->GetPattern<NavigationPattern>();
1822 ASSERT_NE(pattern, nullptr);
1823 pattern->forceSplitSuccess_ = true;
1824 pattern->forceSplitUseNavBar_ = true;
1825
1826 const float navWidth = 400.0f;
1827 const float navHeight = 300.0f;
1828 const float dividerWidthInPx = DIVIDER_WIDTH.ConvertToPx();
1829 float halfWidth = (navWidth - dividerWidthInPx) / 2.0f;
1830
1831 auto algorithm = AceType::MakeRefPtr<NavigationLayoutAlgorithm>();
1832 auto property = AceType::MakeRefPtr<NavigationLayoutProperty>();
1833 property->layoutConstraint_ = LayoutConstraintF();
1834 algorithm->SizeCalculationSplit(navigation, property, SizeF(navWidth, navHeight));
1835
1836 EXPECT_TRUE(NearEqual(algorithm->navBarSize_.Width(), halfWidth));
1837 EXPECT_TRUE(NearEqual(algorithm->realNavBarWidth_, halfWidth));
1838 EXPECT_TRUE(NearEqual(algorithm->realContentWidth_, halfWidth));
1839 }
1840
1841 /**
1842 * @tc.name: SetEnableSwipeBackTest001
1843 * @tc.desc: Branch: if (device == wearable && !enableSwipeBack) = true
1844 * Expected: onBackPress will return true
1845 * @tc.type: FUNC
1846 */
1847 HWTEST_F(NavigationTestNg, SetEnableSwipeBackTest001, TestSize.Level1)
1848 {
1849 /**
1850 * @tc.steps: step1. get pipeline and mock SystemProperties::deviceType_
1851 */
1852 auto preDeviceType_ = SystemProperties::deviceType_;
1853 SystemProperties::deviceType_ = DeviceType::WEARABLE;
1854 auto context = MockPipelineContext::GetCurrent();
1855 ASSERT_NE(context, nullptr);
1856 ASSERT_TRUE(context->enableSwipeBack_);
1857 /**
1858 * @tc.steps: step2. call SetEnableSwipeBack and do test. then reset mocked properties.
1859 */
1860 context->SetEnableSwipeBack(false);
1861 ASSERT_FALSE(context->enableSwipeBack_);
1862 ASSERT_TRUE(context->OnBackPressed());
1863 context->SetEnableSwipeBack(true);
1864 ASSERT_TRUE(context->enableSwipeBack_);
1865 SystemProperties::deviceType_ = preDeviceType_;
1866 }
1867 } // namespace OHOS::Ace::NG
1868