1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cstddef>
17 #include <list>
18 #include <optional>
19 #include <string>
20 
21 #include "gtest/gtest.h"
22 #define private public
23 #define protected public
24 
25 #include "test/mock/base/mock_pixel_map.h"
26 #include "core/components_ng/pattern/button/button_pattern.h"
27 #include "core/components_ng/pattern/navigation/bar_item_layout_algorithm.h"
28 #include "core/components_ng/pattern/navigation/bar_item_pattern.h"
29 #include "core/components_ng/pattern/navigation/navigation_content_pattern.h"
30 #include "core/components_ng/pattern/navigation/navigation_pattern.h"
31 #include "core/components_ng/pattern/navigation/title_bar_pattern.h"
32 #include "core/components_ng/pattern/navrouter/navdestination_pattern.h"
33 #include "core/components_ng/pattern/navrouter/navrouter_event_hub.h"
34 #include "core/components_ng/pattern/navrouter/navrouter_group_node.h"
35 #include "core/components_ng/pattern/navrouter/navrouter_model.h"
36 #include "core/components_ng/pattern/navrouter/navrouter_model_ng.h"
37 #include "core/components_ng/pattern/text/text_pattern.h"
38 #include "test/mock/core/common/mock_theme_manager.h"
39 #include "test/mock/core/pipeline/mock_pipeline_context.h"
40 
41 using namespace testing;
42 using namespace testing::ext;
43 namespace OHOS::Ace::NG {
44 
45 class NavrouterModelTestNg : public testing::Test {
46 public:
47     static void SetUpTestCase();
48     static void TearDownTestCase();
49     void SetUp() override;
50     void TearDown() override;
51 };
52 
SetUpTestCase()53 void NavrouterModelTestNg::SetUpTestCase()
54 {
55     MockPipelineContext::SetUp();
56 }
TearDownTestCase()57 void NavrouterModelTestNg::TearDownTestCase()
58 {
59     MockPipelineContext::TearDown();
60 }
61 
SetUp()62 void NavrouterModelTestNg::SetUp() {}
TearDown()63 void NavrouterModelTestNg::TearDown() {}
64 
65 /**
66  * @tc.name: NavrouterTestNg0017
67  * @tc.desc: Test NavRouterGroupNode::SetBackButtonEvent.
68  * @tc.type: FUNC
69  */
70 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0017, TestSize.Level1)
71 {
72     /**
73      * @tc.steps: step1. create navRouterGroupNode.
74      */
75     NavRouterModelNG model;
76     model.Create();
77     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
78     ASSERT_NE(frameNode, nullptr);
79     auto navRouterGroupNode = AceType::DynamicCast<NavRouterGroupNode>(frameNode);
80     ASSERT_NE(navRouterGroupNode, nullptr);
81     navRouterGroupNode->OnAttachToMainTree(false);
82     ASSERT_EQ(navRouterGroupNode->GetParent(), nullptr);
83     auto parent = NavigationGroupNode::GetOrCreateGroupNode(
__anon72a883910102() 84         "parentNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
85     navRouterGroupNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
86     auto navDestinationNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910202() 87         "navDestinationNode", 22, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
88     navRouterGroupNode->navDestinationNode_ = navDestinationNode;
89     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883910302() 90         "titleBarNode", 33, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
91     navDestinationNode->titleBarNode_ = titleBarNode;
92     auto buttonNode = FrameNode::CreateFrameNode("buttonNode", 44, AceType::MakeRefPtr<ButtonPattern>());
93     titleBarNode->backButton_ = buttonNode;
94     ASSERT_NE(buttonNode->GetEventHub<EventHub>(), nullptr);
95     auto eventHub = AceType::MakeRefPtr<NavDestinationEventHub>();
96     navDestinationNode->eventHub_ = eventHub;
__anon72a883910402() 97     auto onBack = []() { return true; };
98     eventHub->onBackPressedEvent_ = onBack;
99     auto layoutProperty = AceType::MakeRefPtr<NavigationLayoutProperty>();
100     parent->layoutProperty_ = layoutProperty;
101 
102     auto stack = AceType::MakeRefPtr<NavigationStack>();
103     auto preNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910502() 104         V2::NAVDESTINATION_VIEW_ETS_TAG, 55, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
105     std::pair<std::string, RefPtr<UINode>> p("test", preNavDestination);
106     stack->navPathList_.push_back(p);
107     parent->GetPattern<NavigationPattern>()->navigationStack_ = stack;
108     navRouterGroupNode->OnAttachToMainTree(false);
109 }
110 
111 /**
112  * @tc.name: NavrouterTestNg0021
113  * @tc.desc: Test NavigationPattern::TransitionWithAnimation with pop.
114  * @tc.type: FUNC
115  */
116 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0021, TestSize.Level1)
117 {
118     /**
119      * @tc.steps: step1. create navRouterGroupNode.
120      */
121     NavRouterModelNG model;
122     model.Create();
123     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
124     ASSERT_NE(frameNode, nullptr);
125     auto navRouterGroupNode = AceType::DynamicCast<NavRouterGroupNode>(frameNode);
126     ASSERT_NE(navRouterGroupNode, nullptr);
127     auto parent = NavigationGroupNode::GetOrCreateGroupNode(
__anon72a883910602() 128         "parentNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
129     auto navContentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910702() 130         "navContentNode", 12, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
131     parent->contentNode_ = navContentNode;
132     auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910802() 133         "NavDestination", 22, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
134     auto contentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910902() 135         "contentNode", 23, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
136     navDestination->contentNode_ = contentNode;
137     auto preNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910a02() 138         V2::NAVDESTINATION_VIEW_ETS_TAG, 33, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
139     auto preContentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883910b02() 140         "preContentNode", 34, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
141     navDestination->contentNode_ = preContentNode;
142     auto preDestinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883910c02() 143         "titleBarNode", 44, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
144     auto destinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883910d02() 145         "titleBarNode", 55, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
146     auto backButton = FrameNode::CreateFrameNode("BackButton", 66, AceType::MakeRefPtr<ButtonPattern>());
147 
148     preNavDestination->titleBarNode_ = preDestinationTitleBarNode;
149     navDestination->titleBarNode_ = destinationTitleBarNode;
150 
151     auto pattern = parent->GetPattern<NavigationPattern>();
152     auto stack = AceType::MakeRefPtr<NavigationStack>();
153     pattern->navigationStack_ = stack;
154     std::pair<std::string, RefPtr<UINode>> p1("23", preNavDestination);
155     stack->navPathList_.push_back(p1);
156     std::pair<std::string, RefPtr<UINode>> p2("22", navDestination);
157     stack->navPathList_.push_back(p2);
158 
159     parent->isOnAnimation_ = true;
__anon72a883910e02(GestureEvent&) 160     auto onBackButtonEvent = [](GestureEvent&) -> bool {return true;};
161     navDestination->backButtonEvent_ = onBackButtonEvent;
162     bool isEntry = false;
163     parent->CheckCanHandleBack(isEntry);
164     bool isPop = true;
165     EXPECT_TRUE(parent->isOnAnimation_);
166     pattern->TransitionWithAnimation(preNavDestination, navDestination, isPop);
167 }
168 
169 /**
170  * @tc.name: NavrouterTestNg0022
171  * @tc.desc: Test NavigationPattern::TransitionWithAnimation with push.
172  * @tc.type: FUNC
173  */
174 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0022, TestSize.Level1)
175 {
176     /**
177      * @tc.steps: step1. create navRouterGroupNode.
178      */
179     NavRouterModelNG model;
180     model.Create();
181     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
182     ASSERT_NE(frameNode, nullptr);
183     auto navRouterGroupNode = AceType::DynamicCast<NavRouterGroupNode>(frameNode);
184     ASSERT_NE(navRouterGroupNode, nullptr);
185     auto parent = NavigationGroupNode::GetOrCreateGroupNode(
__anon72a883910f02() 186         "parentNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
187     auto preNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911002() 188         "NavDestination", 22, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
189     auto preContentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911102() 190         "preContentNode", 23, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
191     preNavDestination->contentNode_ = preContentNode;
192     auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911202() 193         V2::NAVDESTINATION_VIEW_ETS_TAG, 33, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
194     auto contentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911302() 195         "contentNode", 34, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
196     navDestination->contentNode_ = contentNode;
197     auto preDestinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883911402() 198         "titleBarNode", 44, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
199     auto destinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883911502() 200         "titleBarNode", 55, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
201     auto backButton = FrameNode::CreateFrameNode("BackButton", 66, AceType::MakeRefPtr<ButtonPattern>());
202 
203     preNavDestination->titleBarNode_ = preDestinationTitleBarNode;
204     navDestination->titleBarNode_ = destinationTitleBarNode;
205 
206     auto pattern = parent->GetPattern<NavigationPattern>();
207     auto stack = AceType::MakeRefPtr<NavigationStack>();
208     pattern->navigationStack_ = stack;
209     std::pair<std::string, RefPtr<UINode>> p1("23", preNavDestination);
210     stack->navPathList_.push_back(p1);
211     parent->isOnAnimation_ = true;
212     std::pair<std::string, RefPtr<UINode>> p2("22", navDestination);
213     stack->navPathList_.push_back(p2);
214     bool isPop = false;
215     EXPECT_TRUE(parent->isOnAnimation_);
216     pattern->TransitionWithAnimation(preNavDestination, navDestination, isPop);
217 }
218 
219 /**
220  * @tc.name: NavrouterTestNg0023
221  * @tc.desc: Test NavigationGroupNode::AddChildToGroup.
222  * @tc.type: FUNC
223  */
224 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0023, TestSize.Level1)
225 {
226     /**
227      * @tc.steps: step1. create navRouterGroupNode.
228      */
229     NavRouterModelNG model;
230     model.Create();
231     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
232     ASSERT_NE(frameNode, nullptr);
233     auto navRouterGroupNode = AceType::DynamicCast<NavRouterGroupNode>(frameNode);
234     ASSERT_NE(navRouterGroupNode, nullptr);
235     auto parent = NavigationGroupNode::GetOrCreateGroupNode(
__anon72a883911602() 236         "parentNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
237     auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
238     parent->GetPattern<NavigationPattern>()->SetNavigationStack(std::move(navigationStack));
239     auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911702() 240         "NavDestination", 22, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
241     auto contentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911802() 242         "contentNode", 23, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
243     navDestination->contentNode_ = contentNode;
244     auto preNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911902() 245         V2::NAVDESTINATION_VIEW_ETS_TAG, 33, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
246     auto preContentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911a02() 247         "preContentNode", 34, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
248     preNavDestination->contentNode_ = preContentNode;
249     auto navBar =
__anon72a883911b02() 250         NavBarNode::GetOrCreateNavBarNode("navBarNode", 33, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
251     auto navContentNode = FrameNode::CreateFrameNode("BackButton", 44, AceType::MakeRefPtr<ButtonPattern>());
252     parent->contentNode_ = navContentNode;
253     parent->navBarNode_ = navBar;
254     navRouterGroupNode->navDestinationNode_ = navDestination;
255 
256     auto preDestinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883911c02() 257         "titleBarNode", 55, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
258     auto destinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883911d02() 259         "titleBarNode", 66, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
260     auto backButton = FrameNode::CreateFrameNode("BackButton", 77, AceType::MakeRefPtr<ButtonPattern>());
261 
262     ASSERT_EQ(navBar->contentNode_, nullptr);
263     parent->AddChildToGroup(backButton);
264     ASSERT_NE(navBar->contentNode_, nullptr);
265     parent->AddChildToGroup(backButton);
266     ASSERT_NE(navBar->contentNode_, nullptr);
267 }
268 
269 /**
270  * @tc.name: NavrouterTestNg0024
271  * @tc.desc: Test NavigationGroupNode::UpdateNavDestinationNodeWithoutMarkDirty.
272  * @tc.type: FUNC
273  */
274 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0024, TestSize.Level1)
275 {
276     /**
277      * @tc.steps: step1. create navRouterGroupNode.
278      */
279     auto navigation = NavigationGroupNode::GetOrCreateGroupNode(
__anon72a883911e02() 280         "parentNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
281     auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883911f02() 282         "NavDestination", 22, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
283     auto contentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912002() 284         "contentNode", 23, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
285     navDestination->contentNode_ = contentNode;
286     auto preNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912102() 287         V2::NAVDESTINATION_VIEW_ETS_TAG, 33, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
288     auto preContentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912202() 289         "preContentNode", 34, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
290     preNavDestination->contentNode_ = preContentNode;
291     auto navBar =
__anon72a883912302() 292         NavBarNode::GetOrCreateNavBarNode("navBarNode", 33, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
293 
294     auto preDestinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883912402() 295         "titleBarNode", 55, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
296     auto destinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883912502() 297         "titleBarNode", 66, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
298     auto backButton = FrameNode::CreateFrameNode("BackButton", 77, AceType::MakeRefPtr<ButtonPattern>());
299 
300     auto pattern = navigation->GetPattern<NavigationPattern>();
301 
302     auto stack = AceType::MakeRefPtr<NavigationStack>();
303     pattern->navigationStack_ = stack;
304     navigation->navBarNode_ = nullptr;
305     navigation->UpdateNavDestinationNodeWithoutMarkDirty(nullptr);
306     EXPECT_TRUE(stack->navPathList_.empty());
307     ASSERT_EQ(navigation->navBarNode_, nullptr);
308 
309     std::pair<std::string, RefPtr<UINode>> p("test", preNavDestination);
310     stack->navPathList_.push_back(p);
311 
312     auto preTopNavPath = pattern->navigationStack_->GetPreTopNavPath();
313     EXPECT_EQ(preTopNavPath->second, nullptr);
314     navigation->UpdateNavDestinationNodeWithoutMarkDirty(nullptr);
315     EXPECT_EQ(stack->navPathList_.size(), 1);
316     ASSERT_EQ(navigation->navBarNode_, nullptr);
317 }
318 
319 /**
320  * @tc.name: NavrouterTestNg0025
321  * @tc.desc: Test NavigationGroupNode::SetBackButtonEvent.
322  * @tc.type: FUNC
323  */
324 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0025, TestSize.Level1)
325 {
326     /**
327      * @tc.steps: step1. create navigation.
328      */
329     auto navigation = NavigationGroupNode::GetOrCreateGroupNode(
__anon72a883912602() 330         "parentNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
331     auto navigationContentNode = FrameNode::GetOrCreateFrameNode(V2::NAVIGATION_CONTENT_ETS_TAG, 12,
__anon72a883912702() 332         []() { return AceType::MakeRefPtr<NavigationContentPattern>(); });
333     navigation->SetContentNode(navigationContentNode);
334     auto navDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912802() 335         "NavDestination", 22, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
336     auto contentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912902() 337         "contentNode", 23, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
338     navDestination->contentNode_ = contentNode;
339     auto preNavDestination = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912a02() 340         "preNavDestination", 33, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
341     auto preContentNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883912b02() 342         "preContentNode", 34, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
343     preNavDestination->contentNode_ = preContentNode;
344     auto navBar =
__anon72a883912c02() 345         NavBarNode::GetOrCreateNavBarNode("navBarNode", 33, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
346     auto preDestinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883912d02() 347         "titleBarNode", 55, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
348     auto destinationTitleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883912e02() 349         "titleBarNode", 66, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
350     auto backButton = FrameNode::CreateFrameNode("BackButton", 77, AceType::MakeRefPtr<ButtonPattern>());
351     auto eventHub = AceType::MakeRefPtr<EventHub>();
352     auto pattern = navigation->GetPattern<NavigationPattern>();
353     /**
354      * @tc.steps: step2. call navigation->SetBackButtonEvent.
355      */
356     navigation->navBarNode_ = nullptr;
357     navDestination->titleBarNode_ = destinationTitleBarNode;
358     destinationTitleBarNode->backButton_ = backButton;
359     backButton->eventHub_ = eventHub;
360     navDestination->eventHub_ = AceType::MakeRefPtr<NavDestinationEventHub>();
361     navDestination->contentNode_ = nullptr;
362     navigation->SetBackButtonEvent(navDestination);
363     pattern->navigationMode_ = NavigationMode::STACK;
364     auto stack = AceType::MakeRefPtr<NavigationStack>();
365     std::pair<std::string, RefPtr<UINode>> p("test0", preNavDestination);
366     std::pair<std::string, RefPtr<UINode>> p2("test", preNavDestination);
367     stack->navPathList_.push_back(p);
368     stack->navPathList_.push_back(p2);
369     pattern->navigationStack_ = stack;
370     ASSERT_EQ(pattern->navigationStack_->navPathList_.size(), 2);
371     ASSERT_NE(AceType::DynamicCast<NavDestinationGroupNode>(pattern->GetPreNavDestination("test", preNavDestination)),
372         nullptr);
373     navDestination->GetPattern<NavDestinationPattern>()->customNode_ = preNavDestination;
374     GestureEvent event;
375     navDestination->backButtonEvent_(event);
__anon72a883912f02() 376     auto onBack = []() { return true; };
377     navDestination->GetEventHub<NavDestinationEventHub>()->onBackPressedEvent_ = onBack;
378     navDestination->contentNode_ = contentNode;
379     eventHub->gestureEventHub_ = AceType::MakeRefPtr<GestureEventHub>(AceType::WeakClaim(AceType::RawPtr(eventHub)));
380     navDestination->GetPattern<NavDestinationPattern>()->shallowBuilder_ = AceType::MakeRefPtr<ShallowBuilder>(
__anon72a883913002() 381         []() { return FrameNode::CreateFrameNode("BackButton", 123, AceType::MakeRefPtr<ButtonPattern>()); });
382     navDestination->GetPattern<NavDestinationPattern>()->customNode_ = preNavDestination;
383     navigation->SetBackButtonEvent(navDestination);
384     navDestination->backButtonEvent_(event);
385     EXPECT_TRUE(navDestination->GetEventHub<NavDestinationEventHub>()->onBackPressedEvent_());
386 }
387 
388 /**
389  * @tc.name: NavrouterTestNg0027
390  * @tc.desc: Test BarItemLayoutAlgorithm::Layout.
391  * @tc.type: FUNC
392  */
393 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0027, TestSize.Level1)
394 {
395     auto algorithm = AceType::MakeRefPtr<BarItemLayoutAlgorithm>();
396     auto barItem = BarItemNode::GetOrCreateBarItemNode(
__anon72a883913102() 397         V2::BAR_ITEM_ETS_TAG, 11, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
398     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
399     auto layoutProperty = AceType::MakeRefPtr<LayoutProperty>();
400     auto textNode = FrameNode::CreateFrameNode("textNode", 22, AceType::MakeRefPtr<TextPattern>());
401 
402     auto layoutWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
403         AceType::WeakClaim(AceType::RawPtr(barItem)), geometryNode, layoutProperty);
404 
405     algorithm->Layout(AceType::RawPtr(layoutWrapper));
406     ASSERT_EQ(barItem->text_, nullptr);
407     barItem->text_ = textNode;
408     algorithm->Layout(AceType::RawPtr(layoutWrapper));
409     ASSERT_NE(barItem->text_, nullptr);
410 }
411 
412 /**
413  * @tc.name: NavrouterTestNg0028
414  * @tc.desc: Test TitleBarNode::FastPreviewUpdateChild.
415  * @tc.type: FUNC
416  */
417 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0028, TestSize.Level1)
418 {
419     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883913202() 420         "titleBarNode", 55, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
421     auto menu = FrameNode::CreateFrameNode("menu", 22, AceType::MakeRefPtr<TextPattern>());
422     auto newChild = FrameNode::CreateFrameNode("newChild", 33, AceType::MakeRefPtr<TextPattern>());
423 
424     ASSERT_TRUE(titleBarNode->children_.empty());
425     titleBarNode->FastPreviewUpdateChild(0, newChild);
426     ASSERT_FALSE(titleBarNode->children_.empty());
427     titleBarNode->FastPreviewUpdateChild(1, menu);
428     ASSERT_EQ(titleBarNode->children_.size(), 2);
429     titleBarNode->FastPreviewUpdateChild(2, newChild);
430     ASSERT_EQ(titleBarNode->children_.size(), 2);
431 }
432 
433 /**
434  * @tc.name: NavrouterTestNg0029
435  * @tc.desc: Test NavBarNode::AddChildToGroup && GetBarItemsString.
436  * @tc.type: FUNC
437  */
438 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0029, TestSize.Level1)
439 {
440     /**
441      * @tc.steps: step1. create navBar newChild then call AddChildToGroup.
442      */
443     auto navBar =
__anon72a883913302() 444         NavBarNode::GetOrCreateNavBarNode("navBarNode", 11, []() { return AceType::MakeRefPtr<NavigationPattern>(); });
445     auto newChild = FrameNode::CreateFrameNode("newChild", 22, AceType::MakeRefPtr<TextPattern>());
446 
447     ASSERT_EQ(navBar->contentNode_, nullptr);
448     navBar->AddChildToGroup(newChild);
449     ASSERT_NE(navBar->contentNode_, nullptr);
450     navBar->AddChildToGroup(newChild);
451     ASSERT_EQ(navBar->contentNode_->children_.size(), 1);
452 
453     /**
454      * @tc.steps: step2. create menu then construct navBar->menu_->children_.
455      */
456     auto menu = FrameNode::CreateFrameNode("menu", 33, AceType::MakeRefPtr<TextPattern>());
457     auto child1 = FrameNode::CreateFrameNode("child1", 44, AceType::MakeRefPtr<TextPattern>());
458     auto barItem = BarItemNode::GetOrCreateBarItemNode(
__anon72a883913402() 459         V2::BAR_ITEM_ETS_TAG, 55, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
460     auto barItem2 = BarItemNode::GetOrCreateBarItemNode(
__anon72a883913502() 461         V2::BAR_ITEM_ETS_TAG, 66, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
462     auto barItem3 = BarItemNode::GetOrCreateBarItemNode(
__anon72a883913602() 463         V2::BAR_ITEM_ETS_TAG, 67, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
464     auto barItem4 = BarItemNode::GetOrCreateBarItemNode(
__anon72a883913702() 465         V2::BAR_ITEM_ETS_TAG, 68, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
466 
467     auto icon = FrameNode::CreateFrameNode("icon", 77, AceType::MakeRefPtr<ImagePattern>());
468     auto text = FrameNode::CreateFrameNode("text", 88, AceType::MakeRefPtr<TextPattern>());
469 
470     auto icon3 = FrameNode::CreateFrameNode("icon", 78, AceType::MakeRefPtr<ImagePattern>());
471     auto text3 = FrameNode::CreateFrameNode("text", 89, AceType::MakeRefPtr<TextPattern>());
472 
473     auto icon4 = FrameNode::CreateFrameNode("icon", 80, AceType::MakeRefPtr<ImagePattern>());
474     auto text4 = FrameNode::CreateFrameNode("text", 81, AceType::MakeRefPtr<TextPattern>());
475 
476     auto imageLayoutProperty = AceType::MakeRefPtr<ImageLayoutProperty>();
477     auto textLayoutProperty = AceType::MakeRefPtr<TextLayoutProperty>();
478 
479     imageLayoutProperty->propImageSourceInfo_ = ImageSourceInfo();
480 
481     barItem2->icon_ = icon;
482     barItem2->text_ = text;
483 
484     barItem3->icon_ = icon3;
485     barItem3->text_ = text3;
486 
487     barItem4->icon_ = icon4;
488     barItem4->text_ = text4;
489 
490     icon3->layoutProperty_ = imageLayoutProperty;
491     text3->layoutProperty_ = textLayoutProperty;
492     text->layoutProperty_ = nullptr;
493     icon4->layoutProperty_ = nullptr;
494 
495     /**
496      * @tc.steps: step3. call navBar->GetBarItemsString.
497      */
498     navBar->menu_ = menu;
499     navBar->GetBarItemsString(true);
500     ASSERT_TRUE(navBar->menu_->children_.empty());
501 
502     navBar->menu_->children_.push_back(child1);
503     navBar->menu_->children_.push_back(barItem);
504     navBar->menu_->children_.push_back(barItem2);
505     navBar->menu_->children_.push_back(barItem3);
506     navBar->menu_->children_.push_back(barItem4);
507     navBar->GetBarItemsString(true);
508     ASSERT_EQ(navBar->menu_->children_.size(), 5);
509 }
510 
511 /**
512  * @tc.name: NavrouterTestNg0030
513  * @tc.desc: Test NavBarLayoutAlgorithm MeasureTitleBar.
514  * @tc.type: FUNC
515  */
516 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0030, TestSize.Level1)
517 {
518     auto algorithm = AceType::MakeRefPtr<NavBarLayoutAlgorithm>();
519     auto navBar =
__anon72a883913802() 520         NavBarNode::GetOrCreateNavBarNode("navBarNode", 11, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
521     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
522     auto layoutProperty = AceType::MakeRefPtr<NavBarLayoutProperty>();
523     auto layoutWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
524         AceType::WeakClaim(AceType::RawPtr(navBar)), geometryNode, layoutProperty);
525 
526     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883913902() 527         "titleBarNode", 22, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
528     auto text4 = FrameNode::CreateFrameNode("text", 22, AceType::MakeRefPtr<TextPattern>());
529     auto titleGeometryNode = AceType::MakeRefPtr<GeometryNode>();
530     auto titleLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
531     auto titleBarNode2 = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883913a02() 532         "titleBarNode", 23, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
533     auto childWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
534         AceType::WeakClaim(AceType::RawPtr(titleBarNode2)), titleGeometryNode, titleLayoutProperty);
535     auto subTitle =
__anon72a883913b02() 536         TitleBarNode::GetOrCreateTitleBarNode("subTitle", 22, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
537     auto toolBarNode = FrameNode::CreateFrameNode("text", 22, AceType::MakeRefPtr<TextPattern>());
538     auto navBarContentNode = FrameNode::CreateFrameNode("text", 22, AceType::MakeRefPtr<TextPattern>());
539     auto toolBarChild = FrameNode::CreateFrameNode("text", 99, AceType::MakeRefPtr<TextPattern>());
540     navBar->UpdatePrevMenuIsCustom(true);
541     navBar->UpdatePrevToolBarIsCustom(true);
542 
543     LayoutConstraintF constraint;
544     LayoutConstraintF constraint2;
545     constraint.selfIdealSize.width_ = 20.0f;
546     constraint.selfIdealSize.height_ = 30.0f;
547     layoutProperty->layoutConstraint_ = constraint;
548     layoutProperty->propHideTitleBar_ = true;
549     layoutProperty->contentConstraint_ = constraint2;
550     // toolBarNode_ contentNode_
551 
552     navBar->contentNode_ = navBarContentNode;
553     navBar->toolBarNode_ = toolBarNode;
554     navBar->titleBarNode_ = titleBarNode;
555     navBar->children_.push_back(text4);
556     layoutWrapper->childrenMap_[0] = childWrapper;
557     layoutWrapper->currentChildCount_ = 1;
558     layoutProperty->propHideToolBar_ = false;
559 
560     algorithm->Measure(AceType::RawPtr(layoutWrapper));
561     algorithm->Layout(AceType::RawPtr(layoutWrapper));
562     ASSERT_TRUE(layoutProperty->propHideTitleBar_.value());
563 
564     layoutProperty->propHideToolBar_ = true;
565     layoutProperty->propHideTitleBar_ = false;
566     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = Dimension();
567     algorithm->Measure(AceType::RawPtr(layoutWrapper));
568     algorithm->Layout(AceType::RawPtr(layoutWrapper));
569     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
570     ASSERT_TRUE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
571 
572     layoutProperty->propHideToolBar_ = false;
573     toolBarNode->children_.push_back(toolBarChild);
574     layoutProperty->propHideTitleBar_ = false;
575     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = std::nullopt;
576     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
577     algorithm->Measure(AceType::RawPtr(layoutWrapper));
578     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
579     ASSERT_FALSE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
580 
581     // subtitle_
582     layoutProperty->propHideTitleBar_ = false;
583     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = std::nullopt;
584     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
585     algorithm->Measure(AceType::RawPtr(layoutWrapper));
586     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
587     ASSERT_FALSE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
588 
589     layoutProperty->propHideTitleBar_ = false;
590     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = std::nullopt;
591     layoutProperty->propTitleMode_ = NavigationTitleMode::FULL;
592     algorithm->Measure(AceType::RawPtr(layoutWrapper));
593     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
594     ASSERT_FALSE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
595 
596     titleBarNode->GetPattern<TitleBarPattern>()->SetTempTitleBarHeightVp(5.0f);
597     layoutProperty->propHideTitleBar_ = false;
598     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = std::nullopt;
599     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
600     algorithm->Measure(AceType::RawPtr(layoutWrapper));
601     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
602     ASSERT_FALSE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
603 
604     titleBarNode->GetPattern<TitleBarPattern>()->SetTempTitleBarHeightVp(5.0f);
605     layoutProperty->propHideTitleBar_ = false;
606     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = std::nullopt;
607     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
608     algorithm->Measure(AceType::RawPtr(layoutWrapper));
609     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
610     ASSERT_FALSE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
611 
612     titleBarNode->GetPattern<TitleBarPattern>()->SetTempTitleBarHeightVp(5.0f);
613     layoutProperty->propHideTitleBar_ = false;
614     titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->propTitleHeight_ = std::nullopt;
615     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
616     algorithm->Measure(AceType::RawPtr(layoutWrapper));
617     ASSERT_FALSE(layoutProperty->propHideTitleBar_.value());
618     ASSERT_FALSE(titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>()->HasTitleHeight());
619 }
620 
621 /**
622  * @tc.name: NavrouterTestNg0034
623  * @tc.desc: Test TitleBarLayoutAlgorithm::Measure.
624  * @tc.type: FUNC
625  */
626 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0034, TestSize.Level1)
627 {
628     /**
629      * @tc.steps: step1. create navBar titleBarNode etc, construct layoutWrapper.
630      */
631     auto navBar =
__anon72a883913c02() 632         NavBarNode::GetOrCreateNavBarNode("navBarNode", 11, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
633     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883913d02() 634         "titleBarNode", 22, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
635     auto backButton = FrameNode::CreateFrameNode("BackButton", 33, AceType::MakeRefPtr<ImagePattern>());
636     auto backButton2 = FrameNode::CreateFrameNode("BackButton", 33, AceType::MakeRefPtr<ImagePattern>());
637     auto menu = FrameNode::CreateFrameNode("BackButton", 34, AceType::MakeRefPtr<ButtonPattern>());
638     auto menu2 = FrameNode::CreateFrameNode("BackButton", 34, AceType::MakeRefPtr<ButtonPattern>());
639     auto subtitle = FrameNode::CreateFrameNode("BackButton", 35, AceType::MakeRefPtr<ButtonPattern>());
640     auto title = FrameNode::CreateFrameNode("BackButton", 36, AceType::MakeRefPtr<TextPattern>());
641     auto toolBarNode = FrameNode::CreateFrameNode("BackButton", 44, AceType::MakeRefPtr<ButtonPattern>());
642     auto buttonNode = FrameNode::CreateFrameNode("BackButton", 55, AceType::MakeRefPtr<ImagePattern>());
643     auto backButtonImageNode = FrameNode::CreateFrameNode("BackButton", 66, AceType::MakeRefPtr<ImagePattern>());
644 
645     titleBarNode->backButton_ = backButton;
646     ASSERT_TRUE(titleBarNode->children_.empty());
647     titleBarNode->children_.push_back(backButton);
648 
649     auto layoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
650     ASSERT_NE(layoutProperty, nullptr);
651     auto geometryNode = titleBarNode->geometryNode_;
652     ASSERT_NE(geometryNode, nullptr);
653     auto layoutWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
654         AceType::WeakClaim(AceType::RawPtr(titleBarNode)), geometryNode, layoutProperty);
655 
656     auto backLayoutProperty = backButton2->GetLayoutProperty<ImageLayoutProperty>();
657     ASSERT_NE(backLayoutProperty, nullptr);
658     auto backGeometryNode = backButton2->geometryNode_;
659     ASSERT_NE(backGeometryNode, nullptr);
660     auto backButtonWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
661         AceType::WeakClaim(AceType::RawPtr(backButton2)), backGeometryNode, backLayoutProperty);
662     ASSERT_NE(backButtonWrapper, nullptr);
663     layoutWrapper->childrenMap_[0] = backButtonWrapper;
664     layoutWrapper->currentChildCount_ = 1;
665     ASSERT_EQ(titleBarNode->GetChildIndexById(titleBarNode->GetBackButton()->GetId()), 0);
666     ASSERT_NE(layoutWrapper->GetOrCreateChildByIndex(0), nullptr);
667 
668     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
669 
670     LayoutConstraintF constraint;
671     constraint.selfIdealSize.width_ = 20.0f;
672     constraint.selfIdealSize.height_ = 30.0f;
673     layoutProperty->layoutConstraint_ = constraint;
674     EXPECT_FALSE(layoutProperty->contentConstraint_);
675     layoutProperty->contentConstraint_ = constraint;
676     /**
677      * @tc.steps: step2. set menu and change properties, test TitleBarLayoutAlgorithm::MeasureBackButton.
678      * @tc.expected: check whether the properties is correct.
679      */
680     algorithm->Measure(AceType::RawPtr(layoutWrapper));
681     ASSERT_FALSE(layoutProperty->propTitleMode_);
682 
683     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
684     algorithm->Measure(AceType::RawPtr(layoutWrapper));
685     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
686 
687     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
688     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
689     layoutProperty->propHideBackButton_ = true;
690     algorithm->Measure(AceType::RawPtr(layoutWrapper));
691     EXPECT_TRUE(layoutProperty->propHideBackButton_.value());
692 
693     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
694     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
695     layoutProperty->propHideBackButton_ = false;
696     algorithm->Measure(AceType::RawPtr(layoutWrapper));
697     EXPECT_FALSE(layoutProperty->propHideBackButton_.value());
698     /**
699      * @tc.steps: step3. set titleBarNode->backButton_ and change properties, test TitleBarLayoutAlgorithm::MeasureMenu.
700      * @tc.expected: check whether the properties is correct.
701      */
702     titleBarNode->menu_ = menu;
703     ASSERT_EQ(titleBarNode->children_.size(), 1);
704     titleBarNode->children_.push_back(menu);
705 
706     auto menuLayoutProperty = menu2->GetLayoutProperty<ButtonLayoutProperty>();
707     ASSERT_NE(menuLayoutProperty, nullptr);
708     auto menuGeometryNode = menu2->geometryNode_;
709     ASSERT_NE(menuGeometryNode, nullptr);
710     auto menuWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
711         AceType::WeakClaim(AceType::RawPtr(menu2)), menuGeometryNode, menuLayoutProperty);
712     ASSERT_NE(menuWrapper, nullptr);
713     layoutWrapper->childrenMap_[1] = menuWrapper;
714     layoutWrapper->currentChildCount_ = 2;
715     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(navBar));
716     algorithm->Measure(AceType::RawPtr(layoutWrapper));
717     ASSERT_FALSE(navBar->propPrevMenuIsCustom_);
718 
719     navBar->propPrevMenuIsCustom_ = true;
720     algorithm->Measure(AceType::RawPtr(layoutWrapper));
721     ASSERT_TRUE(navBar->propPrevMenuIsCustom_.value());
722 
723     menu->children_.push_back(FrameNode::CreateFrameNode("BackButton", 30, AceType::MakeRefPtr<ButtonPattern>()));
724     menu->children_.push_back(FrameNode::CreateFrameNode("BackButton", 31, AceType::MakeRefPtr<ButtonPattern>()));
725     menu->children_.push_back(FrameNode::CreateFrameNode("BackButton", 32, AceType::MakeRefPtr<ButtonPattern>()));
726     navBar->propPrevMenuIsCustom_ = false;
727     algorithm->Measure(AceType::RawPtr(layoutWrapper));
728     ASSERT_FALSE(navBar->propPrevMenuIsCustom_.value());
729     /**
730      * @tc.steps: step4. set title and change properties, test TitleBarLayoutAlgorithm::MeasureTitle.
731      * @tc.expected: check whether the properties is correct.
732      */
733     titleBarNode->title_ = title;
734     ASSERT_EQ(titleBarNode->children_.size(), 2);
735     titleBarNode->children_.push_back(title);
736 
737     auto titleLayoutProperty = title->GetLayoutProperty<TextLayoutProperty>();
738     ASSERT_NE(titleLayoutProperty, nullptr);
739     auto titleGeometryNode = title->geometryNode_;
740     ASSERT_NE(titleGeometryNode, nullptr);
741     auto titleWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
742         AceType::WeakClaim(AceType::RawPtr(title)), titleGeometryNode, titleLayoutProperty);
743     ASSERT_NE(titleWrapper, nullptr);
744     layoutWrapper->childrenMap_[2] = titleWrapper;
745     layoutWrapper->currentChildCount_ = 3;
746     algorithm->Measure(AceType::RawPtr(layoutWrapper));
747 
748     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
749     algorithm->Measure(AceType::RawPtr(layoutWrapper));
750     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
751     ASSERT_NE(titleBarNode->backButton_, nullptr);
752 
753     titleBarNode->backButton_ = nullptr;
754     algorithm->Measure(AceType::RawPtr(layoutWrapper));
755     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
756     ASSERT_EQ(titleBarNode->backButton_, nullptr);
757 
758     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
759     navBar->propPrevTitleIsCustom_ = true;
760     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
761     layoutProperty->propHideBackButton_ = false;
762     algorithm->Measure(AceType::RawPtr(layoutWrapper));
763     ASSERT_TRUE(navBar->propPrevTitleIsCustom_.value());
764 
765     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
766     navBar->propPrevTitleIsCustom_ = true;
767     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
768     layoutProperty->propHideBackButton_ = true;
769     algorithm->Measure(AceType::RawPtr(layoutWrapper));
770     ASSERT_TRUE(navBar->propPrevTitleIsCustom_.value());
771 
772     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
773     navBar->propPrevTitleIsCustom_ = true;
774     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
775     layoutProperty->propHideBackButton_ = true;
776     algorithm->Measure(AceType::RawPtr(layoutWrapper));
777     ASSERT_TRUE(navBar->propPrevTitleIsCustom_.value());
778 
779     navBar->propPrevTitleIsCustom_ = false;
780     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
781     algorithm->Measure(AceType::RawPtr(layoutWrapper));
782     ASSERT_FALSE(navBar->propPrevTitleIsCustom_.value());
783 
784     navBar->propPrevTitleIsCustom_ = false;
785     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
786     layoutProperty->propHideBackButton_ = true;
787     algorithm->Measure(AceType::RawPtr(layoutWrapper));
788     ASSERT_FALSE(navBar->propPrevTitleIsCustom_.value());
789     ASSERT_TRUE(layoutProperty->propHideBackButton_.value());
790     /**
791      * @tc.steps: step5. set subtitle and change properties ,test TitleBarLayoutAlgorithm::MeasureSubtitle.
792      * @tc.expected: check whether the properties is correct.
793      */
794     titleBarNode->subtitle_ = subtitle;
795     ASSERT_EQ(titleBarNode->children_.size(), 3);
796     titleBarNode->children_.push_back(subtitle);
797 
798     auto subtitleLayoutProperty = subtitle->GetLayoutProperty<ButtonLayoutProperty>();
799     ASSERT_NE(subtitleLayoutProperty, nullptr);
800     auto subtitleGeometryNode = subtitle->geometryNode_;
801     ASSERT_NE(subtitleGeometryNode, nullptr);
802     auto subtitleWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
803         AceType::WeakClaim(AceType::RawPtr(subtitle)), subtitleGeometryNode, subtitleLayoutProperty);
804     ASSERT_NE(subtitleWrapper, nullptr);
805     layoutWrapper->childrenMap_[3] = subtitleWrapper;
806     layoutWrapper->currentChildCount_ = 4;
807     algorithm->Measure(AceType::RawPtr(layoutWrapper));
808     ASSERT_TRUE(layoutProperty->propHideBackButton_.value());
809 
810     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
811     algorithm->Measure(AceType::RawPtr(layoutWrapper));
812     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
813     ASSERT_EQ(titleBarNode->backButton_, nullptr);
814 
815     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
816     titleBarNode->backButton_ = backButton;
817     algorithm->Measure(AceType::RawPtr(layoutWrapper));
818     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
819     ASSERT_NE(titleBarNode->backButton_, nullptr);
820 
821     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
822     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
823     algorithm->Measure(AceType::RawPtr(layoutWrapper));
824     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
825     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
826 
827     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
828     layoutProperty->propHideBackButton_ = false;
829     algorithm->Measure(AceType::RawPtr(layoutWrapper));
830     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
831     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::MINI);
832     ASSERT_FALSE(layoutProperty->propHideBackButton_.value());
833 }
834 
835 /**
836  * @tc.name: NavrouterTestNg0035
837  * @tc.desc: Test TitleBarLayoutAlgorithm::Layout.
838  * @tc.type: FUNC
839  */
840 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0035, TestSize.Level1)
841 {
842     /**
843      * @tc.steps: step1. create navBar titleBarNode etc, construct layoutWrapper.
844      */
845     auto navBar =
__anon72a883913e02() 846         NavBarNode::GetOrCreateNavBarNode("navBarNode", 11, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
847     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883913f02() 848         "titleBarNode", 22, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
849     auto backButton = FrameNode::CreateFrameNode("BackButton", 33, AceType::MakeRefPtr<ImagePattern>());
850     auto backButton2 = FrameNode::CreateFrameNode("BackButton", 33, AceType::MakeRefPtr<ImagePattern>());
851     auto menu = FrameNode::CreateFrameNode("BackButton", 34, AceType::MakeRefPtr<ButtonPattern>());
852     auto menu2 = FrameNode::CreateFrameNode("BackButton", 34, AceType::MakeRefPtr<ButtonPattern>());
853     auto subtitle = FrameNode::CreateFrameNode("BackButton", 35, AceType::MakeRefPtr<ButtonPattern>());
854     auto title = FrameNode::CreateFrameNode("BackButton", 36, AceType::MakeRefPtr<TextPattern>());
855     auto toolBarNode = FrameNode::CreateFrameNode("BackButton", 44, AceType::MakeRefPtr<ButtonPattern>());
856     auto buttonNode = FrameNode::CreateFrameNode("BackButton", 55, AceType::MakeRefPtr<ImagePattern>());
857     auto backButtonImageNode = FrameNode::CreateFrameNode("BackButton", 66, AceType::MakeRefPtr<ImagePattern>());
858 
859     auto layoutProperty = titleBarNode->GetLayoutProperty<TitleBarLayoutProperty>();
860     ASSERT_NE(layoutProperty, nullptr);
861     auto geometryNode = titleBarNode->geometryNode_;
862     ASSERT_NE(geometryNode, nullptr);
863     auto layoutWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
864         AceType::WeakClaim(AceType::RawPtr(titleBarNode)), geometryNode, layoutProperty);
865 
866     LayoutConstraintF constraint;
867     constraint.selfIdealSize.width_ = 20.0f;
868     constraint.selfIdealSize.height_ = 30.0f;
869     layoutProperty->layoutConstraint_ = constraint;
870     EXPECT_FALSE(layoutProperty->contentConstraint_);
871     layoutProperty->contentConstraint_ = constraint;
872 
873     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
874     /**
875      * @tc.steps: step2. set backButton and change properties, test TitleBarLayoutAlgorithm::LayoutBackButton.
876      * @tc.expected: check whether the properties is correct.
877      */
878     titleBarNode->backButton_ = backButton;
879     ASSERT_TRUE(titleBarNode->children_.empty());
880     titleBarNode->children_.push_back(backButton);
881 
882     auto backLayoutProperty = backButton->GetLayoutProperty<ImageLayoutProperty>();
883     ASSERT_NE(backLayoutProperty, nullptr);
884     auto backGeometryNode = backButton->geometryNode_;
885     ASSERT_NE(backGeometryNode, nullptr);
886     auto backButtonWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
887         AceType::WeakClaim(AceType::RawPtr(backButton)), backGeometryNode, backLayoutProperty);
888     ASSERT_NE(backButtonWrapper, nullptr);
889     layoutWrapper->childrenMap_[0] = backButtonWrapper;
890     layoutWrapper->currentChildCount_ = 1;
891     ASSERT_EQ(titleBarNode->GetChildIndexById(titleBarNode->GetBackButton()->GetId()), 0);
892     ASSERT_NE(layoutWrapper->GetOrCreateChildByIndex(0), nullptr);
893 
894     algorithm->Layout(AceType::RawPtr(layoutWrapper));
895     ASSERT_FALSE(layoutProperty->propTitleMode_);
896 
897     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
898     algorithm->Layout(AceType::RawPtr(layoutWrapper));
899     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
900 
901     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
902     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
903     layoutProperty->propHideBackButton_ = true;
904     algorithm->Layout(AceType::RawPtr(layoutWrapper));
905     EXPECT_TRUE(layoutProperty->propHideBackButton_.value());
906 
907     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
908     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
909     layoutProperty->propHideBackButton_ = false;
910     algorithm->Layout(AceType::RawPtr(layoutWrapper));
911     EXPECT_FALSE(layoutProperty->propHideBackButton_.value());
912     /**
913      * @tc.steps: step3. set titleBarNode->title_ and change properties, test TitleBarLayoutAlgorithm::LayoutTitle.
914      * @tc.expected: check whether the properties is correct.
915      */
916     titleBarNode->title_ = title;
917     ASSERT_EQ(titleBarNode->children_.size(), 1);
918     titleBarNode->children_.push_back(title);
919 
920     auto titleLayoutProperty = title->GetLayoutProperty<TextLayoutProperty>();
921     ASSERT_NE(titleLayoutProperty, nullptr);
922     auto titleGeometryNode = title->geometryNode_;
923     ASSERT_NE(titleGeometryNode, nullptr);
924     auto titleWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
925         AceType::WeakClaim(AceType::RawPtr(title)), titleGeometryNode, titleLayoutProperty);
926     ASSERT_NE(titleWrapper, nullptr);
927     layoutWrapper->childrenMap_[1] = titleWrapper;
928     layoutWrapper->currentChildCount_ = 2;
929     algorithm->Layout(AceType::RawPtr(layoutWrapper));
930 
931     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
932     algorithm->Layout(AceType::RawPtr(layoutWrapper));
933     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
934     ASSERT_NE(titleBarNode->backButton_, nullptr);
935 
936     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
937     backLayoutProperty->propVisibility_ = VisibleType::GONE;
938     algorithm->Layout(AceType::RawPtr(layoutWrapper));
939     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
940     ASSERT_EQ(backLayoutProperty->propVisibility_.value(), VisibleType::GONE);
941 
942     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
943     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
944     layoutProperty->propHideBackButton_ = true;
945     algorithm->Layout(AceType::RawPtr(layoutWrapper));
946     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
947     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::MINI);
948     EXPECT_TRUE(layoutProperty->propHideBackButton_.value());
949 
950     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
951     layoutProperty->propTitleMode_ = NavigationTitleMode::FULL;
952     algorithm->Layout(AceType::RawPtr(layoutWrapper));
953     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
954     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FULL);
955     EXPECT_TRUE(layoutProperty->propHideBackButton_.value());
956 
957     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
958     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
959     titleLayoutProperty->propContent_ = "content";
960     algorithm->Layout(AceType::RawPtr(layoutWrapper));
961     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
962     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
963     EXPECT_TRUE(algorithm->isInitialTitle_);
964 
965     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
966     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
967     algorithm->isInitialTitle_ = true;
968     title->layoutProperty_ = AceType::MakeRefPtr<ButtonLayoutProperty>();
969     algorithm->Layout(AceType::RawPtr(layoutWrapper));
970     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
971     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
972     EXPECT_TRUE(algorithm->isInitialTitle_);
973 
974     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
975     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
976     algorithm->isInitialTitle_ = false;
977     algorithm->Layout(AceType::RawPtr(layoutWrapper));
978     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
979     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
980     EXPECT_FALSE(algorithm->isInitialTitle_);
981     ASSERT_EQ(titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_, 0.0f);
982 
983     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
984     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
985     algorithm->isInitialTitle_ = false;
986     titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_ = 5.0f;
987     algorithm->Layout(AceType::RawPtr(layoutWrapper));
988     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
989     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
990     EXPECT_FALSE(algorithm->isInitialTitle_);
991     ASSERT_EQ(titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_, 5.0f);
992     /**
993      * @tc.steps: step4. set titleBarNode->subtitle_ and change properties, test
994      * TitleBarLayoutAlgorithm::LayoutSubtitle.
995      * @tc.expected: check whether the properties is correct.
996      */
997     titleBarNode->subtitle_ = subtitle;
998     ASSERT_EQ(titleBarNode->children_.size(), 2);
999     titleBarNode->children_.push_back(subtitle);
1000 
1001     auto subtitleLayoutProperty = subtitle->GetLayoutProperty<ButtonLayoutProperty>();
1002     ASSERT_NE(subtitleLayoutProperty, nullptr);
1003     auto subtitleGeometryNode = subtitle->geometryNode_;
1004     ASSERT_NE(subtitleGeometryNode, nullptr);
1005     auto subtitleWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
1006         AceType::WeakClaim(AceType::RawPtr(subtitle)), subtitleGeometryNode, subtitleLayoutProperty);
1007     ASSERT_NE(subtitleWrapper, nullptr);
1008     layoutWrapper->childrenMap_[2] = subtitleWrapper;
1009     layoutWrapper->currentChildCount_ = 3;
1010     subtitleGeometryNode->frame_.rect_.height_ = 20.0f;
1011     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1012     ASSERT_TRUE(layoutProperty->propHideBackButton_.value());
1013     ASSERT_FALSE(algorithm->isInitialTitle_);
1014 
1015     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1016     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1017     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
1018     ASSERT_NE(titleBarNode->GetBackButton(), nullptr);
1019 
1020     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1021     titleBarNode->backButton_ = nullptr;
1022     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1023     ASSERT_EQ(layoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
1024     ASSERT_EQ(titleBarNode->GetBackButton(), nullptr);
1025 
1026     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1027     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
1028     algorithm->isInitialTitle_ = false;
1029     titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_ = 0.0f;
1030     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1031     ASSERT_FALSE(algorithm->isInitialTitle_);
1032     ASSERT_EQ(titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_, 0.0f);
1033 
1034     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1035     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
1036     algorithm->isInitialTitle_ = false;
1037     titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_ = 20.0f;
1038     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1039     ASSERT_FALSE(algorithm->isInitialTitle_);
1040     ASSERT_EQ(titleBarNode->GetPattern<TitleBarPattern>()->tempTitleOffsetY_, 20.0f);
1041 
1042     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1043     layoutProperty->propTitleMode_ = NavigationTitleMode::FULL;
1044     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1045     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FULL);
1046 
1047     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1048     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
1049     layoutProperty->propHideBackButton_ = true;
1050     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1051     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::MINI);
1052     ASSERT_TRUE(layoutProperty->propHideBackButton_.value());
1053 
1054     titleGeometryNode->frame_.rect_.height_ = 20.0f;
1055     layoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1056     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
1057     layoutProperty->propHideBackButton_ = false;
1058     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1059     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::MINI);
1060     ASSERT_FALSE(layoutProperty->propHideBackButton_.value());
1061 
1062     /**
1063      * @tc.steps: step5. set titleBarNode->menu_ and change properties, test TitleBarLayoutAlgorithm::LayoutMenu.
1064      * @tc.expected: check whether the properties is correct.
1065      */
1066     titleBarNode->menu_ = menu;
1067     ASSERT_EQ(titleBarNode->children_.size(), 3);
1068     titleBarNode->children_.push_back(menu);
1069 
1070     auto menuLayoutProperty = menu2->GetLayoutProperty<ButtonLayoutProperty>();
1071     ASSERT_NE(menuLayoutProperty, nullptr);
1072     auto menuGeometryNode = menu2->geometryNode_;
1073     ASSERT_NE(menuGeometryNode, nullptr);
1074     auto menuWrapper = AceType::MakeRefPtr<LayoutWrapperNode>(
1075         AceType::WeakClaim(AceType::RawPtr(menu2)), menuGeometryNode, menuLayoutProperty);
1076     ASSERT_NE(menuWrapper, nullptr);
1077     layoutWrapper->childrenMap_[3] = menuWrapper;
1078     layoutWrapper->currentChildCount_ = 4;
1079     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(navBar));
1080     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1081     ASSERT_NE(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
1082 
1083     layoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
1084     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1085     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::FREE);
1086 
1087     layoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
1088     subtitleGeometryNode->frame_.rect_.height_ = 0.0f;
1089     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1090     ASSERT_EQ(layoutProperty->propTitleMode_.value(), NavigationTitleMode::MINI);
1091     ASSERT_EQ(subtitleGeometryNode->frame_.rect_.height_, 0.0f);
1092 }
1093 
1094 /**
1095  * @tc.name: NavrouterTestNg0036
1096  * @tc.desc: Test NavigationStack.
1097  * @tc.type: FUNC
1098  */
1099 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0036, TestSize.Level1)
1100 {
1101     /**
1102      * @tc.steps: step1. create navigationStack.
1103      */
1104     auto backButton = FrameNode::CreateFrameNode("BackButton", 33, AceType::MakeRefPtr<ImagePattern>());
1105     auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1106     RefPtr<UINode> navDestinationNode;
1107     int32_t lastIndex;
1108     /**
1109      * @tc.steps: step2. call get function.
1110      * @tc.expected: navigationStack->navPathList_.empty() is true.
1111      */
1112     ASSERT_TRUE(navigationStack->navPathList_.empty());
1113     navigationStack->GetAllPathName();
1114     ASSERT_TRUE(navigationStack->navPathList_.empty());
1115     navigationStack->Get();
1116     ASSERT_TRUE(navigationStack->navPathList_.empty());
1117     navigationStack->Get("test", navDestinationNode, lastIndex);
1118     ASSERT_TRUE(navigationStack->navPathList_.empty());
1119     navigationStack->GetPre("test", backButton);
1120     ASSERT_TRUE(navigationStack->navPathList_.empty());
1121     /**
1122      * @tc.steps: step3. add element to navigationStack->navPathList_.
1123      */
1124     navigationStack->navPathList_.push_back({ "test", backButton });
1125     navigationStack->GetPre("test", backButton);
1126     navigationStack->navPathList_.push_back({ "test1", backButton });
1127     navigationStack->GetPre("test", backButton);
1128     navigationStack->GetPre("test2", backButton);
1129     navigationStack->Get("test3", navDestinationNode, lastIndex);
1130     navigationStack->GetAllPathName();
1131     navigationStack->navPathList_.clear();
1132     /**
1133      * @tc.steps: step4. call Remove function.
1134      * @tc.expected: navigationStack->navPathList_.empty() is true.
1135      */
1136     navigationStack->Remove();
1137     navigationStack->Remove("test");
1138     ASSERT_TRUE(navigationStack->navPathList_.empty());
1139     for (int i = 0; i < 3; i++) {
1140         std::pair<std::string, RefPtr<UINode>> p("test" + std::to_string(i), backButton);
1141         navigationStack->navPathList_.push_back(p);
1142     }
1143     navigationStack->Remove();
1144     ASSERT_FALSE(navigationStack->navPathList_.empty());
1145     ASSERT_EQ(navigationStack->navPathList_.size(), 2);
1146     for (int i = 0; i < 3; i++) {
1147         navigationStack->Remove("test" + std::to_string(i));
1148     }
1149     ASSERT_TRUE(navigationStack->navPathList_.empty());
1150 
1151     for (int i = 1; i <= 3; i++) {
1152         std::pair<std::string, RefPtr<UINode>> p("test" + std::to_string(i), backButton);
1153         navigationStack->navPathList_.push_back(p);
1154     }
1155     for (int i = 0; i <= 4; i++) {
1156         navigationStack->Remove("test" + std::to_string(i), backButton);
1157     }
1158     ASSERT_TRUE(navigationStack->navPathList_.empty());
1159 }
1160 
1161 /**
1162  * @tc.name: NavrouterTestNg0037
1163  * @tc.desc: Test NavigationStack.
1164  * @tc.type: FUNC
1165  */
1166 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0037, TestSize.Level1)
1167 {
1168     /**
1169      * @tc.steps: step1. create navigationStack.
1170      * @tc.expected: check whether the properties is correct.
1171      */
1172     auto backButton = FrameNode::CreateFrameNode("BackButton", 33, AceType::MakeRefPtr<ImagePattern>());
1173     auto navigationStack = AceType::MakeRefPtr<NavigationStack>();
1174     auto routeInfo = AceType::MakeRefPtr<RouteInfo>();
1175     for (int i = 0; i <= 3; i++) {
1176         for (int j = 0; j <= 2 + i; j++) {
1177             navigationStack->Add(
1178                 "test" + std::to_string(j == 1 ? 0 : j), backButton, static_cast<NavRouteMode>(i), routeInfo);
1179         }
1180         navigationStack->navPathList_.clear();
1181     }
1182     ASSERT_TRUE(navigationStack->navPathList_.empty());
1183 }
1184 
1185 /**
1186  * @tc.name: NavrouterTestNg0038
1187  * @tc.desc: Test BarItemPattern.
1188  * @tc.type: FUNC
1189  */
1190 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0038, TestSize.Level1)
1191 {
1192     /**
1193      * @tc.steps: step1. create BarItemNode.
1194      * @tc.expected: check whether the properties is correct.
1195      */
1196     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
1197     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
1198     auto theme = AceType::MakeRefPtr<NavigationBarTheme>();
1199     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(theme));
1200     auto barItemNode = BarItemNode::GetOrCreateBarItemNode(
__anon72a883914002() 1201         V2::BAR_ITEM_ETS_TAG, 1, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
1202     ASSERT_NE(barItemNode, nullptr);
1203     auto barItemPattern = barItemNode->GetPattern<BarItemPattern>();
1204     ASSERT_NE(barItemPattern, nullptr);
1205     barItemPattern->AttachToFrameNode(AceType::WeakClaim(AceType::RawPtr(barItemNode)));
1206     ASSERT_NE(barItemPattern->GetHost(), nullptr);
1207 
1208     barItemNode->icon_ = FrameNode::CreateFrameNode("icon", 2, AceType::MakeRefPtr<ImagePattern>());
1209     barItemNode->text_ = FrameNode::CreateFrameNode("text", 3, AceType::MakeRefPtr<TextPattern>());
1210 
1211     barItemPattern->UpdateBarItemActiveStatusResource();
1212     ASSERT_EQ(barItemPattern->status_, NavToolbarItemStatus::NORMAL);
1213     ASSERT_EQ(barItemPattern->iconStatus_, ToolbarIconStatus::INITIAL);
1214     /**
1215      * @tc.steps: step2. change status_ and iconStatus_.
1216      * @tc.expected: check whether the properties is correct.
1217      */
1218     std::cout<<"trigger change status"<< std::endl;
1219     barItemPattern->status_ = NavToolbarItemStatus::ACTIVE;
1220     barItemPattern->iconStatus_ = ToolbarIconStatus::INITIAL;
1221     barItemPattern->UpdateBarItemActiveStatusResource();
1222     ASSERT_EQ(barItemPattern->status_, NavToolbarItemStatus::ACTIVE);
1223     ASSERT_EQ(barItemPattern->iconStatus_, ToolbarIconStatus::ACTIVE);
1224 
1225     barItemPattern->UpdateBarItemActiveStatusResource();
1226     ASSERT_EQ(barItemPattern->status_, NavToolbarItemStatus::ACTIVE);
1227     ASSERT_EQ(barItemPattern->iconStatus_, ToolbarIconStatus::INITIAL);
1228 
1229     barItemPattern->status_ = NavToolbarItemStatus::NORMAL;
1230     barItemPattern->iconStatus_ = ToolbarIconStatus::ACTIVE;
1231     barItemPattern->UpdateBarItemActiveStatusResource();
1232     ASSERT_EQ(barItemPattern->status_, NavToolbarItemStatus::NORMAL);
1233     ASSERT_EQ(barItemPattern->iconStatus_, ToolbarIconStatus::ACTIVE);
1234 }
1235 
1236 /**
1237  * @tc.name: NavrouterTestNg0039
1238  * @tc.desc: Test BarItemPattern.
1239  * @tc.type: FUNC
1240  */
1241 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0039, TestSize.Level1)
1242 {
1243     /**
1244      * @tc.steps: step1. create BarItemNode.
1245      */
1246     auto barItemNode = BarItemNode::GetOrCreateBarItemNode(
__anon72a883914102() 1247         V2::BAR_ITEM_ETS_TAG, 1, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
1248     ASSERT_NE(barItemNode, nullptr);
1249     auto barItemPattern = barItemNode->GetPattern<BarItemPattern>();
1250     ASSERT_NE(barItemPattern, nullptr);
1251     barItemPattern->AttachToFrameNode(AceType::WeakClaim(AceType::RawPtr(barItemNode)));
1252     ASSERT_NE(barItemPattern->GetHost(), nullptr);
1253 
1254     auto textNode = FrameNode::CreateFrameNode("text", 3, AceType::MakeRefPtr<TextPattern>());
1255     auto iconNode = FrameNode::CreateFrameNode("icon", 2, AceType::MakeRefPtr<ImagePattern>());
1256 
1257     barItemNode->icon_ = iconNode;
1258     barItemNode->text_ = textNode;
1259 
1260     auto layoutWrapper = barItemNode->CreateLayoutWrapper();
1261     ASSERT_NE(layoutWrapper, nullptr);
1262     auto algorithm = AceType::MakeRefPtr<BarItemLayoutAlgorithm>();
1263     ASSERT_NE(algorithm, nullptr);
1264 
1265     barItemNode->children_.push_back(textNode);
1266 
1267     auto textLayoutWrapper = textNode->CreateLayoutWrapper();
1268     textLayoutWrapper->GetLayoutProperty()->contentConstraint_ = LayoutConstraintF();
1269     layoutWrapper->GetLayoutProperty()->layoutConstraint_ = LayoutConstraintF();
1270 
1271     auto barItemLayoutProperty = AceType::DynamicCast<LayoutProperty>(layoutWrapper->GetLayoutProperty());
1272     barItemLayoutProperty->layoutConstraint_ = LayoutConstraintF();
1273     barItemLayoutProperty->contentConstraint_ = LayoutConstraintF();
1274     ASSERT_EQ(barItemLayoutProperty, layoutWrapper->GetLayoutProperty());
1275 
1276     layoutWrapper->childrenMap_[0] = textLayoutWrapper;
1277     layoutWrapper->currentChildCount_ = 1;
1278     /**
1279      * @tc.steps: step2. create mock theme manager.
1280      */
1281     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
1282     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
1283     auto theme = AceType::MakeRefPtr<NavigationBarTheme>();
1284     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(theme));
1285     /**
1286      * @tc.steps: step3. call algorithm->Measure then change isInToolbar_.
1287      */
1288     algorithm->Measure(AceType::RawPtr(layoutWrapper));
1289     ASSERT_FALSE(barItemNode->isInToolbar_);
1290 
1291     barItemNode->isInToolbar_ = true;
1292     algorithm->Measure(AceType::RawPtr(layoutWrapper));
1293     ASSERT_TRUE(barItemNode->isInToolbar_);
1294 
1295     auto temp = LayoutConstraintF();
1296     temp.maxSize = SizeF(300, 300);
1297     barItemLayoutProperty->contentConstraint_ = temp;
1298     barItemLayoutProperty->layoutConstraint_ = temp;
1299     textLayoutWrapper->GetGeometryNode()->SetContentSize(SizeF(500, 500));
1300     ASSERT_EQ(barItemLayoutProperty->CreateChildConstraint().maxSize.Width(), 300);
1301 
1302     barItemNode->isInToolbar_ = true;
1303     algorithm->Measure(AceType::RawPtr(layoutWrapper));
1304     ASSERT_TRUE(barItemNode->isInToolbar_);
1305 
1306     temp.maxSize = SizeF(300, 300);
1307     barItemLayoutProperty->contentConstraint_ = temp;
1308     barItemLayoutProperty->layoutConstraint_ = temp;
1309     textLayoutWrapper->GetGeometryNode()->SetContentSize(SizeF(500, 500));
1310     ASSERT_EQ(barItemLayoutProperty->CreateChildConstraint().maxSize.Width(), 300);
1311 
1312     barItemNode->isInToolbar_ = true;
1313     algorithm->Measure(AceType::RawPtr(layoutWrapper));
1314     ASSERT_TRUE(barItemNode->isInToolbar_);
1315 }
1316 
1317 /**
1318  * @tc.name: NavrouterTestNg0040
1319  * @tc.desc: Test BarItemLayoutAlgorithm::Layout.
1320  * @tc.type: FUNC
1321  */
1322 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0040, TestSize.Level1)
1323 {
1324     /**
1325      * @tc.steps: step1. create BarItemNode.
1326      */
1327     auto barItemNode = BarItemNode::GetOrCreateBarItemNode(
__anon72a883914202() 1328         V2::BAR_ITEM_ETS_TAG, 1, []() { return AceType::MakeRefPtr<BarItemPattern>(); });
1329     ASSERT_NE(barItemNode, nullptr);
1330     auto barItemPattern = barItemNode->GetPattern<BarItemPattern>();
1331     ASSERT_NE(barItemPattern, nullptr);
1332     barItemPattern->AttachToFrameNode(AceType::WeakClaim(AceType::RawPtr(barItemNode)));
1333     ASSERT_NE(barItemPattern->GetHost(), nullptr);
1334 
1335     auto textNode = FrameNode::CreateFrameNode("text", 3, AceType::MakeRefPtr<TextPattern>());
1336     auto iconNode = FrameNode::CreateFrameNode("icon", 2, AceType::MakeRefPtr<ImagePattern>());
1337 
1338     barItemNode->icon_ = iconNode;
1339     barItemNode->text_ = textNode;
1340 
1341     auto layoutWrapper = barItemNode->CreateLayoutWrapper();
1342     ASSERT_NE(layoutWrapper, nullptr);
1343     auto algorithm = AceType::MakeRefPtr<BarItemLayoutAlgorithm>();
1344     ASSERT_NE(algorithm, nullptr);
1345 
1346     barItemNode->children_.push_back(textNode);
1347     barItemNode->children_.push_back(iconNode);
1348 
1349     auto textLayoutWrapper = textNode->CreateLayoutWrapper();
1350     textLayoutWrapper->GetLayoutProperty()->contentConstraint_ = LayoutConstraintF();
1351     layoutWrapper->GetLayoutProperty()->layoutConstraint_ = LayoutConstraintF();
1352 
1353     auto iconLayoutWrapper = iconNode->CreateLayoutWrapper();
1354     iconLayoutWrapper->GetLayoutProperty()->contentConstraint_ = LayoutConstraintF();
1355 
1356     auto barItemLayoutProperty = AceType::DynamicCast<LayoutProperty>(layoutWrapper->GetLayoutProperty());
1357     barItemLayoutProperty->layoutConstraint_ = LayoutConstraintF();
1358     barItemLayoutProperty->contentConstraint_ = LayoutConstraintF();
1359     ASSERT_EQ(barItemLayoutProperty, layoutWrapper->GetLayoutProperty());
1360 
1361     layoutWrapper->childrenMap_[0] = textLayoutWrapper;
1362     layoutWrapper->childrenMap_[1] = iconLayoutWrapper;
1363     layoutWrapper->currentChildCount_ = 2;
1364     /**
1365      * @tc.steps: step2. create mock theme manager.
1366      */
1367     auto themeManager = AceType::MakeRefPtr<MockThemeManager>();
1368     MockPipelineContext::GetCurrent()->SetThemeManager(themeManager);
1369     auto theme = AceType::MakeRefPtr<NavigationBarTheme>();
1370     EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(theme));
1371     /**
1372      * @tc.steps: step3. call algorithm->Layout then change isInToolbar_.
1373      */
1374     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1375     ASSERT_FALSE(barItemNode->isInToolbar_);
1376 
1377     barItemNode->isInToolbar_ = true;
1378     algorithm->Layout(AceType::RawPtr(layoutWrapper));
1379     ASSERT_TRUE(barItemNode->isInToolbar_);
1380 }
1381 
1382 /**
1383  * @tc.name: NavrouterTestNg0041
1384  * @tc.desc: Test TitleBarLayoutAlgorithm::LayoutMenu
1385  * @tc.type: FUNC
1386  */
1387 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0041, TestSize.Level1)
1388 {
1389     /**
1390      * @tc.steps: step1. create titleBarNode.
1391      */
1392     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883914302() 1393         "titleBarNode", 1, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1394     auto menuNode = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<ButtonPattern>());
__anon72a883914402() 1395     auto parent = NavBarNode::GetOrCreateNavBarNode("parent", 3, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
1396     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
1397     auto layoutWrapper = titleBarNode->CreateLayoutWrapper();
1398     auto titleBarLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
1399     layoutWrapper->layoutProperty_ = titleBarLayoutProperty;
1400 
1401     auto menuWrapper = menuNode->CreateLayoutWrapper();
1402     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
1403     GeometryProperty geo;
1404     geo.rect_ = RectF(0, 0, 20, 20);
1405     geometryNode->frame_ = geo;
1406     geometryNode->parentLayoutConstraint_ = LayoutConstraintF();
1407     menuWrapper->geometryNode_ = geometryNode;
1408     titleBarNode->menu_ = menuNode;
1409     titleBarNode->children_.push_back(menuNode);
1410     layoutWrapper->AppendChild(menuWrapper);
1411     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
1412 
1413     auto pipeline = PipelineContext::GetCurrentContext();
1414     pipeline->minPlatformVersion_ = 10;
1415     algorithm->LayoutMenu(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1416 
1417     titleBarLayoutProperty->propTitleMode_ = NavigationTitleMode::FULL;
1418     algorithm->LayoutMenu(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1419     ASSERT_EQ(titleBarLayoutProperty->propTitleMode_.value(), NavigationTitleMode::FULL);
1420 }
1421 
1422 /**
1423  * @tc.name: NavrouterTestNg0042
1424  * @tc.desc: Test TitleBarLayoutAlgorithm::LayoutSubtitle
1425  * @tc.type: FUNC
1426  */
1427 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0042, TestSize.Level1)
1428 {
1429     /**
1430      * @tc.steps: step1. create titleBarNode.
1431      */
1432     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883914502() 1433         "titleBarNode", 1, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1434     auto subtitle = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<ButtonPattern>());
__anon72a883914602() 1435     auto parent = NavBarNode::GetOrCreateNavBarNode("parent", 3, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
1436     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
1437     auto layoutWrapper = titleBarNode->CreateLayoutWrapper();
1438     auto titleBarLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
1439     layoutWrapper->layoutProperty_ = titleBarLayoutProperty;
1440     auto backButton = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<ButtonPattern>());
1441     backButton->layoutProperty_ = AceType::MakeRefPtr<LayoutProperty>();
1442     backButton->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
1443     titleBarNode->backButton_ = backButton;
1444 
1445     auto subtitleWrapper = subtitle->CreateLayoutWrapper();
1446     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
1447     GeometryProperty geo;
1448     geo.rect_ = RectF(0, 0, 20, 20);
1449     geometryNode->frame_ = geo;
1450     geometryNode->parentLayoutConstraint_ = LayoutConstraintF();
1451     subtitleWrapper->geometryNode_ = geometryNode;
1452     titleBarNode->subtitle_ = subtitle;
1453     titleBarNode->children_.push_back(subtitle);
1454     layoutWrapper->AppendChild(subtitleWrapper);
1455     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
1456 
1457     auto pipeline = PipelineContext::GetCurrentContext();
1458     pipeline->minPlatformVersion_ = 10;
1459     titleBarLayoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
1460     algorithm->LayoutSubtitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1461 
1462     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1463     algorithm->LayoutSubtitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1464     pipeline->minPlatformVersion_ = 9;
1465     algorithm->LayoutSubtitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1466     ASSERT_EQ(titleBarLayoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAV_DESTINATION);
1467 }
1468 
1469 /**
1470  * @tc.name: NavrouterTestNg0043
1471  * @tc.desc: Test TitleBarLayoutAlgorithm::LayoutTitle
1472  * @tc.type: FUNC
1473  */
1474 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0043, TestSize.Level1)
1475 {
1476     /**
1477      * @tc.steps: step1. create titleBarNode.
1478      */
1479     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883914702() 1480         "titleBarNode", 1, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1481     ASSERT_NE(titleBarNode, nullptr);
1482     auto titlePattern = titleBarNode->GetPattern<TitleBarPattern>();
1483     auto title = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<TextPattern>());
1484     auto parent = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883914802() 1485         "parent", 3, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1486     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
1487     auto layoutWrapper = titleBarNode->CreateLayoutWrapper();
1488     auto titleBarLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
1489     layoutWrapper->layoutProperty_ = titleBarLayoutProperty;
1490     auto backButton = FrameNode::CreateFrameNode("menuNode", 4, AceType::MakeRefPtr<ButtonPattern>());
1491     backButton->layoutProperty_ = AceType::MakeRefPtr<LayoutProperty>();
1492     backButton->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
1493     titleBarNode->backButton_ = backButton;
1494 
1495     auto titleWrapper = title->CreateLayoutWrapper();
1496     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
1497     GeometryProperty geo;
1498     geo.rect_ = RectF(0, 0, 20, 20);
1499     geometryNode->frame_ = geo;
1500     geometryNode->parentLayoutConstraint_ = LayoutConstraintF();
1501     titleWrapper->geometryNode_ = geometryNode;
1502     titleBarNode->title_ = title;
1503     titleBarNode->children_.push_back(title);
1504     layoutWrapper->AppendChild(titleWrapper);
1505     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
1506 
1507     auto pipeline = PipelineContext::GetCurrentContext();
1508     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1509     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1510 
1511     backButton->layoutProperty_->propVisibility_ = VisibleType::INVISIBLE;
1512     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1513 
1514     pipeline->minPlatformVersion_ = 10;
1515     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1516 
1517     backButton->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
1518     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1519 
1520     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1521     auto parent2 =
__anon72a883914902() 1522         NavBarNode::GetOrCreateNavBarNode("parent2", 5, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
1523     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent2));
1524     parent2->propPrevTitleIsCustom_ = true;
1525     titleBarLayoutProperty->propTitleMode_ = NavigationTitleMode::MINI;
1526     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1527 
1528     titleBarLayoutProperty->propHideBackButton_ = true;
1529     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1530     pipeline->minPlatformVersion_ = 9;
1531     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1532 
1533     titleBarLayoutProperty->propTitleMode_ = NavigationTitleMode::FULL;
1534     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1535 
1536     pipeline->minPlatformVersion_ = 10;
1537     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1538 
1539     parent2->propPrevTitleIsCustom_ = false;
1540     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1541     ASSERT_TRUE(parent2->propPrevTitleIsCustom_);
1542 
1543     titleBarLayoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
1544     algorithm->isInitialTitle_ = true;
1545     auto temp = title->GetLayoutProperty<TextLayoutProperty>();
1546     ASSERT_NE(temp, nullptr);
1547     temp->propContent_ = "content";
1548     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1549     ASSERT_FALSE(algorithm->isInitialTitle_);
1550 
1551     algorithm->isInitialTitle_ = true;
1552     title->layoutProperty_ = nullptr;
1553     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1554 
1555     algorithm->isInitialTitle_ = true;
1556     parent2->propPrevTitleIsCustom_ = true;
1557     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1558 
1559     algorithm->isInitialTitle_ = false;
1560     titlePattern->tempTitleOffsetY_ = 0.0f;
1561     algorithm->LayoutTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, 40);
1562     ASSERT_FALSE(algorithm->isInitialTitle_);
1563 }
1564 
1565 /**
1566  * @tc.name: NavrouterTestNg0044
1567  * @tc.desc: Test TitleBarLayoutAlgorithm::LayoutBackButton
1568  * @tc.type: FUNC
1569  */
1570 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0044, TestSize.Level1)
1571 {
1572     /**
1573      * @tc.steps: step1. create titleBarNode.
1574      */
1575     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883914a02() 1576         "titleBarNode", 1, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1577     ASSERT_NE(titleBarNode, nullptr);
1578     auto titlePattern = titleBarNode->GetPattern<TitleBarPattern>();
1579     auto backButtonNode = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<TextPattern>());
1580     auto parent = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883914b02() 1581         "parent", 3, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1582     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
1583     auto layoutWrapper = titleBarNode->CreateLayoutWrapper();
1584     auto titleBarLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
1585     layoutWrapper->layoutProperty_ = titleBarLayoutProperty;
1586     auto backButton = FrameNode::CreateFrameNode("menuNode", 4, AceType::MakeRefPtr<ButtonPattern>());
1587     backButton->layoutProperty_ = AceType::MakeRefPtr<LayoutProperty>();
1588     backButton->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
1589     titleBarNode->backButton_ = backButton;
1590 
1591     auto backButtonWrapper = backButtonNode->CreateLayoutWrapper();
1592     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
1593     GeometryProperty geo;
1594     geo.rect_ = RectF(0, 0, 20, 20);
1595     geometryNode->frame_ = geo;
1596     geometryNode->parentLayoutConstraint_ = LayoutConstraintF();
1597     backButtonWrapper->geometryNode_ = geometryNode;
1598     titleBarNode->backButton_ = backButtonNode;
1599     titleBarNode->children_.push_back(backButtonNode);
1600     layoutWrapper->AppendChild(backButtonWrapper);
1601     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
1602 
1603     auto pipeline = PipelineContext::GetCurrentContext();
1604     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1605     algorithm->LayoutBackButton(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty);
1606     ASSERT_EQ(pipeline->minPlatformVersion_, 10);
1607 }
1608 
1609 /**
1610  * @tc.name: NavrouterTestNg0045
1611  * @tc.desc: Test TitleBarLayoutAlgorithm::MeasureTitle
1612  * @tc.type: FUNC
1613  */
1614 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0045, TestSize.Level1)
1615 {
1616     /**
1617      * @tc.steps: step1. create titleBarNode.
1618      */
1619     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883914c02() 1620         "titleBarNode", 1, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1621     ASSERT_NE(titleBarNode, nullptr);
1622     auto titlePattern = titleBarNode->GetPattern<TitleBarPattern>();
1623     auto title = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<TextPattern>());
1624     auto parent = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883914d02() 1625         "parent", 3, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1626     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
1627     auto layoutWrapper = titleBarNode->CreateLayoutWrapper();
1628     auto titleBarLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
1629     layoutWrapper->layoutProperty_ = titleBarLayoutProperty;
1630     auto backButton = FrameNode::CreateFrameNode("menuNode", 4, AceType::MakeRefPtr<ButtonPattern>());
1631     backButton->layoutProperty_ = AceType::MakeRefPtr<LayoutProperty>();
1632     backButton->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
1633     titleBarNode->backButton_ = backButton;
1634 
1635     auto titleWrapper = title->CreateLayoutWrapper();
1636     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
1637     GeometryProperty geo;
1638     geo.rect_ = RectF(0, 0, 20, 20);
1639     geometryNode->frame_ = geo;
1640     geometryNode->parentLayoutConstraint_ = LayoutConstraintF();
1641     titleWrapper->geometryNode_ = geometryNode;
1642     titleBarNode->title_ = title;
1643     titleBarNode->children_.push_back(title);
1644     layoutWrapper->AppendChild(titleWrapper);
1645     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
1646 
1647     auto pipeline = PipelineContext::GetCurrentContext();
1648     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1649     algorithm->MeasureTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, SizeF(40, 40), 40);
1650 
1651     titleBarNode->subtitle_ = FrameNode::CreateFrameNode("subTitle", 6, AceType::MakeRefPtr<TextPattern>());
1652     algorithm->MeasureTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, SizeF(40, 40), 40);
1653 
1654     parent->propPrevTitleIsCustom_ = true;
1655     algorithm->MeasureTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, SizeF(40, 40), 40);
1656 
1657     auto parent2 =
__anon72a883914e02() 1658         NavBarNode::GetOrCreateNavBarNode("parent2", 5, []() { return AceType::MakeRefPtr<NavBarPattern>(); });
1659     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent2));
1660     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAVBAR;
1661     titleBarLayoutProperty->propTitleHeight_ = Dimension();
1662     algorithm->MeasureTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, SizeF(40, 40), 40);
1663     ASSERT_EQ(titleBarLayoutProperty->propTitleBarParentType_.value(), TitleBarParentType::NAVBAR);
1664 
1665     parent2->propPrevTitleIsCustom_ = true;
1666     titleBarLayoutProperty->propTitleHeight_ = std::nullopt;
1667     titleBarNode->subtitle_ = nullptr;
1668     titleBarLayoutProperty->propTitleMode_ = NavigationTitleMode::FREE;
1669     algorithm->MeasureTitle(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty, SizeF(40, 40), 40);
1670     ASSERT_EQ(pipeline->minPlatformVersion_, 10);
1671 }
1672 
1673 /**
1674  * @tc.name: NavrouterTestNg0046
1675  * @tc.desc: Test TitleBarLayoutAlgorithm::LayoutTitle
1676  * @tc.type: FUNC
1677  */
1678 HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0046, TestSize.Level1)
1679 {
1680     /**
1681      * @tc.steps: step1. create titleBarNode.
1682      */
1683     auto titleBarNode = TitleBarNode::GetOrCreateTitleBarNode(
__anon72a883914f02() 1684         "titleBarNode", 1, []() { return AceType::MakeRefPtr<TitleBarPattern>(); });
1685     ASSERT_NE(titleBarNode, nullptr);
1686     auto titlePattern = titleBarNode->GetPattern<TitleBarPattern>();
1687     auto title = FrameNode::CreateFrameNode("menuNode", 2, AceType::MakeRefPtr<TextPattern>());
1688     auto parent = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883915002() 1689         "parent", 3, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1690     titleBarNode->parent_ = AceType::WeakClaim(AceType::RawPtr(parent));
1691     auto layoutWrapper = titleBarNode->CreateLayoutWrapper();
1692     auto titleBarLayoutProperty = AceType::MakeRefPtr<TitleBarLayoutProperty>();
1693     layoutWrapper->layoutProperty_ = titleBarLayoutProperty;
1694     auto backButton = FrameNode::CreateFrameNode("menuNode", 4, AceType::MakeRefPtr<ButtonPattern>());
1695     backButton->layoutProperty_ = AceType::MakeRefPtr<LayoutProperty>();
1696     backButton->layoutProperty_->propVisibility_ = VisibleType::VISIBLE;
1697     titleBarNode->backButton_ = backButton;
1698 
1699     auto titleWrapper = title->CreateLayoutWrapper();
1700     auto geometryNode = AceType::MakeRefPtr<GeometryNode>();
1701     GeometryProperty geo;
1702     geo.rect_ = RectF(0, 0, 20, 20);
1703     geometryNode->frame_ = geo;
1704     geometryNode->parentLayoutConstraint_ = LayoutConstraintF();
1705     titleWrapper->geometryNode_ = geometryNode;
1706     titleBarNode->title_ = title;
1707     titleBarNode->children_.push_back(title);
1708     layoutWrapper->AppendChild(titleWrapper);
1709     auto algorithm = AceType::MakeRefPtr<TitleBarLayoutAlgorithm>();
1710 
1711     auto pipeline = PipelineContext::GetCurrentContext();
1712     pipeline->minPlatformVersion_ = 10;
1713     titleBarLayoutProperty->propTitleBarParentType_ = TitleBarParentType::NAV_DESTINATION;
1714     algorithm->GetTitleWidth(titleBarNode, titleBarLayoutProperty, SizeF());
1715     ASSERT_EQ(backButton->layoutProperty_->propVisibility_.value(), VisibleType::VISIBLE);
1716 
1717     backButton->layoutProperty_->propVisibility_ = VisibleType::INVISIBLE;
1718     algorithm->GetTitleWidth(titleBarNode, titleBarLayoutProperty, SizeF());
1719     ASSERT_EQ(backButton->layoutProperty_->propVisibility_.value(), VisibleType::INVISIBLE);
1720 
1721     titleBarNode->children_.push_back(backButton);
1722     auto backButtonWrapper = backButton->CreateLayoutWrapper();
1723     layoutWrapper->AppendChild(backButtonWrapper);
1724     algorithm->MeasureBackButton(AceType::RawPtr(layoutWrapper), titleBarNode, titleBarLayoutProperty);
1725     ASSERT_EQ(pipeline->minPlatformVersion_, 10);
1726 }
1727 
1728 /**
1729  * @tc.name: AccessibilityTest001
1730  * @tc.desc: Test navdestination "backbutton" and "more" button.
1731  * @tc.type: FUNC
1732  */
1733 HWTEST_F(NavrouterModelTestNg, AccessibilityTest001, TestSize.Level1)
1734 {
1735     auto navdestinationNode = NavDestinationGroupNode::GetOrCreateGroupNode(
__anon72a883915102() 1736         "navDestinationNode", 3, []() { return AceType::MakeRefPtr<NavDestinationPattern>(); });
1737     auto titleBarNode = AceType::MakeRefPtr<TitleBarNode>("TitleBarNode", 66, AceType::MakeRefPtr<TitleBarPattern>());
1738     auto backButtonNode = FrameNode::CreateFrameNode(
1739         V2::BACK_BUTTON_ETS_TAG, 7, AceType::MakeRefPtr<ButtonPattern>());
1740     titleBarNode->backButton_ = backButtonNode;
1741     navdestinationNode->titleBarNode_ = titleBarNode;
1742     auto titleNode = AceType::DynamicCast<TitleBarNode>(navdestinationNode->GetTitleBarNode());
1743     ASSERT_NE(titleNode, nullptr);
1744     EXPECT_NE(titleNode->GetBackButton(), nullptr);
1745 
1746     auto AccessibilityProperty1 = backButtonNode->GetAccessibilityProperty<AccessibilityProperty>();
1747     AccessibilityProperty1->SetAccessibilityGroup(true);
1748     AccessibilityProperty1->SetAccessibilityText("NavdestinationBackbutton");
1749     auto text1 = AccessibilityProperty1->GetAccessibilityText();
1750     EXPECT_EQ(text1, "NavdestinationBackbutton");
1751 
1752     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
1753     auto menuNode = AceType::MakeRefPtr<FrameNode>(V2::BAR_ITEM_ETS_TAG, nodeId, AceType::MakeRefPtr<Pattern>());
1754     ASSERT_NE(menuNode, nullptr);
1755     titleBarNode->SetMenu(menuNode);
1756     auto AccessibilityProperty2 = menuNode->GetAccessibilityProperty<AccessibilityProperty>();
1757     AccessibilityProperty2->SetAccessibilityGroup(true);
1758     AccessibilityProperty2->SetAccessibilityText("NavdestinationMenu");
1759     auto text2 = AccessibilityProperty2->GetAccessibilityText();
1760     EXPECT_EQ(text2, "NavdestinationMenu");
1761 }
1762 } // namespace OHOS::Ace::NG
1763