From 51c3b7dfff22c518c9371e2852024747c6507a60 Mon Sep 17 00:00:00 2001 From: zhangdw521 Date: Fri, 15 Aug 2025 19:38:26 +0800 Subject: [PATCH] disable placeholder or divider Signed-off-by: zhangdw521 Change-Id: I09aa5b16677bb1d7331f69ea83fb2d4fd1a3ef5b Signed-off-by: zhangdw521 --- .gitee/CODEOWNERS | 1 + adapter/ohos/entrance/ui_content_impl.cpp | 7 +- .../common/force_split/force_split_utils.cpp | 24 +- .../common/force_split/force_split_utils.h | 2 + .../manager/navigation/navigation_manager.h | 19 ++ .../navigation_layout_algorithm.cpp | 25 ++- .../navigation/navigation_model_ng.cpp | 2 +- .../pattern/navigation/navigation_pattern.cpp | 39 ++-- frameworks/core/pipeline/pipeline_base.cpp | 5 +- test/unittest/core/common/BUILD.gn | 1 + .../unittest/core/common/force_split/BUILD.gn | 20 ++ .../force_split/force_split_utils_test.cpp | 206 ++++++++++++++++++ 12 files changed, 317 insertions(+), 34 deletions(-) create mode 100644 test/unittest/core/common/force_split/BUILD.gn create mode 100644 test/unittest/core/common/force_split/force_split_utils_test.cpp diff --git a/.gitee/CODEOWNERS b/.gitee/CODEOWNERS index 0e454546331..bd2e464600d 100644 --- a/.gitee/CODEOWNERS +++ b/.gitee/CODEOWNERS @@ -3215,6 +3215,7 @@ test/unittest/core/common/ace_engine/ @arkuiframework test/unittest/core/common/asset/ @arkuiframework test/unittest/core/common/clipboard/ @huawei_g_five test/unittest/core/common/environment/ @arkuistatemgmt +test/unittest/core/common/force_split/ @arkui_superman test/unittest/core/common/ime/ @huawei_g_five test/unittest/core/common/others/ @arkuiframework test/unittest/core/common/plugin/ @arkuiabilitygroup diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index 93e79190542..ef70b54da94 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -5510,14 +5510,17 @@ void UIContentImpl::SetForceSplitConfig(const std::string& configJsonStr) return; } TAG_LOGI(AceLogTag::ACE_NAVIGATION, "ForceSplitConfig: enableHook:%{public}d, navId:%{public}s," - "navDepth:%{public}s", config.isArkUIHookEnabled, + "navDepth:%{public}s, disablePlaceholder:%{public}d, disableDivider:%{public}d", config.isArkUIHookEnabled, (config.navigationId.has_value() ? config.navigationId.value().c_str() : "NA"), - (config.navigationDepth.has_value() ? std::to_string(config.navigationDepth.value()).c_str() : "NA")); + (config.navigationDepth.has_value() ? std::to_string(config.navigationDepth.value()).c_str() : "NA"), + config.navigationDisablePlaceholder, config.navigationDisableDivider); context->SetIsArkUIHookEnabled(config.isArkUIHookEnabled); auto navManager = context->GetNavigationManager(); CHECK_NULL_VOID(navManager); navManager->SetForceSplitNavigationId(config.navigationId); navManager->SetForceSplitNavigationDepth(config.navigationDepth); + navManager->SetPlaceholderDisabled(config.navigationDisablePlaceholder); + navManager->SetDividerDisabled(config.navigationDisableDivider); } void UIContentImpl::ProcessDestructCallbacks() diff --git a/frameworks/core/common/force_split/force_split_utils.cpp b/frameworks/core/common/force_split/force_split_utils.cpp index 6270ac7f465..a3dde9eb6c3 100644 --- a/frameworks/core/common/force_split/force_split_utils.cpp +++ b/frameworks/core/common/force_split/force_split_utils.cpp @@ -43,6 +43,8 @@ constexpr char ENABLE_HOOK_KEY[] = "enableHook"; constexpr char NAVIGATION_OPTIONS_KEY[] = "navigationOptions"; constexpr char NAVIGATION_OPTIONS_ID_KEY[] = "id"; constexpr char NAVIGATION_OPTIONS_DEPTH_KEY[] = "depth"; +constexpr char NAVIGATION_OPTIONS_DISABLE_PLACEHOLDER_KEY[] = "disablePlaceholder"; +constexpr char NAVIGATION_OPTIONS_DISABLE_DIVIDER_KEY[] = "disableDivider"; } RefPtr ForceSplitUtils::CreatePlaceHolderContent(const RefPtr& context) @@ -232,8 +234,12 @@ RefPtr ForceSplitUtils::CreatePlaceHolderNode() bool ForceSplitUtils::ParseForceSplitConfig(const std::string& configJsonStr, ForceSplitConfig& config) { + TAG_LOGI(AceLogTag::ACE_NAVIGATION, "parse forceSplit config: %{public}s", configJsonStr.c_str()); auto configJson = JsonUtil::ParseJsonString(configJsonStr); - if (!configJson || !configJson->IsObject()) { + if (!configJson) { + return false; + } + if (!configJson->IsObject()) { TAG_LOGE(AceLogTag::ACE_NAVIGATION, "Error, arkUIOptions is an invalid json object!"); return false; } @@ -265,6 +271,22 @@ bool ForceSplitUtils::ParseForceSplitConfig(const std::string& configJsonStr, Fo } config.navigationDepth = navOptions->GetInt(NAVIGATION_OPTIONS_DEPTH_KEY); } + if (navOptions->Contains(NAVIGATION_OPTIONS_DISABLE_PLACEHOLDER_KEY)) { + auto disablePlaceholderJson = navOptions->GetValue(NAVIGATION_OPTIONS_DISABLE_PLACEHOLDER_KEY); + if (!disablePlaceholderJson->IsBool()) { + TAG_LOGE(AceLogTag::ACE_NAVIGATION, "Error, navigationOptions.disablePlaceholder is not bool!"); + return false; + } + config.navigationDisablePlaceholder = disablePlaceholderJson->GetBool(); + } + if (navOptions->Contains(NAVIGATION_OPTIONS_DISABLE_DIVIDER_KEY)) { + auto disableDividerJson = navOptions->GetValue(NAVIGATION_OPTIONS_DISABLE_DIVIDER_KEY); + if (!disableDividerJson->IsBool()) { + TAG_LOGE(AceLogTag::ACE_NAVIGATION, "Error, navigationOptions.disableDivider is not bool!"); + return false; + } + config.navigationDisableDivider = disableDividerJson->GetBool(); + } return true; } } // namespace OHOS::Ace::NG diff --git a/frameworks/core/common/force_split/force_split_utils.h b/frameworks/core/common/force_split/force_split_utils.h index c8618cfb1e5..dfb92f9c995 100644 --- a/frameworks/core/common/force_split/force_split_utils.h +++ b/frameworks/core/common/force_split/force_split_utils.h @@ -26,6 +26,8 @@ class NavBarNode; struct ForceSplitConfig { bool isArkUIHookEnabled = false; + bool navigationDisablePlaceholder = false; + bool navigationDisableDivider = false; std::optional navigationId; std::optional navigationDepth; }; diff --git a/frameworks/core/components_ng/manager/navigation/navigation_manager.h b/frameworks/core/components_ng/manager/navigation/navigation_manager.h index c5a846af804..95afe05155b 100644 --- a/frameworks/core/components_ng/manager/navigation/navigation_manager.h +++ b/frameworks/core/components_ng/manager/navigation/navigation_manager.h @@ -282,7 +282,24 @@ public: { return forceSplitNavigationDepth_; } + void SetPlaceholderDisabled(bool disable) + { + disablePlaceholder_ = disable; + } + bool IsPlaceholderDisabled() const + { + return disablePlaceholder_; + } + void SetDividerDisabled(bool disable) + { + disableDivider_ = disable; + } + bool IsDividerDisabled() const + { + return disableDivider_; + } //-------force split end------- + private: struct DumpMapKey { int32_t nodeId; @@ -342,6 +359,8 @@ private: std::pair existForceSplitNav_ = DEFAULT_EXIST_FORCESPLIT_NAV_VALUE; std::optional forceSplitNavigationId_; std::optional forceSplitNavigationDepth_; + bool disablePlaceholder_ = false; + bool disableDivider_ = false; //-------force split end------- }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_layout_algorithm.cpp index 70d12cbacdc..926bd227d26 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_layout_algorithm.cpp @@ -44,6 +44,16 @@ bool IsNavBarVisible(const RefPtr& navigation) return navBarProperty->GetVisibilityValue(VisibleType::INVISIBLE) == VisibleType::VISIBLE; } +bool IsDividerDisabled(const RefPtr& host) +{ + CHECK_NULL_RETURN(host, false); + auto context = host->GetContext(); + CHECK_NULL_RETURN(context, false); + auto mgr = context->GetNavigationManager(); + CHECK_NULL_RETURN(mgr, false); + return mgr->IsDividerDisabled(); +} + void MeasureDivider(LayoutWrapper* layoutWrapper, const RefPtr& hostNode, const RefPtr& navigationLayoutProperty, const SizeF& dividerSize) { @@ -576,7 +586,7 @@ void NavigationLayoutAlgorithm::SizeCalculationForForceSplit( LayoutWrapper* layoutWrapper, const RefPtr& hostNode, const RefPtr& navigationLayoutProperty, const SizeF& frameSize) { - auto dividerWidth = static_cast(DIVIDER_WIDTH.ConvertToPx()); + auto dividerWidth = IsDividerDisabled(hostNode) ? 0.0f : static_cast(DIVIDER_WIDTH.ConvertToPx()); dividerSize_ = SizeF(dividerWidth, frameSize.Height()); auto halfWidth = (frameSize.Width() - dividerWidth) / 2.0f; navBarSize_ = SizeF(halfWidth, frameSize.Height()); @@ -628,7 +638,7 @@ void NavigationLayoutAlgorithm::SizeCalculationSplit(const RefPtrGetLayoutConstraint().value(), Axis::HORIZONTAL, MeasureType::MATCH_PARENT); auto navBarWidthValue = navigationLayoutProperty->GetNavBarWidthValue(DEFAULT_NAV_BAR_WIDTH); auto userSetNavBarWidth = navBarWidthValue.ConvertToPxWithSize(parentSize.Width().value_or(0.0f)); - auto dividerWidth = static_cast(DIVIDER_WIDTH.ConvertToPx()); + auto dividerWidth = IsDividerDisabled(hostNode) ? 0.0f : static_cast(DIVIDER_WIDTH.ConvertToPx()); auto minNavBarWidth = minNavBarWidthValue_.ConvertToPxWithSize(parentSize.Width().value_or(0.0f)); auto minContentWidth = minContentWidthValue_.ConvertToPxWithSize(parentSize.Width().value_or(0.0f)); realContentWidth_ = minContentWidth; @@ -856,7 +866,9 @@ void NavigationLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) } MeasureContentChild(layoutWrapper, hostNode, navigationLayoutProperty, contentSize_); - MeasureDivider(layoutWrapper, hostNode, navigationLayoutProperty, dividerSize_); + if (!IsDividerDisabled(hostNode)) { + MeasureDivider(layoutWrapper, hostNode, navigationLayoutProperty, dividerSize_); + } MeasureDragBar(layoutWrapper, hostNode, navigationLayoutProperty, dividerSize_); MeasureSplitPlaceholder(layoutWrapper, hostNode, navigationLayoutProperty, contentSize_); @@ -893,8 +905,11 @@ void NavigationLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) layoutWrapper, hostNode, navigationLayoutProperty, navBarPosition, navBarOffset); } - float dividerWidth = LayoutDivider( - layoutWrapper, hostNode, navigationLayoutProperty, navBarOrPrimarNodeWidth, navBarPosition); + float dividerWidth = 0.0f; + if (!IsDividerDisabled(hostNode)) { + dividerWidth = LayoutDivider( + layoutWrapper, hostNode, navigationLayoutProperty, navBarOrPrimarNodeWidth, navBarPosition); + } auto splitPlaceholderOffsetX = navBarOrPrimarNodeWidth + dividerWidth; LayoutSplitPalceholderContent( layoutWrapper, hostNode, navigationLayoutProperty, splitPlaceholderOffsetX, navBarPosition); diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp index 523fcce0697..db5a722754b 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_model_ng.cpp @@ -305,7 +305,7 @@ bool NavigationModelNG::CreateForceSplitPlaceHolderIfNeeded(const RefPtrGetNavigationManager(); CHECK_NULL_RETURN(manager, false); - if (!manager->IsForceSplitSupported()) { + if (!manager->IsForceSplitSupported() || manager->IsPlaceholderDisabled()) { return true; } if (navigationGroupNode->GetForceSplitPlaceHolderNode()) { diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp index 56b7cf9b91d..169e2781e5c 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp @@ -1079,6 +1079,8 @@ void NavigationPattern::RecognizeHomePageIfNeeded() navBarIsHome_ = true; return; } + } else { + navBarIsHome_ = false; } for (const auto& node : allDestNodes) { @@ -5280,9 +5282,7 @@ void NavigationPattern::AdjustNodeForDestForceSplit(bool needFireLifecycle) auto primaryProperty = primaryContentNode->GetLayoutProperty(); CHECK_NULL_VOID(primaryProperty); auto phNode = AceType::DynamicCast(host->GetForceSplitPlaceHolderNode()); - CHECK_NULL_VOID(phNode); - auto phProperty = phNode->GetLayoutProperty(); - CHECK_NULL_VOID(phProperty); + RefPtr phProperty = phNode ? phNode->GetLayoutProperty() : nullptr; auto prePrimaryNodes = primaryNodes_; primaryNodes_.clear(); @@ -5292,9 +5292,10 @@ void NavigationPattern::AdjustNodeForDestForceSplit(bool needFireLifecycle) GetNavDestinationsAndHomeIndex(destNodes, homeIndex); if (destNodes.empty()) { navBarProperty->UpdateVisibility(hideNavBar ? VisibleType::INVISIBLE : VisibleType::VISIBLE); - phProperty->UpdateVisibility(VisibleType::VISIBLE); primaryProperty->UpdateVisibility(VisibleType::INVISIBLE); navContentProperty->UpdateVisibility(VisibleType::INVISIBLE); + CHECK_NULL_VOID(phProperty); + phProperty->UpdateVisibility(VisibleType::VISIBLE); return; } @@ -5314,13 +5315,10 @@ void NavigationPattern::AdjustNodeForDestForceSplit(bool needFireLifecycle) } UpdatePrimaryContentIfNeeded(primaryContentNode, prePrimaryNodes); - if (primaryNodes_.empty() || primaryNodes_.back().Upgrade() != destNodes.back()) { - phProperty->UpdateVisibility(VisibleType::INVISIBLE); - navContentProperty->UpdateVisibility(VisibleType::VISIBLE); - } else { - phProperty->UpdateVisibility(VisibleType::VISIBLE); - navContentProperty->UpdateVisibility(VisibleType::INVISIBLE); - } + bool navContentIsVisible = primaryNodes_.empty() || primaryNodes_.back().Upgrade() != destNodes.back(); + navContentProperty->UpdateVisibility(navContentIsVisible ? VisibleType::VISIBLE : VisibleType::INVISIBLE); + CHECK_NULL_VOID(phProperty); + phProperty->UpdateVisibility(navContentIsVisible ? VisibleType::INVISIBLE : VisibleType::VISIBLE); } void NavigationPattern::AdjustPrimaryAndProxyNodePosition( @@ -5398,10 +5396,7 @@ void NavigationPattern::AdjustNodeForNonDestForceSplit(bool needFireLifecycle) CHECK_NULL_VOID(navContentProperty); auto primaryContentNode = AceType::DynamicCast(host->GetPrimaryContentNode()); CHECK_NULL_VOID(primaryContentNode); - auto phNode = AceType::DynamicCast(host->GetForceSplitPlaceHolderNode()); - CHECK_NULL_VOID(phNode); - auto phProperty = phNode->GetLayoutProperty(); - CHECK_NULL_VOID(phProperty); + if (needFireLifecycle) { FirePrimaryNodesLifecycle(NavDestinationLifecycle::ON_HIDE); } @@ -5419,13 +5414,13 @@ void NavigationPattern::AdjustNodeForNonDestForceSplit(bool needFireLifecycle) bool hideNavBar = navProperty->GetHideNavBarValue(false); navBarProperty->UpdateVisibility(hideNavBar ? VisibleType::INVISIBLE : VisibleType::VISIBLE); } - if (forceSplitSuccess_ && stackNodePairs.empty()) { - phProperty->UpdateVisibility(VisibleType::VISIBLE); - navContentProperty->UpdateVisibility(VisibleType::INVISIBLE); - } else { - phProperty->UpdateVisibility(VisibleType::INVISIBLE); - navContentProperty->UpdateVisibility(VisibleType::VISIBLE); - } + bool placeHolderIsVisible = forceSplitSuccess_ && stackNodePairs.empty(); + navContentProperty->UpdateVisibility(placeHolderIsVisible ? VisibleType::INVISIBLE : VisibleType::VISIBLE); + auto phNode = AceType::DynamicCast(host->GetForceSplitPlaceHolderNode()); + CHECK_NULL_VOID(phNode); + auto phProperty = phNode->GetLayoutProperty(); + CHECK_NULL_VOID(phProperty); + phProperty->UpdateVisibility(placeHolderIsVisible ? VisibleType::VISIBLE : VisibleType::INVISIBLE); } bool NavigationPattern::IsHideNavBarInForceSplitModeNeeded() diff --git a/frameworks/core/pipeline/pipeline_base.cpp b/frameworks/core/pipeline/pipeline_base.cpp index 8b7445a8ace..fd0e1a3fffc 100644 --- a/frameworks/core/pipeline/pipeline_base.cpp +++ b/frameworks/core/pipeline/pipeline_base.cpp @@ -216,9 +216,8 @@ double PipelineBase::CalcPageWidth(double rootWidth) const if (!IsArkUIHookEnabled() || !isCurrentInForceSplitMode_) { return rootWidth; } - // Divider Width equal to 1.0_vp - constexpr double HALF = 2.0; - return (rootWidth - Vp2PxInner(1.0)) / HALF; + + return rootWidth / 2.0; } double PipelineBase::GetPageWidth() const diff --git a/test/unittest/core/common/BUILD.gn b/test/unittest/core/common/BUILD.gn index 2aa26494eee..03bbc979091 100644 --- a/test/unittest/core/common/BUILD.gn +++ b/test/unittest/core/common/BUILD.gn @@ -44,6 +44,7 @@ group("core_common_unittest") { testonly = true deps = [ ":common_test", + "force_split:force_split_utils_test", "form:form_manager_test", "ime:ime_test", "key_event_manager:key_event_manager_test", diff --git a/test/unittest/core/common/force_split/BUILD.gn b/test/unittest/core/common/force_split/BUILD.gn new file mode 100644 index 00000000000..e1a055e16ae --- /dev/null +++ b/test/unittest/core/common/force_split/BUILD.gn @@ -0,0 +1,20 @@ +# Copyright (c) 2025 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//foundation/arkui/ace_engine/test/unittest/ace_unittest.gni") + +ace_unittest("force_split_utils_test") { + type = "new" + module_output = "common" + sources = [ "force_split_utils_test.cpp" ] +} diff --git a/test/unittest/core/common/force_split/force_split_utils_test.cpp b/test/unittest/core/common/force_split/force_split_utils_test.cpp new file mode 100644 index 00000000000..8c1f8171ec9 --- /dev/null +++ b/test/unittest/core/common/force_split/force_split_utils_test.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "gtest/gtest.h" + +#define private public +#define protected public + +#include "core/common/force_split/force_split_utils.h" +#include "test/mock/base/mock_task_executor.h" +#include "test/mock/core/pipeline/mock_pipeline_context.h" + +#undef private +#undef protected + +using namespace testing; +using namespace testing::ext; + +namespace OHOS::Ace { +class ForceSplitUtilsTest : public testing::Test { +public: + static void SetUpTestSuite(); + static void TearDownTestSuite(); +}; + +void ForceSplitUtilsTest::SetUpTestSuite() +{ + NG::MockPipelineContext::SetUp(); +} + +void ForceSplitUtilsTest::TearDownTestSuite() +{ + NG::MockPipelineContext::TearDown(); +} + +/** + * @tc.name: ParseForceSplitConfig001 + * @tc.desc: Branch: if (!configJson) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig001, TestSize.Level1) +{ + std::string configStr = ""; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); +} + +/** + * @tc.name: ParseForceSplitConfig002 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig002, TestSize.Level1) +{ + std::string configStr = "[ ]"; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); +} + +/** + * @tc.name: ParseForceSplitConfig003 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => false + * if (!configJson->Contains(NAVIGATION_OPTIONS_KEY)) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig003, TestSize.Level1) +{ + std::string configStr = "{ \"enableHook\": true }"; + NG::ForceSplitConfig config; + config.isArkUIHookEnabled = false; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_TRUE(ret); + EXPECT_TRUE(config.isArkUIHookEnabled); +} + +/** + * @tc.name: ParseForceSplitConfig004 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => false + * if (!configJson->Contains(NAVIGATION_OPTIONS_KEY)) { => false + * if (!navOptions || !navOptions->IsObject()) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig004, TestSize.Level1) +{ + std::string configStr = "{ \"navigationOptions\": [] }"; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); +} + +/** + * @tc.name: ParseForceSplitConfig005 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => false + * if (!configJson->Contains(NAVIGATION_OPTIONS_KEY)) { => false + * if (!navOptions || !navOptions->IsObject()) { => false + * if (navOptions->Contains(NAVIGATION_OPTIONS_ID_KEY)) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig005, TestSize.Level1) +{ + std::string configStr = "{ \"navigationOptions\": { \"id\": true } }"; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); + EXPECT_FALSE(config.navigationId.has_value()); + + configStr = "{ \"navigationOptions\": { \"id\": \"\" } }"; + ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_TRUE(ret); + EXPECT_FALSE(config.navigationId.has_value()); + + configStr = "{ \"navigationOptions\": { \"id\": \"myNavId\" } }"; + ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_TRUE(ret); + EXPECT_TRUE(config.navigationId.has_value()); + EXPECT_EQ(config.navigationId.value(), "myNavId"); +} + +/** + * @tc.name: ParseForceSplitConfig006 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => false + * if (!configJson->Contains(NAVIGATION_OPTIONS_KEY)) { => false + * if (!navOptions || !navOptions->IsObject()) { => false + * if (navOptions->Contains(NAVIGATION_OPTIONS_DEPTH_KEY)) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig006, TestSize.Level1) +{ + std::string configStr = "{ \"navigationOptions\": { \"depth\": true } }"; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); + EXPECT_FALSE(config.navigationDepth.has_value()); + + configStr = "{ \"navigationOptions\": { \"depth\": 3 } }"; + ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_TRUE(ret); + EXPECT_TRUE(config.navigationDepth.has_value()); + EXPECT_EQ(config.navigationDepth.value(), 3); +} + +/** + * @tc.name: ParseForceSplitConfig007 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => false + * if (!configJson->Contains(NAVIGATION_OPTIONS_KEY)) { => false + * if (!navOptions || !navOptions->IsObject()) { => false + * if (navOptions->Contains(NAVIGATION_OPTIONS_DISABLE_PLACEHOLDER_KEY)) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig007, TestSize.Level1) +{ + std::string configStr = "{ \"navigationOptions\": { \"disablePlaceholder\": 123 } }"; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); + + configStr = "{ \"navigationOptions\": { \"disablePlaceholder\": true } }"; + config.navigationDisablePlaceholder = false; + ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_TRUE(ret); + EXPECT_TRUE(config.navigationDisablePlaceholder); +} + +/** + * @tc.name: ParseForceSplitConfig008 + * @tc.desc: Branch: if (!configJson) { => false + * if (!configJson->IsObject()) { => false + * if (!configJson->Contains(NAVIGATION_OPTIONS_KEY)) { => false + * if (!navOptions || !navOptions->IsObject()) { => false + * if (navOptions->Contains(NAVIGATION_OPTIONS_DISABLE_DIVIDER_KEY)) { => true + * @tc.type: FUNC + */ +HWTEST_F(ForceSplitUtilsTest, ParseForceSplitConfig008, TestSize.Level1) +{ + std::string configStr = "{ \"navigationOptions\": { \"disableDivider\": 123 } }"; + NG::ForceSplitConfig config; + auto ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_FALSE(ret); + + configStr = "{ \"navigationOptions\": { \"disableDivider\": true } }"; + config.navigationDisableDivider = false; + ret = NG::ForceSplitUtils::ParseForceSplitConfig(configStr, config); + EXPECT_TRUE(ret); + EXPECT_TRUE(config.navigationDisableDivider); +} +} // namespace OHOS::Ace -- Gitee