18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#include <gmock/gmock.h> 178bf80f4bSopenharmony_ci#include <gtest/gtest.h> 188bf80f4bSopenharmony_ci 198bf80f4bSopenharmony_ci#include <meta/api/container/object_hierarchy_observer.h> 208bf80f4bSopenharmony_ci#include <meta/api/content_object.h> 218bf80f4bSopenharmony_ci#include <meta/api/make_callback.h> 228bf80f4bSopenharmony_ci#include <meta/base/ref_uri.h> 238bf80f4bSopenharmony_ci 248bf80f4bSopenharmony_ci#include "src/serialisation_utils.h" 258bf80f4bSopenharmony_ci#include "src/util.h" 268bf80f4bSopenharmony_ci#include "src/test_runner.h" 278bf80f4bSopenharmony_ci#include "src/test_utils.h" 288bf80f4bSopenharmony_ci#include "src/testing_objects.h" 298bf80f4bSopenharmony_ci 308bf80f4bSopenharmony_ciusing namespace testing; 318bf80f4bSopenharmony_ciusing namespace testing::ext; 328bf80f4bSopenharmony_ci 338bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE() 348bf80f4bSopenharmony_ci 358bf80f4bSopenharmony_cisize_t GetMatching(const BASE_NS::vector<HierarchyChangedInfo>& changedCalls, HierarchyChangeType change, 368bf80f4bSopenharmony_ci HierarchyChangeObjectType objectType) 378bf80f4bSopenharmony_ci{ 388bf80f4bSopenharmony_ci auto added = 0; 398bf80f4bSopenharmony_ci for (const auto& info : changedCalls) { 408bf80f4bSopenharmony_ci if (info.change == change && info .objectType == objectType) { 418bf80f4bSopenharmony_ci added++; 428bf80f4bSopenharmony_ci } 438bf80f4bSopenharmony_ci } 448bf80f4bSopenharmony_ci return added; 458bf80f4bSopenharmony_ci} 468bf80f4bSopenharmony_ci 478bf80f4bSopenharmony_ciMATCHER_P(AddingChildrenEq, expected, "") 488bf80f4bSopenharmony_ci{ 498bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::ADDING, HierarchyChangeObjectType::CHILD) == expected; 508bf80f4bSopenharmony_ci} 518bf80f4bSopenharmony_ciMATCHER_P(RemovingChildrenEq, expected, "") 528bf80f4bSopenharmony_ci{ 538bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::REMOVING, HierarchyChangeObjectType::CHILD) == expected; 548bf80f4bSopenharmony_ci} 558bf80f4bSopenharmony_ciMATCHER_P(AddedChildrenEq, expected, "") 568bf80f4bSopenharmony_ci{ 578bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::ADDED, HierarchyChangeObjectType::CHILD) == expected; 588bf80f4bSopenharmony_ci} 598bf80f4bSopenharmony_ciMATCHER_P(RemovedChildrenEq, expected, "") 608bf80f4bSopenharmony_ci{ 618bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::REMOVED, HierarchyChangeObjectType::CHILD) == expected; 628bf80f4bSopenharmony_ci} 638bf80f4bSopenharmony_ciMATCHER_P(MovedChildrenEq, expected, "") 648bf80f4bSopenharmony_ci{ 658bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::MOVED, HierarchyChangeObjectType::CHILD) == expected; 668bf80f4bSopenharmony_ci} 678bf80f4bSopenharmony_ciMATCHER_P(AddingContentEq, expected, "") 688bf80f4bSopenharmony_ci{ 698bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::ADDING, HierarchyChangeObjectType::CONTENT) == expected; 708bf80f4bSopenharmony_ci} 718bf80f4bSopenharmony_ciMATCHER_P(RemovingContentEq, expected, "") 728bf80f4bSopenharmony_ci{ 738bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::REMOVING, HierarchyChangeObjectType::CONTENT) == expected; 748bf80f4bSopenharmony_ci} 758bf80f4bSopenharmony_ciMATCHER_P(AddedContentEq, expected, "") 768bf80f4bSopenharmony_ci{ 778bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::ADDED, HierarchyChangeObjectType::CONTENT) == expected; 788bf80f4bSopenharmony_ci} 798bf80f4bSopenharmony_ciMATCHER_P(RemovedContentEq, expected, "") 808bf80f4bSopenharmony_ci{ 818bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::REMOVED, HierarchyChangeObjectType::CONTENT) == expected; 828bf80f4bSopenharmony_ci} 838bf80f4bSopenharmony_ciMATCHER_P(MovedContentEq, expected, "") 848bf80f4bSopenharmony_ci{ 858bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::MOVED, HierarchyChangeObjectType::CONTENT) == expected; 868bf80f4bSopenharmony_ci} 878bf80f4bSopenharmony_ciMATCHER_P(AddingAttachmentrEq, expected, "") 888bf80f4bSopenharmony_ci{ 898bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::ADDING, HierarchyChangeObjectType::ATTACHMENT) == expected; 908bf80f4bSopenharmony_ci} 918bf80f4bSopenharmony_ciMATCHER_P(RemovingAttachmentrEq, expected, "") 928bf80f4bSopenharmony_ci{ 938bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::REMOVING, HierarchyChangeObjectType::ATTACHMENT) == expected; 948bf80f4bSopenharmony_ci} 958bf80f4bSopenharmony_ciMATCHER_P(AddedAttachmentrEq, expected, "") 968bf80f4bSopenharmony_ci{ 978bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::ADDED, HierarchyChangeObjectType::ATTACHMENT) == expected; 988bf80f4bSopenharmony_ci} 998bf80f4bSopenharmony_ciMATCHER_P(RemovedAttachmentrEq, expected, "") 1008bf80f4bSopenharmony_ci{ 1018bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::REMOVED, HierarchyChangeObjectType::ATTACHMENT) == expected; 1028bf80f4bSopenharmony_ci} 1038bf80f4bSopenharmony_ciMATCHER_P(MovedAttachmentrEq, expected, "") 1048bf80f4bSopenharmony_ci{ 1058bf80f4bSopenharmony_ci return GetMatching(arg, HierarchyChangeType::MOVED, HierarchyChangeObjectType::ATTACHMENT) == expected; 1068bf80f4bSopenharmony_ci} 1078bf80f4bSopenharmony_ci 1088bf80f4bSopenharmony_ciMATCHER_P(ObjectEq, expected, "") 1098bf80f4bSopenharmony_ci{ 1108bf80f4bSopenharmony_ci return interface_pointer_cast<IObject>(arg) == interface_pointer_cast<IObject>(expected); 1118bf80f4bSopenharmony_ci} 1128bf80f4bSopenharmony_ci 1138bf80f4bSopenharmony_ciMATCHER(ObjectIsNull, "") 1148bf80f4bSopenharmony_ci{ 1158bf80f4bSopenharmony_ci return interface_pointer_cast<IObject>(arg) == nullptr; 1168bf80f4bSopenharmony_ci} 1178bf80f4bSopenharmony_ci 1188bf80f4bSopenharmony_ciclass IntfObjectHierarchyObserverTest : public ::testing::Test { 1198bf80f4bSopenharmony_cipublic: 1208bf80f4bSopenharmony_ci void SetUp() override 1218bf80f4bSopenharmony_ci { 1228bf80f4bSopenharmony_ci container_ = interface_pointer_cast<IContainer>(CreateTestContainer("Base")); 1238bf80f4bSopenharmony_ci ASSERT_NE(container_, nullptr); 1248bf80f4bSopenharmony_ci ASSERT_NE(observer_.GetIObject(), nullptr); 1258bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("Object1_1")); 1268bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("SameNameDifferentUid")); 1278bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("ObjectDupe")); 1288bf80f4bSopenharmony_ci container1_1_ = interface_pointer_cast<IContainer>(CreateTestContainer("Container1_1")); 1298bf80f4bSopenharmony_ci container_->Add(interface_pointer_cast<IObject>(container1_1_)); 1308bf80f4bSopenharmony_ci container1_1_->Add(CreateTestType<IObject>("Object2_1")); 1318bf80f4bSopenharmony_ci container1_1_->Add(CreateTestType<IObject>("ObjectDupe")); 1328bf80f4bSopenharmony_ci container1_1_->Add(CreateTestType<IObject>("SameNameDifferentUid")); 1338bf80f4bSopenharmony_ci container_->Add(CreateTestType<IObject>("Object1_3")); 1348bf80f4bSopenharmony_ci container2_1_ = interface_pointer_cast<IContainer>(CreateTestContainer("SameNameDifferentUid")); 1358bf80f4bSopenharmony_ci container2_1_->Add(contentObject_); 1368bf80f4bSopenharmony_ci container1_1_->Add(interface_pointer_cast<IObject>(container2_1_)); 1378bf80f4bSopenharmony_ci 1388bf80f4bSopenharmony_ci observer_.Target(interface_pointer_cast<IObject>(container_)) 1398bf80f4bSopenharmony_ci .OnHierarchyChanged([this](const HierarchyChangedInfo& info) { OnHierarchyChanged(info); }); 1408bf80f4bSopenharmony_ci } 1418bf80f4bSopenharmony_ci void TearDown() override 1428bf80f4bSopenharmony_ci { 1438bf80f4bSopenharmony_ci container_.reset(); 1448bf80f4bSopenharmony_ci observer_.ResetIObject(); 1458bf80f4bSopenharmony_ci } 1468bf80f4bSopenharmony_ci static void SetUpTestSuite() 1478bf80f4bSopenharmony_ci { 1488bf80f4bSopenharmony_ci SetTest(); 1498bf80f4bSopenharmony_ci } 1508bf80f4bSopenharmony_ci static void TearDownTestSuite() 1518bf80f4bSopenharmony_ci { 1528bf80f4bSopenharmony_ci ResetTest(); 1538bf80f4bSopenharmony_ci } 1548bf80f4bSopenharmony_cipublic: 1558bf80f4bSopenharmony_ci struct ExpectedCallCount { 1568bf80f4bSopenharmony_ci size_t addingChildren {}; 1578bf80f4bSopenharmony_ci size_t addedChildren {}; 1588bf80f4bSopenharmony_ci size_t removingChildren {}; 1598bf80f4bSopenharmony_ci size_t removedChildren {}; 1608bf80f4bSopenharmony_ci size_t movedChildren {}; 1618bf80f4bSopenharmony_ci 1628bf80f4bSopenharmony_ci size_t addingContent {}; 1638bf80f4bSopenharmony_ci size_t addedContent {}; 1648bf80f4bSopenharmony_ci size_t removingContent {}; 1658bf80f4bSopenharmony_ci size_t removedContent {}; 1668bf80f4bSopenharmony_ci 1678bf80f4bSopenharmony_ci size_t addingAttachments {}; 1688bf80f4bSopenharmony_ci size_t addedAttachments {}; 1698bf80f4bSopenharmony_ci size_t removingAttachments {}; 1708bf80f4bSopenharmony_ci size_t removedAttachments {}; 1718bf80f4bSopenharmony_ci size_t movedAttachments {}; 1728bf80f4bSopenharmony_ci 1738bf80f4bSopenharmony_ci void ExpectAddChildren(size_t count = 1) 1748bf80f4bSopenharmony_ci { 1758bf80f4bSopenharmony_ci addingChildren += count; 1768bf80f4bSopenharmony_ci addedChildren += count; 1778bf80f4bSopenharmony_ci } 1788bf80f4bSopenharmony_ci 1798bf80f4bSopenharmony_ci void ExpectAddContent(size_t count = 1) 1808bf80f4bSopenharmony_ci { 1818bf80f4bSopenharmony_ci addingContent += count; 1828bf80f4bSopenharmony_ci addedContent += count; 1838bf80f4bSopenharmony_ci } 1848bf80f4bSopenharmony_ci 1858bf80f4bSopenharmony_ci void ExpectAddAttachments(size_t count = 1) 1868bf80f4bSopenharmony_ci { 1878bf80f4bSopenharmony_ci addingAttachments += count; 1888bf80f4bSopenharmony_ci addedAttachments += count; 1898bf80f4bSopenharmony_ci } 1908bf80f4bSopenharmony_ci 1918bf80f4bSopenharmony_ci void ExpectRemoveChildren(size_t count = 1) 1928bf80f4bSopenharmony_ci { 1938bf80f4bSopenharmony_ci removingChildren += count; 1948bf80f4bSopenharmony_ci removedChildren += count; 1958bf80f4bSopenharmony_ci } 1968bf80f4bSopenharmony_ci 1978bf80f4bSopenharmony_ci void ExpectRemoveContent(size_t count = 1) 1988bf80f4bSopenharmony_ci { 1998bf80f4bSopenharmony_ci removingContent += count; 2008bf80f4bSopenharmony_ci removedContent += count; 2018bf80f4bSopenharmony_ci } 2028bf80f4bSopenharmony_ci 2038bf80f4bSopenharmony_ci void ExpectRemoveAttachments(size_t count = 1) 2048bf80f4bSopenharmony_ci { 2058bf80f4bSopenharmony_ci removingAttachments += count; 2068bf80f4bSopenharmony_ci removedAttachments += count; 2078bf80f4bSopenharmony_ci } 2088bf80f4bSopenharmony_ci 2098bf80f4bSopenharmony_ci size_t Sum() const 2108bf80f4bSopenharmony_ci { 2118bf80f4bSopenharmony_ci return addingChildren + addedChildren + removingChildren + removedChildren + movedChildren + addingContent + 2128bf80f4bSopenharmony_ci addedContent + removingContent + removedContent + addingAttachments + addedAttachments + 2138bf80f4bSopenharmony_ci removingAttachments + removedAttachments + movedAttachments; 2148bf80f4bSopenharmony_ci } 2158bf80f4bSopenharmony_ci }; 2168bf80f4bSopenharmony_ci 2178bf80f4bSopenharmony_ci void VerifyCalls(const ExpectedCallCount& expected) 2188bf80f4bSopenharmony_ci { 2198bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, AddingChildrenEq(expected.addingChildren)); 2208bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, AddedChildrenEq(expected.addedChildren)); 2218bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, RemovingChildrenEq(expected.removingChildren)); 2228bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, RemovedChildrenEq(expected.removedChildren)); 2238bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, MovedChildrenEq(expected.movedChildren)); 2248bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, AddingContentEq(expected.addingContent)); 2258bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, AddedContentEq(expected.addedContent)); 2268bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, RemovingContentEq(expected.removingContent)); 2278bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, RemovedContentEq(expected.removedContent)); 2288bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, AddingAttachmentsEq(expected.addingAttachments)); 2298bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, AddedAttachmentsEq(expected.addedAttachments)); 2308bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, RemovingAttachmentsEq(expected.removingAttachments)); 2318bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, RemovedAttachmentsEq(expected.removedAttachments)); 2328bf80f4bSopenharmony_ci EXPECT_THAT(changedCalls_, MovedAttachmentsEq(expected.movedAttachments)); 2338bf80f4bSopenharmony_ci ASSERT_EQ(changedCalls_.size(), expected.size()); 2348bf80f4bSopenharmony_ci } 2358bf80f4bSopenharmony_ci void ResetCalls() 2368bf80f4bSopenharmony_ci { 2378bf80f4bSopenharmony_ci changedCalls_.clear(); 2388bf80f4bSopenharmony_ci } 2398bf80f4bSopenharmony_ciprotected: 2408bf80f4bSopenharmony_ci void OnHierachyChanged(const HierarchyChangedInfo& info) 2418bf80f4bSopenharmony_ci { 2428bf80f4bSopenharmony_ci changedCalls_.push_back(info); 2438bf80f4bSopenharmony_ci } 2448bf80f4bSopenharmony_ci 2458bf80f4bSopenharmony_ci BASE_NS::vector<HierarchyChangedInfo> changedCalls_; 2468bf80f4bSopenharmony_ci 2478bf80f4bSopenharmony_ci IContainer::Ptr container_; 2488bf80f4bSopenharmony_ci IContainer::Ptr container1_1_; 2498bf80f4bSopenharmony_ci IContainer::Ptr container2_1_; 2508bf80f4bSopenharmony_ci META_NS::ObjectHierarchyObserver observer_; 2518bf80f4bSopenharmony_ci}; 2528bf80f4bSopenharmony_ci 2538bf80f4bSopenharmony_ci/** 2548bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 2558bf80f4bSopenharmony_ci * @tc.desc: test AddDirectChild function 2568bf80f4bSopenharmony_ci * @tc.type: FUNC 2578bf80f4bSopenharmony_ci * @tc.require: I7DMS1 2588bf80f4bSopenharmony_ci */ 2598bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, AddDirectChild, TestSize.Level1) 2608bf80f4bSopenharmony_ci{ 2618bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("DirectChild"); 2628bf80f4bSopenharmony_ci ASSERT_TRUE(container_->Add(child)); 2638bf80f4bSopenharmony_ci 2648bf80f4bSopenharmony_ci ExpectedCallCount expected; 2658bf80f4bSopenharmony_ci expected.ExpectAddChildren(); 2668bf80f4bSopenharmony_ci VerifyCalls(expected); 2678bf80f4bSopenharmony_ci 2688bf80f4bSopenharmony_ci auto& info = changeCalls_[0]; 2698bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 2708bf80f4bSopenharmony_ci EXPECT_THAT(info.parent.lock(), ObjectEq(container_)); 2718bf80f4bSopenharmony_ci} 2728bf80f4bSopenharmony_ci 2738bf80f4bSopenharmony_ci/** 2748bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 2758bf80f4bSopenharmony_ci * @tc.desc: test AddDescendantChild function 2768bf80f4bSopenharmony_ci * @tc.type: FUNC 2778bf80f4bSopenharmony_ci * @tc.require: I7DMS1 2788bf80f4bSopenharmony_ci */ 2798bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, AddDescendantChild, TestSize.Level1) 2808bf80f4bSopenharmony_ci{ 2818bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("DirectChild"); 2828bf80f4bSopenharmony_ci ASSERT_TRUE(container2_1_->Add(child)); 2838bf80f4bSopenharmony_ci 2848bf80f4bSopenharmony_ci ExpectedCallCount expected; 2858bf80f4bSopenharmony_ci expected.ExpectAddChildren(); 2868bf80f4bSopenharmony_ci VerifyCalls(expected); 2878bf80f4bSopenharmony_ci 2888bf80f4bSopenharmony_ci auto& info = changeCalls_[0]; 2898bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 2908bf80f4bSopenharmony_ci EXPECT_THAT(info.parent.lock(), ObjectEq(container2_1_)); 2918bf80f4bSopenharmony_ci} 2928bf80f4bSopenharmony_ci 2938bf80f4bSopenharmony_ci/** 2948bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 2958bf80f4bSopenharmony_ci * @tc.desc: test AddDescendantContent function 2968bf80f4bSopenharmony_ci * @tc.type: FUNC 2978bf80f4bSopenharmony_ci * @tc.require: I7DMS1 2988bf80f4bSopenharmony_ci */ 2998bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, AddDescendantContent, TestSize.Level1) 3008bf80f4bSopenharmony_ci{ 3018bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("Content"); 3028bf80f4bSopenharmony_ci auto child2 = CreateTestType<IObject>("Content2"); 3038bf80f4bSopenharmony_ci { 3048bf80f4bSopenharmony_ci contentObject_ = SetContent(child); 3058bf80f4bSopenharmony_ci ExpectedCallCount expected; 3068bf80f4bSopenharmony_ci expected.ExpectAddContent(); 3078bf80f4bSopenharmony_ci VerifyCalls(expected); 3088bf80f4bSopenharmony_ci auto& info = changeCalls_[0]; 3098bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 3108bf80f4bSopenharmony_ci EXPECT_THAT(info.parent.lock(), ObjectEq(contentObject)); 3118bf80f4bSopenharmony_ci } 3128bf80f4bSopenharmony_ci ResetCalls(); 3138bf80f4bSopenharmony_ci { 3148bf80f4bSopenharmony_ci contentObject_ = SetContent(child2); 3158bf80f4bSopenharmony_ci ExpectedCallCount expected; 3168bf80f4bSopenharmony_ci expected.ExpectAddContent(); 3178bf80f4bSopenharmony_ci expected.ExpectRemoveContent(); 3188bf80f4bSopenharmony_ci VerifyCalls(expected); 3198bf80f4bSopenharmony_ci auto& remove = changedCalls_[0]; 3208bf80f4bSopenharmony_ci auto& added = changedCalls_[2]; 3218bf80f4bSopenharmony_ci EXPECT_EQ(remove.object, child); 3228bf80f4bSopenharmony_ci EXPECT_THAT(remove.parent.lock(), ObjectEq(contentObject)); 3238bf80f4bSopenharmony_ci EXPECT_EQ(added.object, child); 3248bf80f4bSopenharmony_ci EXPECT_THAT(added.parent.lock(), ObjectEq(contentObject)); 3258bf80f4bSopenharmony_ci } 3268bf80f4bSopenharmony_ci ResetCalls(); 3278bf80f4bSopenharmony_ci { 3288bf80f4bSopenharmony_ci contentObject_.SetContent(nullptr); 3298bf80f4bSopenharmony_ci ExpectedCallCount expected; 3308bf80f4bSopenharmony_ci expected.ExpectRemoveContent(); 3318bf80f4bSopenharmony_ci VerifyCalls(expected); 3328bf80f4bSopenharmony_ci auto& remove = changedCalls_[0]; 3338bf80f4bSopenharmony_ci EXPECT_EQ(remove.object, child2); 3348bf80f4bSopenharmony_ci EXPECT_THAT(remove.parent.lock(), ObjectEq(contentObject)); 3358bf80f4bSopenharmony_ci } 3368bf80f4bSopenharmony_ci} 3378bf80f4bSopenharmony_ci 3388bf80f4bSopenharmony_ci/** 3398bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 3408bf80f4bSopenharmony_ci * @tc.desc: test ContentChangeAfterRemove function 3418bf80f4bSopenharmony_ci * @tc.type: FUNC 3428bf80f4bSopenharmony_ci * @tc.require: I7DMS1 3438bf80f4bSopenharmony_ci */ 3448bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, ContentChangeAfterRemove, TestSize.Level1) 3458bf80f4bSopenharmony_ci{ 3468bf80f4bSopenharmony_ci auto child = CreateTestType<IObject>("Content"); 3478bf80f4bSopenharmony_ci { 3488bf80f4bSopenharmony_ci contentObject_ = SetContent(child); 3498bf80f4bSopenharmony_ci ExpectedCallCount expected; 3508bf80f4bSopenharmony_ci expected.ExpectAddContent(); 3518bf80f4bSopenharmony_ci VerifyCalls(expected); 3528bf80f4bSopenharmony_ci auto& info = changeCalls_[0]; 3538bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 3548bf80f4bSopenharmony_ci EXPECT_THAT(info.parent.lock(), ObjectEq(contentObject)); 3558bf80f4bSopenharmony_ci } 3568bf80f4bSopenharmony_ci ResetCalls(); 3578bf80f4bSopenharmony_ci { 3588bf80f4bSopenharmony_ci EXPECT_TRUE(container2_1->Remove(contentObject_)); 3598bf80f4bSopenharmony_ci ExpectedCallCount expected; 3608bf80f4bSopenharmony_ci expected.ExpectAddContent(); 3618bf80f4bSopenharmony_ci auto& info = changeCalls_[0]; 3628bf80f4bSopenharmony_ci EXPECT_EQ(info.object, child); 3638bf80f4bSopenharmony_ci EXPECT_THAT(info.parent.lock(), ObjectEq(container2_1)); 3648bf80f4bSopenharmony_ci } 3658bf80f4bSopenharmony_ci ResetCalls(); 3668bf80f4bSopenharmony_ci { 3678bf80f4bSopenharmony_ci contentObject_.SetContent(nullptr); 3688bf80f4bSopenharmony_ci VerifyCalls({}); 3698bf80f4bSopenharmony_ci } 3708bf80f4bSopenharmony_ci} 3718bf80f4bSopenharmony_ci 3728bf80f4bSopenharmony_ci/** 3738bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 3748bf80f4bSopenharmony_ci * @tc.desc: test Properties function 3758bf80f4bSopenharmony_ci * @tc.type: FUNC 3768bf80f4bSopenharmony_ci * @tc.require: I7DMS1 3778bf80f4bSopenharmony_ci */ 3788bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, Properties, TestSize.Level1) 3798bf80f4bSopenharmony_ci{ 3808bf80f4bSopenharmony_ci auto obj = CreateTestType(); 3818bf80f4bSopenharmony_ci auto meta = interface_cast<IMetadata>(obj); 3828bf80f4bSopenharmony_ci 3838bf80f4bSopenharmony_ci ObjectHierarchyObserver obs; 3848bf80f4bSopenharmony_ci HierarchyChangedInfo info; 3858bf80f4bSopenharmony_ci 3868bf80f4bSopenharmony_ci obs.Target(interface_pointer_cast<IObject>(meta->GetPropertyContainer()), 3878bf80f4bSopenharmony_ci HierarchyChangeModeValue(HierarchyChangeMode::NOTIFY_CONTAINER | HierarchyChangeMode::NOTIFY_OBJECT)); 3888bf80f4bSopenharmony_ci obs.OnHierarchyChanged([&info](const HierarchyChangedInfo& i) { info = i; }); 3898bf80f4bSopenharmony_ci 3908bf80f4bSopenharmony_ci obj->First()->SetValue(2); 3918bf80f4bSopenharmony_ci EXPECT_EQ(interface_pointer_cast<IProperty>(info.object), obj->First().GetProperty()); 3928bf80f4bSopenharmony_ci EXPECT_EQ(info.change, HierarchyChangeType::CHANGED); 3938bf80f4bSopenharmony_ci EXPECT_EQ(info.objectType, HierarchyChangeObjectType::CHILD); 3948bf80f4bSopenharmony_ci EXPECT_EQ(info.parent.lock(), interface_pointer_cast<IObject>(meta->GetPropertyContainer())); 3958bf80f4bSopenharmony_ci 3968bf80f4bSopenharmony_ci obj->Second()->SetValue("hips"); 3978bf80f4bSopenharmony_ci EXPECT_EQ(interface_pointer_cast<IProperty>(info.object), obj->Second().GetProperty()); 3988bf80f4bSopenharmony_ci} 3998bf80f4bSopenharmony_ci 4008bf80f4bSopenharmony_ci/** 4018bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 4028bf80f4bSopenharmony_ci * @tc.desc: test GetAll function 4038bf80f4bSopenharmony_ci * @tc.type: FUNC 4048bf80f4bSopenharmony_ci * @tc.require: I7DMS1 4058bf80f4bSopenharmony_ci */ 4068bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, GetAll, TestSize.Level1) 4078bf80f4bSopenharmony_ci{ 4088bf80f4bSopenharmony_ci ObjectHierarchyObserver obs; 4098bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), IsEmpty()); 4108bf80f4bSopenharmony_ci 4118bf80f4bSopenharmony_ci auto containerObject = interface_pointer_cast<IObject>(CreateTestContainer("Container")); 4128bf80f4bSopenharmony_ci auto childObject = interface_pointer_cast<IObject>(CreateTestType("TestType")); 4138bf80f4bSopenharmony_ci 4148bf80f4bSopenharmony_ci auto container = interface_pointer_cast<IContainer>(containerObject); 4158bf80f4bSopenharmony_ci container->Add(childObject); 4168bf80f4bSopenharmony_ci 4178bf80f4bSopenharmony_ci EXPECT_TRUE(obs.Target(containerObject)); 4188bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), UnorderedElementsAre(containerObject, childObject)); 4198bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved<IContainer>(), UnorderedElementsAre(container)); 4208bf80f4bSopenharmony_ci 4218bf80f4bSopenharmony_ci container->Remove(childObject); 4228bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), UnorderedElementsAre(containerObject)); 4238bf80f4bSopenharmony_ci} 4248bf80f4bSopenharmony_ci 4258bf80f4bSopenharmony_ci/** 4268bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 4278bf80f4bSopenharmony_ci * @tc.desc: test Remove function 4288bf80f4bSopenharmony_ci * @tc.type: FUNC 4298bf80f4bSopenharmony_ci * @tc.require: I7DMS1 4308bf80f4bSopenharmony_ci */ 4318bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, Remove, TestSize.Level1) 4328bf80f4bSopenharmony_ci{ 4338bf80f4bSopenharmony_ci BASE_NS::vector<IObject::Ptr> removed; 4348bf80f4bSopenharmony_ci ObjectHierarchyObserver obs; 4358bf80f4bSopenharmony_ci auto callCount = 0; 4368bf80f4bSopenharmony_ci 4378bf80f4bSopenharmony_ci obs.OnHierarchyChanged([&removed, &callCount](const HierarchyChangedInfo& info) { 4388bf80f4bSopenharmony_ci if (info.change == HierarchyChangeType::REMOVED) { 4398bf80f4bSopenharmony_ci callCount++; 4408bf80f4bSopenharmony_ci removed.push_back(info.object); 4418bf80f4bSopenharmony_ci } 4428bf80f4bSopenharmony_ci }); 4438bf80f4bSopenharmony_ci 4448bf80f4bSopenharmony_ci auto containerObject = interface_pointer_cast<IObject>(CreateTestContainer("Container")); 4458bf80f4bSopenharmony_ci auto childContainerObject = interface_pointer_cast<IObject>(CreateTestContainer("Container")); 4468bf80f4bSopenharmony_ci auto childObject = interface_pointer_cast<IObject>(CreateTestType("TestType")); 4478bf80f4bSopenharmony_ci { 4488bf80f4bSopenharmony_ci auto container = interface_pointer_cast<IContainer>(containerObject); 4498bf80f4bSopenharmony_ci auto childContainer = interface_pointer_cast<IContainer>(childContainerObject); 4508bf80f4bSopenharmony_ci EXPECT_TRUE(container->Add(childObject)); 4518bf80f4bSopenharmony_ci EXPECT_TRUE(childContainer->Add(childContainerObject)); 4528bf80f4bSopenharmony_ci EXPECT_TRUE(obs.Target(childObject)); 4538bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), UnorderedElementsAre(containerObject, childContainerObject, childObject)); 4548bf80f4bSopenharmony_ci 4558bf80f4bSopenharmony_ci container->RemoveAll(); 4568bf80f4bSopenharmony_ci } 4578bf80f4bSopenharmony_ci EXPECT_EQ(callCount, 1); 4588bf80f4bSopenharmony_ci EXPECT_THAT(removed, ElementsAre(childContainerObject)); 4598bf80f4bSopenharmony_ci} 4608bf80f4bSopenharmony_ci 4618bf80f4bSopenharmony_ci/** 4628bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 4638bf80f4bSopenharmony_ci * @tc.desc: test DestroyEvent function 4648bf80f4bSopenharmony_ci * @tc.type: FUNC 4658bf80f4bSopenharmony_ci * @tc.require: I7DMS1 4668bf80f4bSopenharmony_ci */ 4678bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, DestroyEvent, TestSize.Level1) 4688bf80f4bSopenharmony_ci{ 4698bf80f4bSopenharmony_ci BASE_NS::vector<IObject::Ptr> removed; 4708bf80f4bSopenharmony_ci ObjectHierarchyObserver obs; 4718bf80f4bSopenharmony_ci auto callCount = 0; 4728bf80f4bSopenharmony_ci auto removingCount = 0; 4738bf80f4bSopenharmony_ci 4748bf80f4bSopenharmony_ci auto containerObject = interface_pointer_cast<IObject>(CreateTestContainer("Container")); 4758bf80f4bSopenharmony_ci auto childContainerObject = interface_pointer_cast<IObject>(CreateTestContainer("Container")); 4768bf80f4bSopenharmony_ci auto childObject = interface_pointer_cast<IObject>(CreateTestType("TestType")); 4778bf80f4bSopenharmony_ci auto childObject2 = interface_pointer_cast<IObject>(CreateTestType("TestType")); 4788bf80f4bSopenharmony_ci auto childObject3 = interface_pointer_cast<IObject>(CreateTestType("TestType")); 4798bf80f4bSopenharmony_ci auto childObject4 = interface_pointer_cast<IObject>(CreateTestType("TestType")); 4808bf80f4bSopenharmony_ci { 4818bf80f4bSopenharmony_ci auto container = interface_pointer_cast<IContainer>(containerObject); 4828bf80f4bSopenharmony_ci auto childContainer = interface_pointer_cast<IContainer>(childContainerObject); 4838bf80f4bSopenharmony_ci EXPECT_TRUE(container->Add(childContainerObject)); 4848bf80f4bSopenharmony_ci EXPECT_TRUE(container->Add(childObject2)); 4858bf80f4bSopenharmony_ci EXPECT_TRUE(container->Add(childObject3)); 4868bf80f4bSopenharmony_ci EXPECT_TRUE(container->Insert(1, childObject4)); 4878bf80f4bSopenharmony_ci EXPECT_TRUE(childContainer->Add(childObject)); 4888bf80f4bSopenharmony_ci EXPECT_TRUE(obs.Target(containerObject)); 4898bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), UnorderedElementsAre(containerObject, childContainerObject, childObject, 4908bf80f4bSopenharmony_ci childObject2, childObject3, childObject4)); 4918bf80f4bSopenharmony_ci 4928bf80f4bSopenharmony_ci container->RemoveAll(); 4938bf80f4bSopenharmony_ci 4948bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), 4958bf80f4bSopenharmony_ci UnorderedElementsAre(containerObject, childContainerObject, childObject, childObject4, childObject2)); 4968bf80f4bSopenharmony_ci } 4978bf80f4bSopenharmony_ci 4988bf80f4bSopenharmony_ci obs.OnHierarchyChanged([&](const HierarchyChangedInfo& info) { 4998bf80f4bSopenharmony_ci if (info.change == HierarchyChangeType::REMOVED) { 5008bf80f4bSopenharmony_ci callCount++; 5018bf80f4bSopenharmony_ci removed.push_back(info.object); 5028bf80f4bSopenharmony_ci } 5038bf80f4bSopenharmony_ci if (info.change == HierarchyChangeType::REMOVING) { 5048bf80f4bSopenharmony_ci ++removingCount; 5058bf80f4bSopenharmony_ci } 5068bf80f4bSopenharmony_ci }); 5078bf80f4bSopenharmony_ci 5088bf80f4bSopenharmony_ci containerObject.reset(); 5098bf80f4bSopenharmony_ci EXPECT_EQ(callCount, 3); 5108bf80f4bSopenharmony_ci EXPECT_EQ(removingCount, 3); 5118bf80f4bSopenharmony_ci EXPECT_THAT(removed, UnorderedElementsAre(childContainerObject, childObject4, childObject2)); 5128bf80f4bSopenharmony_ci} 5138bf80f4bSopenharmony_ci 5148bf80f4bSopenharmony_ci/** 5158bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 5168bf80f4bSopenharmony_ci * @tc.desc: test DestroyEventContent function 5178bf80f4bSopenharmony_ci * @tc.type: FUNC 5188bf80f4bSopenharmony_ci * @tc.require: I7DMS1 5198bf80f4bSopenharmony_ci */ 5208bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, DestroyEventContent, TestSize.Level1) 5218bf80f4bSopenharmony_ci{ 5228bf80f4bSopenharmony_ci BASE_NS::vector<IObject::Ptr> removed; 5238bf80f4bSopenharmony_ci ObjectHierarchyObserver obs; 5248bf80f4bSopenharmony_ci auto callCount = 0; 5258bf80f4bSopenharmony_ci 5268bf80f4bSopenharmony_ci obs.OnHierarchyChanged([&removed, &callCount](const HierarchyChangedInfo& info) { 5278bf80f4bSopenharmony_ci if (info.change == HierarchyChangeType::REMOVED) { 5288bf80f4bSopenharmony_ci callCount++; 5298bf80f4bSopenharmony_ci removed.push_back(info.object); 5308bf80f4bSopenharmony_ci } 5318bf80f4bSopenharmony_ci }); 5328bf80f4bSopenharmony_ci auto contentObject = META_NS::GetObjectRegistry().Create(ClassId::ContentObject); 5338bf80f4bSopenharmony_ci auto childObject = interface_pointer_cast<IObject>(CreateTestType("TestType")); 5348bf80f4bSopenharmony_ci { 5358bf80f4bSopenharmony_ci auto content = interface_pointer_cast<IContent>(contentObject); 5368bf80f4bSopenharmony_ci EXPECT_TRUE(content->SetContent(childObject)); 5378bf80f4bSopenharmony_ci EXPECT_TRUE(obs.Target(contentObject)); 5388bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), UnorderedElementsAre(contentObject, childObject)); 5398bf80f4bSopenharmony_ci } 5408bf80f4bSopenharmony_ci 5418bf80f4bSopenharmony_ci contentObject.reset(); 5428bf80f4bSopenharmony_ci EXPECT_EQ(callCount, 1); 5438bf80f4bSopenharmony_ci EXPECT_THAT(removed, ElementsAre(childObject)); 5448bf80f4bSopenharmony_ci} 5458bf80f4bSopenharmony_ci 5468bf80f4bSopenharmony_ci/** 5478bf80f4bSopenharmony_ci * @tc.name: IntfObjectHierarchyObserverTest 5488bf80f4bSopenharmony_ci * @tc.desc: test DoNotSerialise function 5498bf80f4bSopenharmony_ci * @tc.type: FUNC 5508bf80f4bSopenharmony_ci * @tc.require: I7DMS1 5518bf80f4bSopenharmony_ci */ 5528bf80f4bSopenharmony_ciHWTEST_F(IntfObjectHierarchyObserverTest, DoNotSerialise, TestSize.Level1) 5538bf80f4bSopenharmony_ci{ 5548bf80f4bSopenharmony_ci TestSerialiser ser; 5558bf80f4bSopenharmony_ci { 5568bf80f4bSopenharmony_ci ObjectHierarchyObserver obs; 5578bf80f4bSopenharmony_ci auto containerObject = interface_pointer_cast<IObject>(CreateTestType("Container")); 5588bf80f4bSopenharmony_ci EXPECT_TRUE(obs.Target(containerObject)); 5598bf80f4bSopenharmony_ci EXPECT_THAT(obs.GetAllObserved(), UnorderedElementsAre(containerObject)); 5608bf80f4bSopenharmony_ci auto i = interface_cast<IAttach>(containerObject); 5618bf80f4bSopenharmony_ci ASSERT_TRUE(i); 5628bf80f4bSopenharmony_ci EXPECT_EQ(i->GetAttachments().size(), 1); 5638bf80f4bSopenharmony_ci ser.Export(containerObject); 5648bf80f4bSopenharmony_ci } 5658bf80f4bSopenharmony_ci 5668bf80f4bSopenharmony_ci auto obj = ser.Import<IAttach>(); 5678bf80f4bSopenharmony_ci ASSERT_TRUE(obj); 5688bf80f4bSopenharmony_ci EXPECT_EQ(obj->GetAttachments().size(), 0); 5698bf80f4bSopenharmony_ci} 5708bf80f4bSopenharmony_ciMETA_END_NAMESPACE()