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()