From 4ea79f7bbb9b15d988713d1ebf82688ab548e12a Mon Sep 17 00:00:00 2001 From: sunxuhui Date: Thu, 3 Jul 2025 22:21:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dradio=E7=BB=84=E4=BB=B6matchp?= =?UTF-8?q?arent=E5=90=8Eimage=E8=8A=82=E7=82=B9=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=20Signed-off-by:=20sunxuhui=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pattern/radio/radio_layout_algorithm.cpp | 8 +- .../pattern/radio/radio_layout_algorithm.h | 1 + .../pattern/radio/radio_pattern.cpp | 13 +- .../pattern/radio/radio_pattern.h | 2 + .../pattern/checkbox/checkbox_test_ng.cpp | 141 +++++++++++++++++- .../checkboxgroup/checkboxgroup_test_ng.cpp | 117 ++++++++++++++- .../core/pattern/radio/radio_test_ng.cpp | 111 +++++++++++++- .../core/pattern/rating/rating_test_ng.cpp | 134 ++++++++++++++++- .../pattern/toggle/toggle_switch_test_ng.cpp | 124 ++++++++++++++- 9 files changed, 638 insertions(+), 13 deletions(-) diff --git a/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.cpp index 8727da400f0..f27e40612f4 100644 --- a/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.cpp @@ -44,7 +44,8 @@ std::optional RadioLayoutAlgorithm::MeasureContent( auto layoutPolicy = GetLayoutPolicy(layoutWrapper); if (layoutPolicy.has_value() && layoutPolicy->IsMatch()) { - return LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, layoutWrapper); + realSize_ = LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, layoutWrapper); + return realSize_; } // Case 1: Width and height are set in the front end. @@ -100,6 +101,11 @@ void RadioLayoutAlgorithm::Measure(LayoutWrapper* layoutWrapper) childConstraint.percentReference.SetSizeT(contentSize); } for (auto &&child : layoutWrapper->GetAllChildrenWithBuild()) { + auto layoutPolicy = GetLayoutPolicy(layoutWrapper); + if (layoutPolicy.has_value() && layoutPolicy->IsMatch() && realSize_) { + childConstraint.selfIdealSize.SetWidth(realSize_->Width() * DEFAULT_RADIO_IMAGE_SCALE); + childConstraint.selfIdealSize.SetHeight(realSize_->Height() * DEFAULT_RADIO_IMAGE_SCALE); + } child->Measure(childConstraint); } PerformMeasureSelf(layoutWrapper); diff --git a/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.h b/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.h index 958108e2042..286f20dc265 100644 --- a/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.h +++ b/frameworks/core/components_ng/pattern/radio/radio_layout_algorithm.h @@ -45,6 +45,7 @@ private: float defaultHeight_ = 0.0f; float horizontalPadding_ = 0.0f; float verticalPadding_ = 0.0f; + std::optional realSize_ = SizeF(); void InitializeParam(const RefPtr& host); diff --git a/frameworks/core/components_ng/pattern/radio/radio_pattern.cpp b/frameworks/core/components_ng/pattern/radio/radio_pattern.cpp index 315674b894a..2c6d4ec7838 100644 --- a/frameworks/core/components_ng/pattern/radio/radio_pattern.cpp +++ b/frameworks/core/components_ng/pattern/radio/radio_pattern.cpp @@ -28,7 +28,6 @@ const Color ITEM_FILL_COLOR = Color::TRANSPARENT; constexpr int32_t DEFAULT_RADIO_ANIMATION_DURATION = 200; constexpr int32_t DEFAULT_RADIO_ANIMATION_DURATION_CIRCLE = 150; -constexpr float DEFAULT_CUSTOM_SCALE = 0.7F; constexpr float INDICATOR_MIN_SCALE = 0.8F; constexpr float INDICATOR_MAX_SCALE = 1.0F; constexpr float INDICATOR_MIN_OPACITY = 0.0F; @@ -773,17 +772,17 @@ CalcSize RadioPattern::GetChildContentSize() if (layoutConstraint && layoutConstraint->selfIdealSize) { auto selfIdealSize = layoutConstraint->selfIdealSize; if (selfIdealSize->IsValid()) { - auto height = selfIdealSize->Height()->GetDimension() * DEFAULT_CUSTOM_SCALE; - auto width = selfIdealSize->Width()->GetDimension() * DEFAULT_CUSTOM_SCALE; + auto height = selfIdealSize->Height()->GetDimension() * DEFAULT_RADIO_IMAGE_SCALE; + auto width = selfIdealSize->Width()->GetDimension() * DEFAULT_RADIO_IMAGE_SCALE; auto length = std::min(width, height); return CalcSize(NG::CalcLength(length), NG::CalcLength(length)); } if (selfIdealSize->Width().has_value()) { - auto width = selfIdealSize->Width()->GetDimension() * DEFAULT_CUSTOM_SCALE; + auto width = selfIdealSize->Width()->GetDimension() * DEFAULT_RADIO_IMAGE_SCALE; return CalcSize(NG::CalcLength(width), NG::CalcLength(width)); } if (selfIdealSize->Height().has_value()) { - auto height = selfIdealSize->Height()->GetDimension() * DEFAULT_CUSTOM_SCALE; + auto height = selfIdealSize->Height()->GetDimension() * DEFAULT_RADIO_IMAGE_SCALE; return CalcSize(NG::CalcLength(height), NG::CalcLength(height)); } } @@ -792,8 +791,8 @@ CalcSize RadioPattern::GetChildContentSize() Dimension horizontalPadding; Dimension verticalPadding; InitializeParam(defaultWidth, defaultHeight, horizontalPadding, verticalPadding); - auto width = (defaultWidth - horizontalPadding * RADIO_PADDING_COUNT) * DEFAULT_CUSTOM_SCALE; - auto height = (defaultHeight - verticalPadding * RADIO_PADDING_COUNT) * DEFAULT_CUSTOM_SCALE; + auto width = (defaultWidth - horizontalPadding * RADIO_PADDING_COUNT) * DEFAULT_RADIO_IMAGE_SCALE; + auto height = (defaultHeight - verticalPadding * RADIO_PADDING_COUNT) * DEFAULT_RADIO_IMAGE_SCALE; return CalcSize(NG::CalcLength(width), NG::CalcLength(height)); } diff --git a/frameworks/core/components_ng/pattern/radio/radio_pattern.h b/frameworks/core/components_ng/pattern/radio/radio_pattern.h index 53ce924dea2..2225bd8e5e9 100644 --- a/frameworks/core/components_ng/pattern/radio/radio_pattern.h +++ b/frameworks/core/components_ng/pattern/radio/radio_pattern.h @@ -29,6 +29,8 @@ #include "core/components_ng/pattern/radio/radio_paint_property.h" namespace OHOS::Ace::NG { +constexpr float DEFAULT_RADIO_IMAGE_SCALE = 0.7F; + class RadioPattern : public Pattern { DECLARE_ACE_TYPE(RadioPattern, Pattern); diff --git a/test/unittest/core/pattern/checkbox/checkbox_test_ng.cpp b/test/unittest/core/pattern/checkbox/checkbox_test_ng.cpp index 769578b8a2c..9200f670684 100644 --- a/test/unittest/core/pattern/checkbox/checkbox_test_ng.cpp +++ b/test/unittest/core/pattern/checkbox/checkbox_test_ng.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -71,6 +71,14 @@ constexpr int32_t MIRROR_FRAME_OFFSET_Y_ZERO = 0; const bool SELECT_STATE = true; const int32_t VERSION_TWELVE = 12; RefPtr pipeline = nullptr; +const SizeF TEST_SIZE_0 = SizeF(0.0f, 0.0f); +const SizeF TEST_SIZE_100_200 = SizeF(100.0f, 200.0f); +const SizeF TEST_SIZE_100 = SizeF(100.0f, 100.0f); +const SizeF TEST_SIZE_200 = SizeF(200.0f, 200.0f); +const SizeF TEST_SIZE_50 = SizeF(50.0f, 50.0f); +const SizeF TEST_SIZE_60 = SizeF(60.0f, 60.0f); +constexpr float TEST_WIDTH_50 = 50.0f; +constexpr float TEST_HEIGHT_60 = 60.0f; } // namespace class CheckBoxTestNG : public testing::Test { @@ -3144,4 +3152,135 @@ HWTEST_F(CheckBoxTestNG, ResetComponentColor, TestSize.Level1) ret = paintProperty->GetCheckBoxUnSelectedColor(); EXPECT_EQ(ret.value_or(Color::BLACK), theme->GetInactiveColor()); } + +/** + * @tc.name: CheckBoxMeasureTest136 + * @tc.desc: Test CheckBox MeasureContent. + * @tc.type: FUNC + */ +HWTEST_F(CheckBoxTestNG, CheckBoxMeasureTest136, TestSize.Level1) +{ + /** + * @tc.steps: step1. Init CheckBox node. + */ + CheckBoxModelNG checkBoxModelNG; + checkBoxModelNG.Create(NAME, GROUP_NAME, TAG); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + ASSERT_NE(frameNode, nullptr); + + /** + * @tc.steps: step2. Create LayoutWrapperNode and set checkBoxLayoutAlgorithm. + */ + RefPtr geometryNode = AceType::MakeRefPtr(); + ASSERT_NE(geometryNode, nullptr); + LayoutWrapperNode layoutWrapper = LayoutWrapperNode(frameNode, geometryNode, frameNode->GetLayoutProperty()); + auto checkBoxPattern = frameNode->GetPattern(); + ASSERT_NE(checkBoxPattern, nullptr); + auto checkBoxLayoutAlgorithm = + AceType::DynamicCast(checkBoxPattern->CreateLayoutAlgorithm()); + ASSERT_NE(checkBoxLayoutAlgorithm, nullptr); + layoutWrapper.SetLayoutAlgorithm(AceType::MakeRefPtr(checkBoxLayoutAlgorithm)); + + /** + * @tc.steps: step3. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step3. switchSize is equal to TEST_SIZE_100. + */ + LayoutConstraintF contentConstraint; + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_100_200); + auto layoutProperty = layoutWrapper.GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + LayoutPolicyProperty layoutPolicyProperty; + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + auto ret = checkBoxLayoutAlgorithm->MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); +} + +/** + * @tc.name: CheckBoxLayoutPolicyIsMatchParentTest137 + * @tc.desc: Test Checkbox LayoutPolicyIsMatchParent. + * @tc.type: FUNC + */ +HWTEST_F(CheckBoxTestNG, CheckBoxLayoutPolicyIsMatchParentTest137, TestSize.Level1) +{ + /** + * @tc.steps: step1. Init CheckBox node + */ + CheckBoxModelNG checkBoxModelNG; + checkBoxModelNG.Create(NAME, GROUP_NAME, TAG); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + ASSERT_NE(frameNode, nullptr); + + /** + * @tc.steps: step2. Create LayoutWrapperNode and set checkBoxLayoutAlgorithm. + */ + RefPtr geometryNode = AceType::MakeRefPtr(); + ASSERT_NE(geometryNode, nullptr); + LayoutWrapperNode layoutWrapper = LayoutWrapperNode(frameNode, geometryNode, frameNode->GetLayoutProperty()); + auto checkBoxPattern = frameNode->GetPattern(); + ASSERT_NE(checkBoxPattern, nullptr); + auto checkBoxLayoutAlgorithm = + AceType::DynamicCast(checkBoxPattern->CreateLayoutAlgorithm()); + ASSERT_NE(checkBoxLayoutAlgorithm, nullptr); + layoutWrapper.SetLayoutAlgorithm(AceType::MakeRefPtr(checkBoxLayoutAlgorithm)); + + /** + * @tc.steps: step3. call LayoutPolicyIsMatchParent function. + * @tc.expected: step3. switchSize is equal to TEST_SIZE_0. + */ + LayoutConstraintF contentConstraint; + auto layoutPolicy = checkBoxLayoutAlgorithm->GetLayoutPolicy(&layoutWrapper); + auto ret = checkBoxLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_0); + + /** + * @tc.steps: step4. set layoutPolicy->widthLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step4. ret is equal to TEST_SIZE_100. + */ + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_100_200); + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = checkBoxLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); + + /** + * @tc.steps: step5. set selfIdealSize.height_ to TEST_HEIGHT_60. + * @tc.expected: step5. ret is equal to TEST_SIZE_60. + */ + contentConstraint.selfIdealSize.SetHeight(TEST_HEIGHT_60); + ret = checkBoxLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_60); + + /** + * @tc.steps: step6. set layoutPolicy->heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step6. ret is equal to TEST_SIZE_200. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = checkBoxLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_200); + + /** + * @tc.steps: step7. set selfIdealSize.width_ to TEST_WIDTH_50. + * @tc.expected: step7. ret is equal to TEST_SIZE_50. + */ + contentConstraint.selfIdealSize.SetWidth(TEST_WIDTH_50); + ret = checkBoxLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_50); + + /** + * @tc.steps: step8. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step8. ret is equal to TEST_SIZE_100. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = checkBoxLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/checkboxgroup/checkboxgroup_test_ng.cpp b/test/unittest/core/pattern/checkboxgroup/checkboxgroup_test_ng.cpp index 30e5e43e8fa..a0b3d8fb56e 100644 --- a/test/unittest/core/pattern/checkboxgroup/checkboxgroup_test_ng.cpp +++ b/test/unittest/core/pattern/checkboxgroup/checkboxgroup_test_ng.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -97,6 +97,14 @@ constexpr Dimension SHADOW_WIDTH_FORUPDATE = Dimension(6.0); constexpr float CHECKBOX_GROUP_LENGTH_ZERO = 0.0f; constexpr Dimension PADDING_SIZE = Dimension(2.0); const int32_t VERSION_TWELVE = 12; +const SizeF TEST_SIZE_0 = SizeF(0.0f, 0.0f); +const SizeF TEST_SIZE_100_200 = SizeF(100.0f, 200.0f); +const SizeF TEST_SIZE_100 = SizeF(100.0f, 100.0f); +const SizeF TEST_SIZE_200 = SizeF(200.0f, 200.0f); +const SizeF TEST_SIZE_50 = SizeF(50.0f, 50.0f); +const SizeF TEST_SIZE_60 = SizeF(60.0f, 60.0f); +constexpr float TEST_WIDTH_50 = 50.0f; +constexpr float TEST_HEIGHT_60 = 60.0f; } // namespace class CheckBoxGroupTestNG : public testing::Test { @@ -2344,4 +2352,111 @@ HWTEST_F(CheckBoxGroupTestNG, ResetComponentColor, TestSize.Level1) ret = paintProperty->GetCheckBoxGroupUnSelectedColor(); EXPECT_EQ(ret.value_or(Color::BLACK), theme->GetInactiveColor()); } + +/** + * @tc.name: CheckBoxGroupMeasureContentTest001 + * @tc.desc: Test CheckBoxGroup MeasureContent. + * @tc.type: FUNC + */ +HWTEST_F(CheckBoxGroupTestNG, CheckBoxGroupMeasureContentTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create CheckBoxGroupLayoutAlgorithm. + * @tc.expected: Create successfully. + */ + LayoutWrapperNode layoutWrapper = + LayoutWrapperNode(nullptr, nullptr, AccessibilityManager::MakeRefPtr()); + auto checkBoxGroupLayoutAlgorithm = AceType::MakeRefPtr(); + ASSERT_NE(checkBoxGroupLayoutAlgorithm, nullptr); + + /** + * @tc.steps: step2. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: ret is equal to TEST_SIZE_100. + */ + LayoutConstraintF contentConstraint; + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_100_200); + auto layoutProperty = layoutWrapper.GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + LayoutPolicyProperty layoutPolicyProperty; + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + auto ret = checkBoxGroupLayoutAlgorithm->MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); +} + +/** + * @tc.name: CheckBoxGroupLayoutPolicyIsMatchParentTest001 + * @tc.desc: Test CheckBoxGroup LayoutPolicyIsMatchParent. + * @tc.type: FUNC + */ +HWTEST_F(CheckBoxGroupTestNG, CheckBoxGroupLayoutPolicyIsMatchParentTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create CheckBoxGroupLayoutAlgorithm. + * @tc.expected: step1. Create successfully. + */ + LayoutWrapperNode layoutWrapper = + LayoutWrapperNode(nullptr, nullptr, AccessibilityManager::MakeRefPtr()); + auto checkBoxGroupLayoutAlgorithm = AceType::MakeRefPtr(); + ASSERT_NE(checkBoxGroupLayoutAlgorithm, nullptr); + auto layoutPolicy = checkBoxGroupLayoutAlgorithm->GetLayoutPolicy(&layoutWrapper); + + /** + * @tc.steps: step2. call LayoutPolicyIsMatchParent function. + * @tc.expected: step2. ret is equal to TEST_SIZE_0. + */ + LayoutConstraintF contentConstraint; + auto ret = checkBoxGroupLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_0); + + /** + * @tc.steps: step3. set layoutPolicy->widthLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step3. ret is equal to TEST_SIZE_100. + */ + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_100_200); + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = checkBoxGroupLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); + + /** + * @tc.steps: step4. set selfIdealSize.height_ to TEST_HEIGHT_60. + * @tc.expected: step4. ret is equal to TEST_SIZE_60. + */ + contentConstraint.selfIdealSize.SetHeight(TEST_HEIGHT_60); + ret = checkBoxGroupLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_60); + + /** + * @tc.steps: step5. set layoutPolicy->heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step5. ret is equal to TEST_SIZE_200. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = checkBoxGroupLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_200); + + /** + * @tc.steps: step6. set selfIdealSize.width_ to TEST_WIDTH_50. + * @tc.expected: step6. ret is equal to TEST_SIZE_50. + */ + contentConstraint.selfIdealSize.SetWidth(TEST_WIDTH_50); + ret = checkBoxGroupLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_50); + + /** + * @tc.steps: step7. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step7. ret is equal to TEST_SIZE_100. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = checkBoxGroupLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/radio/radio_test_ng.cpp b/test/unittest/core/pattern/radio/radio_test_ng.cpp index 271e15fa40f..87c13d3d862 100644 --- a/test/unittest/core/pattern/radio/radio_test_ng.cpp +++ b/test/unittest/core/pattern/radio/radio_test_ng.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -72,6 +72,14 @@ constexpr double NUM_TWO = 2.0; const SizeF CHILD_FRAME_SIZE = SizeF(50.0, 50.0); constexpr Dimension FOCUSBGSIZE = 2.0_vp; const int32_t VERSION_TWELVE = 12; +const SizeF TEST_SIZE_0 = SizeF(0.0f, 0.0f); +const SizeF TEST_SIZE_100_200 = SizeF(100.0f, 200.0f); +const SizeF TEST_SIZE_100 = SizeF(100.0f, 100.0f); +const SizeF TEST_SIZE_200 = SizeF(200.0f, 200.0f); +const SizeF TEST_SIZE_50 = SizeF(50.0f, 50.0f); +const SizeF TEST_SIZE_60 = SizeF(60.0f, 60.0f); +constexpr float TEST_WIDTH_50 = 50.0f; +constexpr float TEST_HEIGHT_60 = 60.0f; } // namespace class RadioTestNg : public TestNG { @@ -2523,4 +2531,105 @@ HWTEST_F(RadioTestNg, ColorTypeToString, TestSize.Level1) EXPECT_EQ(result, expected); } } + +/** + * @tc.name: MeasureContentTest001 + * @tc.desc: Test Radio MeasureContent. + * @tc.type: FUNC + */ +HWTEST_F(RadioTestNg, MeasureContentTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: ret is equal to TEST_SIZE_100. + */ + RadioModelNG radioModelNG; + radioModelNG.Create(std::nullopt, std::nullopt, std::nullopt); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + LayoutWrapperNode layoutWrapper = + LayoutWrapperNode(frameNode, nullptr, AccessibilityManager::MakeRefPtr()); + RadioLayoutAlgorithm radioLayoutAlgorithm; + LayoutConstraintF contentConstraint; + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_100_200); + auto layoutProperty = layoutWrapper.GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + LayoutPolicyProperty layoutPolicyProperty; + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + auto ret = radioLayoutAlgorithm.MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); +} + +/** + * @tc.name: LayoutPolicyIsMatchParentTest001 + * @tc.desc: Test Radio LayoutPolicyIsMatchParent. + * @tc.type: FUNC + */ +HWTEST_F(RadioTestNg, LayoutPolicyIsMatchParentTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. call LayoutPolicyIsMatchParent function. + * @tc.expected: step1. ret is equal to TEST_SIZE_0. + */ + RadioModelNG radioModelNG; + radioModelNG.Create(std::nullopt, std::nullopt, std::nullopt); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + LayoutWrapperNode layoutWrapper = + LayoutWrapperNode(frameNode, nullptr, AccessibilityManager::MakeRefPtr()); + RadioLayoutAlgorithm radioLayoutAlgorithm; + LayoutConstraintF contentConstraint; + auto layoutPolicy = radioLayoutAlgorithm.GetLayoutPolicy(&layoutWrapper); + auto ret = radioLayoutAlgorithm.LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_0); + + /** + * @tc.steps: step2. set layoutPolicy->widthLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step2. ret is equal to TEST_SIZE_100. + */ + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_100_200); + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = radioLayoutAlgorithm.LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); + + /** + * @tc.steps: step3. set selfIdealSize.height_ to TEST_HEIGHT_60. + * @tc.expected: step3. ret is equal to TEST_SIZE_60. + */ + contentConstraint.selfIdealSize.SetHeight(TEST_HEIGHT_60); + ret = radioLayoutAlgorithm.LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_60); + + /** + * @tc.steps: step4. set layoutPolicy->heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step4. ret is equal to TEST_SIZE_200. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = radioLayoutAlgorithm.LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_200); + + /** + * @tc.steps: step5. set selfIdealSize.width_ to TEST_WIDTH_50. + * @tc.expected: step5. ret is equal to TEST_SIZE_50. + */ + contentConstraint.selfIdealSize.SetWidth(TEST_WIDTH_50); + ret = radioLayoutAlgorithm.LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_50); + + /** + * @tc.steps: step6. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step6. ret is equal to TEST_SIZE_100. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = radioLayoutAlgorithm.LayoutPolicyIsMatchParent(contentConstraint, + layoutPolicy, &layoutWrapper); + EXPECT_EQ(ret, TEST_SIZE_100); +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/rating/rating_test_ng.cpp b/test/unittest/core/pattern/rating/rating_test_ng.cpp index a7b686a4457..ecff5fa9c61 100644 --- a/test/unittest/core/pattern/rating/rating_test_ng.cpp +++ b/test/unittest/core/pattern/rating/rating_test_ng.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2022-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 @@ -105,6 +105,10 @@ const std::string TEST_RESULT_THIRD = "test_ok_3"; const std::string TEST_RESULT_FORTH = "test_ok_4"; constexpr int32_t OFFSET_FIRST = 10; constexpr int32_t OFFSET_SECOND = 20; +const SizeF TEST_SIZE_0 = SizeF(0.0f, 0.0f); +const SizeF TEST_SIZE_200 = SizeF(200.0f, 200.0f); +constexpr float TEST_WIDTH_50 = 50.0f; +constexpr float TEST_HEIGHT_60 = 60.0f; } // namespace class RatingTestNg : public testing::Test { @@ -2273,4 +2277,132 @@ HWTEST_F(RatingTestNg, StyleTest001, TestSize.Level1) RATING_SECONDARY_URL); } +/** + * @tc.name: MeasureTest001 + * @tc.desc: Test Rating MeasureContent. + * @tc.type: FUNC + */ +HWTEST_F(RatingTestNg, MeasureTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create LayoutWrapperNode and RatingLayoutAlgorithm. + */ + RatingModelNG rating; + rating.Create(); + rating.SetIndicator(RATING_INDICATOR); + rating.SetStepSize(DEFAULT_STEP_SIZE); + rating.SetStars(RATING_STAR_NUM); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::RATING_ETS_TAG); + auto ratingPattern = frameNode->GetPattern(); + ASSERT_NE(ratingPattern, nullptr); + ratingPattern->SetRatingScore(RATING_SCORE); + auto ratingLayoutProperty = AceType::MakeRefPtr(); + ratingLayoutProperty->UpdateStars(DEFAULT_STAR_NUM); + ASSERT_NE(ratingLayoutProperty, nullptr); + LayoutWrapperNode layoutWrapper = LayoutWrapperNode(frameNode, nullptr, ratingLayoutProperty); + auto ratingLayoutAlgorithm = AceType::MakeRefPtr(nullptr, nullptr, nullptr, nullptr); + ASSERT_NE(ratingLayoutAlgorithm, nullptr); + + /** + * @tc.steps: step2. call MeasureContent function. + * @tc.expected: ret is not equal to TEST_SIZE_200. + */ + auto layoutProperty = layoutWrapper.GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + LayoutPolicyProperty layoutPolicyProperty; + LayoutConstraintF contentConstraint; + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_200); + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + auto ratingTheme = AceType::MakeRefPtr(); + ASSERT_NE(ratingTheme, nullptr); + auto ret = ratingLayoutAlgorithm->MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_NE(ret->Width(), TEST_SIZE_200.Width()); + EXPECT_NE(ret->Height(), TEST_SIZE_200.Height()); + + /** + * @tc.steps: step3. call MeasureContent function. + * @tc.expected: ret is equal to TEST_SIZE_200. + */ + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + ret = ratingLayoutAlgorithm->MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_EQ(ret->Width(), TEST_SIZE_200.Width()); + EXPECT_EQ(ret->Height(), TEST_SIZE_200.Height()); +} + +/** + * @tc.name: LayoutPolicyIsMatchParentTest001 + * @tc.desc: Test Rating LayoutPolicyIsMatchParent. + * @tc.type: FUNC + */ +HWTEST_F(RatingTestNg, LayoutPolicyIsMatchParentTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create LayoutWrapperNode and RatingLayoutAlgorithm. + */ + RatingModelNG rating; + rating.Create(); + rating.SetIndicator(RATING_INDICATOR); + rating.SetStepSize(DEFAULT_STEP_SIZE); + rating.SetStars(RATING_STAR_NUM); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::RATING_ETS_TAG); + auto ratingPattern = frameNode->GetPattern(); + ASSERT_NE(ratingPattern, nullptr); + ratingPattern->SetRatingScore(RATING_SCORE); + auto ratingLayoutProperty = AceType::MakeRefPtr(); + ratingLayoutProperty->UpdateStars(DEFAULT_STAR_NUM); + ASSERT_NE(ratingLayoutProperty, nullptr); + LayoutWrapperNode layoutWrapper = LayoutWrapperNode(frameNode, nullptr, ratingLayoutProperty); + auto ratingLayoutAlgorithm = AceType::MakeRefPtr(nullptr, nullptr, nullptr, nullptr); + ASSERT_NE(ratingLayoutAlgorithm, nullptr); + + /** + * @tc.steps: step2. call LayoutPolicyIsMatchParent function. + * @tc.expected: ret is equal to TEST_SIZE_0. + */ + LayoutConstraintF contentConstraint; + int32_t stars = 1; + auto layoutPolicy = ratingLayoutProperty->GetLayoutPolicyProperty(); + auto ret = ratingLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, stars); + EXPECT_EQ(ret, TEST_SIZE_0); + + /** + * @tc.steps: step3. set layoutPolicy->widthLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: ret is equal to TEST_SIZE_200. + */ + contentConstraint.parentIdealSize.SetSize(TEST_SIZE_200); + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = ratingLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, stars); + EXPECT_EQ(ret, TEST_SIZE_200); + + /** + * @tc.steps: step4. set selfIdealSize.height_ to TEST_HEIGHT_60. + * @tc.expected: result equals. + */ + contentConstraint.selfIdealSize.SetHeight(TEST_HEIGHT_60); + ret = ratingLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, stars); + EXPECT_EQ(ret, SizeF({ TEST_SIZE_200.Width(), TEST_HEIGHT_60 })); + + /** + * @tc.steps: step5. set layoutPolicy->heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: ret is equal to TEST_SIZE_200. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + ret = ratingLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, stars); + EXPECT_EQ(ret, TEST_SIZE_200); + + /** + * @tc.steps: step6. set selfIdealSize.width_ to TEST_WIDTH_50. + * @tc.expected: result equals. + */ + contentConstraint.selfIdealSize.SetWidth(TEST_WIDTH_50); + ret = ratingLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, stars); + EXPECT_EQ(ret, SizeF({ TEST_WIDTH_50, TEST_SIZE_200.Height() })); +} } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/toggle/toggle_switch_test_ng.cpp b/test/unittest/core/pattern/toggle/toggle_switch_test_ng.cpp index 64b9b8beb17..2ae6820cd84 100644 --- a/test/unittest/core/pattern/toggle/toggle_switch_test_ng.cpp +++ b/test/unittest/core/pattern/toggle/toggle_switch_test_ng.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 Huawei Device Co., Ltd. + * Copyright (c) 2024-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 @@ -57,6 +57,8 @@ constexpr float TRACK_BORDER_RADIUS = 10.0f; constexpr float USER_DEFINE_WIDTH = 180.0f; constexpr float USER_DEFINE_HEIGHT = 100.0f; const SizeF CONTAINER_SIZE(CONTAINER_WIDTH, CONTAINER_HEIGHT); +const SizeF TEST_CONTAINER_SIZE(200.0f, 200.0f); +constexpr float TEST_ZERO = 0.0f; } // namespace class ToggleSwitchTestNg : public testing::Test { @@ -1749,4 +1751,124 @@ HWTEST_F(ToggleSwitchTestNg, OnColorConfigurationUpdate001, TestSize.Level1) EXPECT_EQ(paintProperty->GetUnselectedColor(), Color::RED); g_isConfigChangePerform = false; } + +/** + * @tc.name: ToggleSwitchLayoutTest014 + * @tc.desc: Test toggle switch matchParent. + * @tc.type: FUNC + */ +HWTEST_F(ToggleSwitchTestNg, ToggleSwitchLayoutTest014, TestSize.Level1) +{ + int32_t rollbackApiVersion = MockContainer::Current()->GetApiTargetVersion(); + int32_t setApiVersion = static_cast(PlatformVersion::VERSION_TWELVE); + MockContainer::Current()->SetApiTargetVersion(setApiVersion); + + /** + * @tc.steps: step1. create switch and get frameNode. + */ + ToggleModelNG toggleModelNG; + toggleModelNG.Create(ToggleType::SWITCH, IS_ON); + auto switchFrameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + EXPECT_NE(switchFrameNode, nullptr); + + /** + * @tc.steps: step2. get switchPattern and switchWrapper. + * @tc.expected: step2. get switchPattern success. + */ + auto switchPattern = AceType::DynamicCast(switchFrameNode->GetPattern()); + EXPECT_NE(switchPattern, nullptr); + RefPtr geometryNode = AceType::MakeRefPtr(); + EXPECT_NE(switchFrameNode, nullptr); + LayoutWrapperNode layoutWrapper = + LayoutWrapperNode(switchFrameNode, geometryNode, switchFrameNode->GetLayoutProperty()); + auto switchLayoutAlgorithm = AceType::DynamicCast(switchPattern->CreateLayoutAlgorithm()); + EXPECT_NE(switchLayoutAlgorithm, nullptr); + layoutWrapper.SetLayoutAlgorithm(AccessibilityManager::MakeRefPtr(switchLayoutAlgorithm)); + + /** + * @tc.steps: step3. set widthLayoutPolicy_ and heightLayoutPolicy_ to NO_MATCH. + * @tc.expected: step3. switchSize is not equal to TEST_CONTAINER_SIZE. + */ + auto layoutProperty = layoutWrapper.GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + LayoutPolicyProperty layoutPolicyProperty; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + LayoutConstraintF contentConstraint; + contentConstraint.parentIdealSize.SetSize(TEST_CONTAINER_SIZE); + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::NO_MATCH; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + auto switchSize = switchLayoutAlgorithm->MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_NE(switchSize->Width(), TEST_CONTAINER_SIZE.Width()); + EXPECT_NE(switchSize->Height(), TEST_CONTAINER_SIZE.Height()); + + /** + * @tc.steps: step4. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step4. switchSize is equal to TEST_CONTAINER_SIZE. + */ + layoutPolicyProperty.widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicyProperty.heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutProperty->layoutPolicy_ = layoutPolicyProperty; + switchSize = switchLayoutAlgorithm->MeasureContent(contentConstraint, &layoutWrapper); + EXPECT_EQ(switchSize->Width(), TEST_CONTAINER_SIZE.Width()); + EXPECT_EQ(switchSize->Height(), TEST_CONTAINER_SIZE.Height()); + + MockContainer::Current()->SetApiTargetVersion(rollbackApiVersion); +} + +/** + * @tc.name: ToggleSwitchLayoutTest015 + * @tc.desc: Test LayoutPolicyIsMatchParent. + * @tc.type: FUNC + */ +HWTEST_F(ToggleSwitchTestNg, ToggleSwitchLayoutTest015, TestSize.Level1) +{ + /** + * @tc.steps: step1. create switch and get frameNode. + */ + ToggleModelNG toggleModelNG; + toggleModelNG.Create(ToggleType::SWITCH, IS_ON); + auto switchFrameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + EXPECT_NE(switchFrameNode, nullptr); + + /** + * @tc.steps: step2. get switchPattern and switchWrapper. + * @tc.expected: step2. get switchPattern success. + */ + auto switchPattern = AceType::DynamicCast(switchFrameNode->GetPattern()); + EXPECT_NE(switchPattern, nullptr); + RefPtr geometryNode = AceType::MakeRefPtr(); + EXPECT_NE(switchFrameNode, nullptr); + LayoutWrapperNode layoutWrapper = + LayoutWrapperNode(switchFrameNode, geometryNode, switchFrameNode->GetLayoutProperty()); + auto switchLayoutAlgorithm = AceType::DynamicCast(switchPattern->CreateLayoutAlgorithm()); + EXPECT_NE(switchLayoutAlgorithm, nullptr); + layoutWrapper.SetLayoutAlgorithm(AccessibilityManager::MakeRefPtr(switchLayoutAlgorithm)); + + /** + * @tc.steps: step3. layoutPolicy is default. + * @tc.expected: step3. frameWidth and frameHeight are equal to TEST_ZERO. + */ + auto layoutProperty = layoutWrapper.GetLayoutProperty(); + ASSERT_NE(layoutProperty, nullptr); + auto layoutPolicy = layoutProperty->GetLayoutPolicyProperty(); + LayoutConstraintF contentConstraint; + float frameWidth = 0.0f; + float frameHeight = 0.0f; + switchLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, + frameWidth, frameHeight); + EXPECT_EQ(frameWidth, TEST_ZERO); + EXPECT_EQ(frameHeight, TEST_ZERO); + + /** + * @tc.steps: step4. set widthLayoutPolicy_ and heightLayoutPolicy_ to MATCH_PARENT. + * @tc.expected: step4. frameWidth and frameHeight are equal to TEST_ZERO. + */ + layoutPolicy->widthLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + layoutPolicy->heightLayoutPolicy_ = LayoutCalPolicy::MATCH_PARENT; + switchLayoutAlgorithm->LayoutPolicyIsMatchParent(contentConstraint, layoutPolicy, + frameWidth, frameHeight); + EXPECT_EQ(frameWidth, TEST_ZERO); + EXPECT_EQ(frameHeight, TEST_ZERO); +} } // namespace OHOS::Ace::NG -- Gitee