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