1 /* 2 * Copyright (c) 2025 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 "gtest/gtest.h" 17 #include "interfaces/inner_api/ace_kit/src/view/frame_node_impl.h" 18 #include "test/unittest/interfaces/ace_kit/mock/mock_ace_kit_pattern.h" 19 #include "test/unittest/interfaces/ace_kit/mock/mock_ace_kit_property.h" 20 #include "ui/properties/dirty_flag.h" 21 #include "ui/view/frame_node.h" 22 #include "ui/view_factory/abstract_view_factory.h" 23 24 #include "core/components_ng/base/frame_node.h" 25 #include "core/components_ng/pattern/pattern.h" 26 27 using namespace testing; 28 using namespace testing::ext; 29 using namespace OHOS::Ace::Kit; 30 namespace OHOS::Ace { 31 class FrameNodeTest : public testing::Test {}; 32 33 /** 34 * @tc.name: FrameNodeTestTest001 35 * @tc.desc: 36 * @tc.type: FUNC 37 */ 38 HWTEST_F(FrameNodeTest, FrameNodeTestTest001, TestSize.Level1) 39 { 40 const std::string tag = "TEST1"; 41 const int32_t id = 1; 42 auto mockPattern = AceType::MakeRefPtr<MockAceKitPattern>(); 43 auto frameNode = AbstractViewFactory::CreateFrameNode(tag, id, mockPattern); 44 EXPECT_NE(frameNode, nullptr); 45 46 EXPECT_EQ(frameNode->GetId(), id); 47 auto nodeTag = frameNode->GetTag(); 48 EXPECT_EQ(tag, nodeTag); 49 } 50 51 /** 52 * @tc.name: FrameNodeTestTest002 53 * @tc.desc: 54 * @tc.type: FUNC 55 */ 56 HWTEST_F(FrameNodeTest, FrameNodeTestTest002, TestSize.Level1) 57 { 58 const std::string tag = "TEST2"; 59 auto mockPattern = AceType::MakeRefPtr<MockAceKitPattern>(); 60 auto frameNode = AbstractViewFactory::CreateFrameNode(tag, 2, mockPattern); 61 EXPECT_NE(frameNode, nullptr); 62 63 auto property = frameNode->GetProperty(); 64 EXPECT_TRUE(property); 65 66 auto frameNodeImpl = AceType::DynamicCast<FrameNodeImpl>(frameNode); 67 ASSERT_TRUE(frameNodeImpl); 68 auto* aceNodePtr = frameNodeImpl->GetAceNodePtr(); 69 EXPECT_TRUE(aceNodePtr); 70 auto aceNode = frameNodeImpl->GetAceNode(); 71 EXPECT_TRUE(aceNode); 72 auto pattern = frameNodeImpl->GetPattern(); 73 EXPECT_TRUE(pattern); 74 75 frameNode->Reset(); 76 EXPECT_FALSE(frameNodeImpl->GetAceNodePtr()); 77 EXPECT_FALSE(frameNodeImpl->GetAceNode()); 78 EXPECT_FALSE(frameNodeImpl->GetPattern()); 79 } 80 81 /** 82 * @tc.name: FrameNodeTestTest003 83 * @tc.desc: 84 * @tc.type: FUNC 85 */ 86 HWTEST_F(FrameNodeTest, FrameNodeTestTest003, TestSize.Level1) 87 { 88 const std::string tag = "TEST3"; 89 const int32_t id = 3; 90 auto mockPattern = AceType::MakeRefPtr<MockAceKitPattern>(); 91 auto frameNode = AbstractViewFactory::CreateFrameNode(tag, id, mockPattern); 92 EXPECT_NE(frameNode, nullptr); 93 auto frameNodeImpl = AceType::DynamicCast<FrameNodeImpl>(frameNode); 94 ASSERT_TRUE(frameNodeImpl); 95 96 auto aceNode = __anona62b21370102() 97 NG::FrameNode::GetOrCreateFrameNode("TEST_ACE_NODE", 3, []() { return AceType::MakeRefPtr<NG::Pattern>(); }); 98 ASSERT_TRUE(aceNode); 99 100 auto popAceNode = frameNodeImpl->PopAceNode(); 101 EXPECT_EQ(popAceNode->GetTag(), tag); 102 EXPECT_EQ(popAceNode->GetId(), id); 103 EXPECT_FALSE(frameNodeImpl->GetAceNode()); 104 } 105 106 /** 107 * @tc.name: FrameNodeTestTest004 108 * @tc.desc: 109 * @tc.type: FUNC 110 */ 111 HWTEST_F(FrameNodeTest, FrameNodeTestTest004, TestSize.Level1) 112 { 113 const std::string tag = "TEST4"; 114 const int32_t id = 4; 115 auto mockPattern = AceType::MakeRefPtr<MockAceKitPattern>(); 116 auto frameNode = AbstractViewFactory::CreateFrameNode(tag, id, mockPattern); 117 EXPECT_NE(frameNode, nullptr); 118 auto frameNodeImpl = AceType::DynamicCast<FrameNodeImpl>(frameNode); 119 ASSERT_TRUE(frameNodeImpl); 120 121 frameNode->AddChild(nullptr); 122 EXPECT_EQ(frameNode->GetChildren().size(), 0); 123 124 const std::string childTag = "TEST4_CHILD"; 125 const int32_t childId = 4; 126 auto mockPatternChild = AceType::MakeRefPtr<MockAceKitPattern>(); 127 auto frameNodeChild = AbstractViewFactory::CreateFrameNode(childTag, childId, mockPatternChild); 128 EXPECT_NE(frameNode, nullptr); 129 frameNode->AddChild(frameNodeChild); 130 EXPECT_EQ(frameNode->GetChildren().size(), 1); 131 132 frameNode->RemoveChild(frameNodeChild); 133 EXPECT_EQ(frameNode->GetChildren().size(), 0); 134 } 135 136 /** 137 * @tc.name: FrameNodeTestTest005 138 * @tc.desc: 139 * @tc.type: FUNC 140 */ 141 HWTEST_F(FrameNodeTest, FrameNodeTestTest005, TestSize.Level1) 142 { 143 const std::string tag = "TEST5"; 144 const int32_t id = 5; 145 auto mockPattern = AceType::MakeRefPtr<MockAceKitPattern>(); 146 auto frameNode = AbstractViewFactory::CreateFrameNode(tag, id, mockPattern); 147 EXPECT_NE(frameNode, nullptr); 148 auto frameNodeImpl = AceType::DynamicCast<FrameNodeImpl>(frameNode); 149 ASSERT_TRUE(frameNodeImpl); 150 151 LayoutConstraintInfo constraint { .maxWidth = 100.0f, .maxHeight = 100.0f }; 152 frameNode->Measure(constraint); 153 auto* aceNode = frameNodeImpl->GetAceNodePtr(); 154 ASSERT_TRUE(aceNode); 155 EXPECT_TRUE(aceNode->IsActive()); 156 auto geometryNode = aceNode->GetGeometryNode(); 157 auto parentConstraint = geometryNode->GetParentLayoutConstraint(); 158 EXPECT_TRUE(NearEqual(parentConstraint.value().maxSize.Width(), constraint.maxWidth)); 159 EXPECT_TRUE(NearEqual(parentConstraint.value().maxSize.Height(), constraint.maxHeight)); 160 161 frameNode->Layout(); 162 auto layoutProperty = aceNode->GetLayoutProperty(); 163 auto layoutConstraint = layoutProperty->GetLayoutConstraint(); 164 EXPECT_TRUE(NearEqual(layoutConstraint.value().maxSize.Width(), constraint.maxWidth)); 165 EXPECT_TRUE(NearEqual(layoutConstraint.value().maxSize.Height(), constraint.maxHeight)); 166 167 auto propertyChangeFlag = layoutProperty->GetPropertyChangeFlag(); 168 EXPECT_EQ(propertyChangeFlag, NG::PROPERTY_UPDATE_MEASURE | NG::PROPERTY_UPDATE_LAYOUT); 169 frameNode->MarkDirtyNode(NG::PROPERTY_UPDATE_MEASURE_SELF); 170 EXPECT_EQ(layoutProperty->GetPropertyChangeFlag(), 171 NG::PROPERTY_UPDATE_MEASURE | NG::PROPERTY_UPDATE_LAYOUT | NG::PROPERTY_UPDATE_MEASURE_SELF); 172 } 173 } // namespace OHOS::Ace 174