• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = &times](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