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/iteration.h>
208bf80f4bSopenharmony_ci#include <meta/api/make_callback.h>
218bf80f4bSopenharmony_ci#include <meta/base/ref_uri.h>
228bf80f4bSopenharmony_ci#include <meta/interface/intf_attachment.h>
238bf80f4bSopenharmony_ci#include <meta/interface/intf_metadata.h>
248bf80f4bSopenharmony_ci#include <meta/interface/intf_object_flags.h>
258bf80f4bSopenharmony_ci#include <meta/interface/intf_required_interfaces.h>
268bf80f4bSopenharmony_ci
278bf80f4bSopenharmony_ci#include "src/test_utils.h"
288bf80f4bSopenharmony_ci#include "src/testing_objects.h"
298bf80f4bSopenharmony_ci#include "src/util.h"
308bf80f4bSopenharmony_ci#include "src/test_runner.h"
318bf80f4bSopenharmony_ci
328bf80f4bSopenharmony_ciusing namespace testing;
338bf80f4bSopenharmony_ciusing namespace testing::ext;
348bf80f4bSopenharmony_ci
358bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
368bf80f4bSopenharmony_ci
378bf80f4bSopenharmony_cibool operator==(const ChildChangedInfo& lhs, const ChildChangedInfo& rhs)
388bf80f4bSopenharmony_ci{
398bf80f4bSopenharmony_ci    return lhs.object == rhs.object && lhs.index == rhs.index && lhs.parent.lock() == rhs.parent.lock();
408bf80f4bSopenharmony_ci}
418bf80f4bSopenharmony_ci
428bf80f4bSopenharmony_cibool operator==(const ChildMovedInfo& lhs, const ChildMovedInfo& rhs)
438bf80f4bSopenharmony_ci{
448bf80f4bSopenharmony_ci    return lhs.object == rhs.object && lhs.from == rhs.from && lhs.to == rhs.to &&
458bf80f4bSopenharmony_ci           lhs.parent.lock() == rhs.parent.lock();
468bf80f4bSopenharmony_ci}
478bf80f4bSopenharmony_ci
488bf80f4bSopenharmony_ciclass ContainerTestBase : public testing::Test {
498bf80f4bSopenharmony_cipublic:
508bf80f4bSopenharmony_ci    virtual IContainer::Ptr CreateContainer(BASE_NS::string name) = 0;
518bf80f4bSopenharmony_ci
528bf80f4bSopenharmony_ci    void SetUp() override
538bf80f4bSopenharmony_ci    {
548bf80f4bSopenharmony_ci        container_ = CreateContainer("Base");
558bf80f4bSopenharmony_ci        ASSERT_NE(container_, nullptr);
568bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("Object1_1"));
578bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("SameNameDifferentUid"));
588bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("ObjectDupe"));
598bf80f4bSopenharmony_ci        container1_1_ = CreateContainer("Container1_1");
608bf80f4bSopenharmony_ci        container_->Add(interface_pointer_cast<IObject>(container1_1_));
618bf80f4bSopenharmony_ci        container1_1_->Add(CreateTestType<IObject>("Object2_1"));
628bf80f4bSopenharmony_ci        container1_1_->Add(CreateTestType<IObject>("ObjectDupe"));
638bf80f4bSopenharmony_ci        container1_1_->Add(CreateTestType<IObject>("SameNameDifferentUid"));
648bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("Object1_3"));
658bf80f4bSopenharmony_ci        container2_1_ = CreateContainer("SameNameDifferentUid");
668bf80f4bSopenharmony_ci        container1_1_->Add(interface_pointer_cast<IObject>(container2_1_));
678bf80f4bSopenharmony_ci
688bf80f4bSopenharmony_ci        ASSERT_EQ(container_->GetSize(), NumDirectChildren);
698bf80f4bSopenharmony_ci
708bf80f4bSopenharmony_ci        container_->OnAdded()->AddHandler(MakeCallback<IOnChildChanged>(this, &ContainerTestBase::OnAdded));
718bf80f4bSopenharmony_ci        container_->OnRemoved()->AddHandler(MakeCallback<IOnChildChanged>(this, &ContainerTestBase::OnRemoved));
728bf80f4bSopenharmony_ci        container_->OnMoved()->AddHandler(MakeCallback<IOnChildMoved>(this, &ContainerTestBase::OnMoved));
738bf80f4bSopenharmony_ci    }
748bf80f4bSopenharmony_ci    void TearDown() override
758bf80f4bSopenharmony_ci    {
768bf80f4bSopenharmony_ci        container_.reset();
778bf80f4bSopenharmony_ci    }
788bf80f4bSopenharmony_ci
798bf80f4bSopenharmony_ci    static void SetUpTestSuite()
808bf80f4bSopenharmony_ci    {
818bf80f4bSopenharmony_ci        SetTest();
828bf80f4bSopenharmony_ci    }
838bf80f4bSopenharmony_ci    static void TearDownTestSuite()
848bf80f4bSopenharmony_ci    {
858bf80f4bSopenharmony_ci        ResetTest();
868bf80f4bSopenharmony_ci    }
878bf80f4bSopenharmony_ci
888bf80f4bSopenharmony_ciprotected:
898bf80f4bSopenharmony_ci    void OnAdded(const ChildChangedInfo& info)
908bf80f4bSopenharmony_ci    {
918bf80f4bSopenharmony_ci        addedCalls_.push_back(info);
928bf80f4bSopenharmony_ci    }
938bf80f4bSopenharmony_ci    void OnRemoved(const ChildChangedInfo& info)
948bf80f4bSopenharmony_ci    {
958bf80f4bSopenharmony_ci        removedCalls_.push_back(info);
968bf80f4bSopenharmony_ci    }
978bf80f4bSopenharmony_ci    void OnMoved(const ChildMovedInfo& info)
988bf80f4bSopenharmony_ci    {
998bf80f4bSopenharmony_ci        movedCalls_.push_back(info);
1008bf80f4bSopenharmony_ci    }
1018bf80f4bSopenharmony_ci
1028bf80f4bSopenharmony_ci    BASE_NS::vector<ChildChangedInfo> addedCalls_;
1038bf80f4bSopenharmony_ci    BASE_NS::vector<ChildChangedInfo> removedCalls_;
1048bf80f4bSopenharmony_ci    BASE_NS::vector<ChildMovedInfo> movedCalls_;
1058bf80f4bSopenharmony_ci
1068bf80f4bSopenharmony_ci    static constexpr size_t NumDirectChildContainers = 1;
1078bf80f4bSopenharmony_ci    static constexpr size_t NumDirectChildTestTypes = 4;
1088bf80f4bSopenharmony_ci    static constexpr size_t NumDirectChildren = NumDirectChildContainers + NumDirectChildTestTypes;
1098bf80f4bSopenharmony_ci    static constexpr size_t NumChildContainers = 2;
1108bf80f4bSopenharmony_ci    static constexpr size_t NumChildTestTypes = 7;
1118bf80f4bSopenharmony_ci    IContainer::Ptr container_;
1128bf80f4bSopenharmony_ci    IContainer::Ptr container1_1_;
1138bf80f4bSopenharmony_ci    IContainer::Ptr container2_1_;
1148bf80f4bSopenharmony_ci};
1158bf80f4bSopenharmony_ci
1168bf80f4bSopenharmony_ciclass ContainerCommonTest : public ContainerTestBase, public ::testing::WithParamInterface<ClassInfo> {
1178bf80f4bSopenharmony_cipublic:
1188bf80f4bSopenharmony_ci    IContainer::Ptr CreateContainer(BASE_NS::string name) override
1198bf80f4bSopenharmony_ci    {
1208bf80f4bSopenharmony_ci        return CreateTestContainer<IContainer>(name, GetParam());
1218bf80f4bSopenharmony_ci    }
1228bf80f4bSopenharmony_ci};
1238bf80f4bSopenharmony_ci
1248bf80f4bSopenharmony_ciclass ContainerTest : public ContainerTestBase {
1258bf80f4bSopenharmony_cipublic:
1268bf80f4bSopenharmony_ci    IContainer::Ptr CreateContainer(BASE_NS::string name) override
1278bf80f4bSopenharmony_ci    {
1288bf80f4bSopenharmony_ci        return CreateTestContainer<IContainer>(name, META_NS::ClassId::TestContainer);
1298bf80f4bSopenharmony_ci    }
1308bf80f4bSopenharmony_ci};
1318bf80f4bSopenharmony_ci
1328bf80f4bSopenharmony_ciclass FlatContainerTest : public ContainerTestBase {
1338bf80f4bSopenharmony_cipublic:
1348bf80f4bSopenharmony_ci    IContainer::Ptr CreateContainer(BASE_NS::string name) override
1358bf80f4bSopenharmony_ci    {
1368bf80f4bSopenharmony_ci        return CreateTestContainer<IContainer>(name, META_NS::ClassId::TestFlatContainer);
1378bf80f4bSopenharmony_ci    }
1388bf80f4bSopenharmony_ci};
1398bf80f4bSopenharmony_ci
1408bf80f4bSopenharmony_ci/**
1418bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
1428bf80f4bSopenharmony_ci * @tc.desc: test IsAncestorOf function
1438bf80f4bSopenharmony_ci * @tc.type: FUNC
1448bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1458bf80f4bSopenharmony_ci */
1468bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, IsAncestorOf, TestSize.Level1)
1478bf80f4bSopenharmony_ci{
1488bf80f4bSopenharmony_ci    auto object = container1_1_->FindAnyFromHierarchy<IObject>("Object2_1");
1498bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1508bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->IsAncestorOf(object));
1518bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->IsAncestorOf(nullptr));
1528bf80f4bSopenharmony_ci
1538bf80f4bSopenharmony_ci    auto object2 = CreateTestType<IObject>("NotThere");
1548bf80f4bSopenharmony_ci    ASSERT_NE(object2, nullptr);
1558bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->IsAncestorOf(object2));
1568bf80f4bSopenharmony_ci
1578bf80f4bSopenharmony_ci    auto container2 = CreateTestContainer<IContainer>("Container2");
1588bf80f4bSopenharmony_ci    ASSERT_NE(container2, nullptr);
1598bf80f4bSopenharmony_ci    EXPECT_FALSE(container2->IsAncestorOf(object2));
1608bf80f4bSopenharmony_ci    EXPECT_TRUE(container2->Add(object2));
1618bf80f4bSopenharmony_ci    EXPECT_TRUE(container2->IsAncestorOf(object2));
1628bf80f4bSopenharmony_ci}
1638bf80f4bSopenharmony_ci
1648bf80f4bSopenharmony_ci/**
1658bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
1668bf80f4bSopenharmony_ci * @tc.desc: test AddChild function
1678bf80f4bSopenharmony_ci * @tc.type: FUNC
1688bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1698bf80f4bSopenharmony_ci */
1708bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, AddChild, TestSize.Level1)
1718bf80f4bSopenharmony_ci{
1728bf80f4bSopenharmony_ci    const auto object = interface_pointer_cast<IObject>(CreateTestType());
1738bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Add(object));
1748bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
1758bf80f4bSopenharmony_ci
1768bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(1));
1778bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
1788bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1798bf80f4bSopenharmony_ci    auto expected = ChildChangedInfo { object, NumDirectChildren, container_ };
1808bf80f4bSopenharmony_ci    EXPECT_EQ(addedCalls_[0], expected);
1818bf80f4bSopenharmony_ci}
1828bf80f4bSopenharmony_ci
1838bf80f4bSopenharmony_ci/**
1848bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
1858bf80f4bSopenharmony_ci * @tc.desc: test Insert function
1868bf80f4bSopenharmony_ci * @tc.type: FUNC
1878bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1888bf80f4bSopenharmony_ci */
1898bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, Insert, TestSize.Level1)
1908bf80f4bSopenharmony_ci{
1918bf80f4bSopenharmony_ci    auto all = container_->GetAll();
1928bf80f4bSopenharmony_ci    auto expectedSize = NumDirectChildren;
1938bf80f4bSopenharmony_ci    const auto item1 = interface_pointer_cast<IObject>(CreateTestType());
1948bf80f4bSopenharmony_ci    const auto item2 = interface_pointer_cast<IObject>(CreateTestType());
1958bf80f4bSopenharmony_ci    const auto item3 = interface_pointer_cast<IObject>(CreateTestType());
1968bf80f4bSopenharmony_ci
1978bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Insert(all.size(), item1));
1988bf80f4bSopenharmony_ci    all = container_->GetAll();
1998bf80f4bSopenharmony_ci    EXPECT_EQ(all.size(), ++expectedSize);
2008bf80f4bSopenharmony_ci    EXPECT_EQ(all.back(), item1);
2018bf80f4bSopenharmony_ci
2028bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Insert(0, item2));
2038bf80f4bSopenharmony_ci    all = container_->GetAll();
2048bf80f4bSopenharmony_ci    EXPECT_EQ(all.size(), ++expectedSize);
2058bf80f4bSopenharmony_ci    EXPECT_EQ(all.front(), item2);
2068bf80f4bSopenharmony_ci
2078bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Insert(all.size() + 10, item3));
2088bf80f4bSopenharmony_ci    all = container_->GetAll();
2098bf80f4bSopenharmony_ci    EXPECT_EQ(all.size(), ++expectedSize);
2108bf80f4bSopenharmony_ci    EXPECT_EQ(all.back(), item3);
2118bf80f4bSopenharmony_ci
2128bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(3));
2138bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
2148bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
2158bf80f4bSopenharmony_ci    auto expected1 = ChildChangedInfo { item1, NumDirectChildren, container_ };
2168bf80f4bSopenharmony_ci    auto expected2 = ChildChangedInfo { item2, 0, container_ };
2178bf80f4bSopenharmony_ci    auto expected3 = ChildChangedInfo { item3, expectedSize - 1, container_ };
2188bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, ElementsAre(expected1, expected2, expected3));
2198bf80f4bSopenharmony_ci}
2208bf80f4bSopenharmony_ci
2218bf80f4bSopenharmony_ci/**
2228bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
2238bf80f4bSopenharmony_ci * @tc.desc: test GetAt function
2248bf80f4bSopenharmony_ci * @tc.type: FUNC
2258bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2268bf80f4bSopenharmony_ci */
2278bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, GetAt, TestSize.Level1)
2288bf80f4bSopenharmony_ci{
2298bf80f4bSopenharmony_ci    const auto all = container_->GetAll();
2308bf80f4bSopenharmony_ci    ASSERT_EQ(all.size(), NumDirectChildren);
2318bf80f4bSopenharmony_ci
2328bf80f4bSopenharmony_ci    EXPECT_EQ(all.front(), container_->GetAt(0));
2338bf80f4bSopenharmony_ci    EXPECT_EQ(all.back(), container_->GetAt(NumDirectChildren - 1));
2348bf80f4bSopenharmony_ci    EXPECT_EQ(all[NumDirectChildren / 2], container_->GetAt(NumDirectChildren / 2));
2358bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(NumDirectChildren + 10), nullptr);
2368bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
2378bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
2388bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
2398bf80f4bSopenharmony_ci}
2408bf80f4bSopenharmony_ci
2418bf80f4bSopenharmony_ci/**
2428bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
2438bf80f4bSopenharmony_ci * @tc.desc: test RemoveChild function
2448bf80f4bSopenharmony_ci * @tc.type: FUNC
2458bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2468bf80f4bSopenharmony_ci */
2478bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, RemoveChild, TestSize.Level1)
2488bf80f4bSopenharmony_ci{
2498bf80f4bSopenharmony_ci    auto children = container_->GetAll();
2508bf80f4bSopenharmony_ci    auto expectedCount = NumDirectChildren;
2518bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
2528bf80f4bSopenharmony_ci
2538bf80f4bSopenharmony_ci    BASE_NS::vector<ChildChangedInfo> removed;
2548bf80f4bSopenharmony_ci
2558bf80f4bSopenharmony_ci    auto baseIndex = expectedCount / 3;
2568bf80f4bSopenharmony_ci
2578bf80f4bSopenharmony_ci    while (!children.empty()) {
2588bf80f4bSopenharmony_ci        auto index = ++baseIndex % expectedCount;
2598bf80f4bSopenharmony_ci        const auto child = children[index];
2608bf80f4bSopenharmony_ci        removed.push_back({ child, index, container_ });
2618bf80f4bSopenharmony_ci        EXPECT_TRUE(container_->Remove(child));
2628bf80f4bSopenharmony_ci
2638bf80f4bSopenharmony_ci        expectedCount--;
2648bf80f4bSopenharmony_ci        children = container_->GetAll();
2658bf80f4bSopenharmony_ci
2668bf80f4bSopenharmony_ci        EXPECT_THAT(children, Not(Contains(child)));
2678bf80f4bSopenharmony_ci        ASSERT_EQ(children.size(), expectedCount);
2688bf80f4bSopenharmony_ci    }
2698bf80f4bSopenharmony_ci
2708bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(0));
2718bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(NumDirectChildren));
2728bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
2738bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, ElementsAreArray(removed));
2748bf80f4bSopenharmony_ci}
2758bf80f4bSopenharmony_ci
2768bf80f4bSopenharmony_ci/**
2778bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
2788bf80f4bSopenharmony_ci * @tc.desc: test RemoveIndex function
2798bf80f4bSopenharmony_ci * @tc.type: FUNC
2808bf80f4bSopenharmony_ci * @tc.require: I7DMS1
2818bf80f4bSopenharmony_ci */
2828bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, RemoveIndex, TestSize.Level1)
2838bf80f4bSopenharmony_ci{
2848bf80f4bSopenharmony_ci    auto children = container_->GetAll();
2858bf80f4bSopenharmony_ci    auto expectedCount = NumDirectChildren;
2868bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
2878bf80f4bSopenharmony_ci
2888bf80f4bSopenharmony_ci    BASE_NS::vector<ChildChangedInfo> removed;
2898bf80f4bSopenharmony_ci
2908bf80f4bSopenharmony_ci    auto baseIndex = expectedCount / 3;
2918bf80f4bSopenharmony_ci
2928bf80f4bSopenharmony_ci    while (!children.empty()) {
2938bf80f4bSopenharmony_ci        auto index = ++baseIndex % expectedCount;
2948bf80f4bSopenharmony_ci        const auto child = children[index];
2958bf80f4bSopenharmony_ci        removed.push_back({ child, index, container_ });
2968bf80f4bSopenharmony_ci        EXPECT_TRUE(container_->Remove(index));
2978bf80f4bSopenharmony_ci
2988bf80f4bSopenharmony_ci        expectedCount--;
2998bf80f4bSopenharmony_ci        children = container_->GetAll();
3008bf80f4bSopenharmony_ci
3018bf80f4bSopenharmony_ci        EXPECT_THAT(children, Not(Contains(child)));
3028bf80f4bSopenharmony_ci        ASSERT_EQ(children.size(), expectedCount);
3038bf80f4bSopenharmony_ci    }
3048bf80f4bSopenharmony_ci
3058bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(0));
3068bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(NumDirectChildren));
3078bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
3088bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, ElementsAreArray(removed));
3098bf80f4bSopenharmony_ci}
3108bf80f4bSopenharmony_ci
3118bf80f4bSopenharmony_ci/**
3128bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
3138bf80f4bSopenharmony_ci * @tc.desc: test RemoveChildInvalid function
3148bf80f4bSopenharmony_ci * @tc.type: FUNC
3158bf80f4bSopenharmony_ci * @tc.require: I7DMS1
3168bf80f4bSopenharmony_ci */
3178bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, RemoveChildInvalid, TestSize.Level1)
3188bf80f4bSopenharmony_ci{
3198bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
3208bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
3218bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
3228bf80f4bSopenharmony_ci
3238bf80f4bSopenharmony_ci    const auto invalid = interface_pointer_cast<IObject>(CreateTestType());
3248bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Remove(invalid));
3258bf80f4bSopenharmony_ci    EXPECT_EQ(children.size(), expectedCount);
3268bf80f4bSopenharmony_ci    EXPECT_THAT(children, Not(Contains(invalid)));
3278bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Remove(nullptr));
3288bf80f4bSopenharmony_ci    EXPECT_EQ(children.size(), expectedCount);
3298bf80f4bSopenharmony_ci    EXPECT_THAT(children, Not(Contains(invalid)));
3308bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
3318bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
3328bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
3338bf80f4bSopenharmony_ci}
3348bf80f4bSopenharmony_ci
3358bf80f4bSopenharmony_ci/**
3368bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
3378bf80f4bSopenharmony_ci * @tc.desc: test RemoveAll function
3388bf80f4bSopenharmony_ci * @tc.type: FUNC
3398bf80f4bSopenharmony_ci * @tc.require: I7DMS1
3408bf80f4bSopenharmony_ci */
3418bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, RemoveAll, TestSize.Level1)
3428bf80f4bSopenharmony_ci{
3438bf80f4bSopenharmony_ci    container_->RemoveAll();
3448bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), 0);
3458bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), IsEmpty());
3468bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
3478bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(NumDirectChildren));
3488bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
3498bf80f4bSopenharmony_ci}
3508bf80f4bSopenharmony_ci
3518bf80f4bSopenharmony_ci/**
3528bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
3538bf80f4bSopenharmony_ci * @tc.desc: test Replace function
3548bf80f4bSopenharmony_ci * @tc.type: FUNC
3558bf80f4bSopenharmony_ci * @tc.require: I7DMS1
3568bf80f4bSopenharmony_ci */
3578bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, Replace, TestSize.Level1)
3588bf80f4bSopenharmony_ci{
3598bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
3608bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
3618bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
3628bf80f4bSopenharmony_ci
3638bf80f4bSopenharmony_ci    auto index = expectedCount / 2;
3648bf80f4bSopenharmony_ci    const auto replace = children[index];
3658bf80f4bSopenharmony_ci    const auto replaceWith = interface_pointer_cast<IObject>(CreateTestType("Replaced"));
3668bf80f4bSopenharmony_ci
3678bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replace, replaceWith, false));
3688bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
3698bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replaceWith));
3708bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replace)));
3718bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
3728bf80f4bSopenharmony_ci    const auto removed = ChildChangedInfo { replace, index, container_ };
3738bf80f4bSopenharmony_ci    const auto added = ChildChangedInfo { replaceWith, index, container_ };
3748bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, ElementsAre(added));
3758bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, ElementsAre(removed));
3768bf80f4bSopenharmony_ci}
3778bf80f4bSopenharmony_ci
3788bf80f4bSopenharmony_ci/**
3798bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
3808bf80f4bSopenharmony_ci * @tc.desc: test ReplaceSame function
3818bf80f4bSopenharmony_ci * @tc.type: FUNC
3828bf80f4bSopenharmony_ci * @tc.require: I7DMS1
3838bf80f4bSopenharmony_ci */
3848bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, ReplaceSame, TestSize.Level1)
3858bf80f4bSopenharmony_ci{
3868bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
3878bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
3888bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
3898bf80f4bSopenharmony_ci
3908bf80f4bSopenharmony_ci    const auto notThere = interface_pointer_cast<IObject>(CreateTestType("NotThere"));
3918bf80f4bSopenharmony_ci    const auto replace = children[expectedCount / 2];
3928bf80f4bSopenharmony_ci    const auto replaceWith = children[expectedCount / 2];
3938bf80f4bSopenharmony_ci
3948bf80f4bSopenharmony_ci    ASSERT_EQ(replace, replaceWith);
3958bf80f4bSopenharmony_ci
3968bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replace, replaceWith));
3978bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
3988bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replaceWith));
3998bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replace));
4008bf80f4bSopenharmony_ci
4018bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace(notThere, notThere));
4028bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
4038bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(notThere)));
4048bf80f4bSopenharmony_ci
4058bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
4068bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4078bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4088bf80f4bSopenharmony_ci
4098bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(notThere, notThere, true));
4108bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount + 1);
4118bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(notThere));
4128bf80f4bSopenharmony_ci
4138bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4148bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4158bf80f4bSopenharmony_ci    const auto added = ChildChangedInfo { notThere, expectedCount, container_ };
4168bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, ElementsAre(added));
4178bf80f4bSopenharmony_ci}
4188bf80f4bSopenharmony_ci
4198bf80f4bSopenharmony_ci/**
4208bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
4218bf80f4bSopenharmony_ci * @tc.desc: test ReplaceNull function
4228bf80f4bSopenharmony_ci * @tc.type: FUNC
4238bf80f4bSopenharmony_ci * @tc.require: I7DMS1
4248bf80f4bSopenharmony_ci */
4258bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, ReplaceNull, TestSize.Level1)
4268bf80f4bSopenharmony_ci{
4278bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
4288bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), NumDirectChildren);
4298bf80f4bSopenharmony_ci    const auto replaceWith = interface_pointer_cast<IObject>(CreateTestType("Replaced"));
4308bf80f4bSopenharmony_ci    const auto replaceWith2 = interface_pointer_cast<IObject>(CreateTestType("Replaced2"));
4318bf80f4bSopenharmony_ci
4328bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace({}, {}, false));
4338bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
4348bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace({}, {}, true));
4358bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
4368bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
4378bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4388bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4398bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace({}, replaceWith, false));
4408bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
4418bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
4428bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4438bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4448bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace({}, replaceWith, true));
4458bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
4468bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace({}, replaceWith2, false));
4478bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
4488bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4498bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4508bf80f4bSopenharmony_ci    const auto added = ChildChangedInfo { replaceWith, NumDirectChildren, container_ };
4518bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, ElementsAre(added));
4528bf80f4bSopenharmony_ci    addedCalls_.clear();
4538bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replaceWith, {}, false));
4548bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
4558bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace({}, replaceWith2, true));
4568bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
4578bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replaceWith2, {}, true));
4588bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
4598bf80f4bSopenharmony_ci    const auto removed1 = ChildChangedInfo { replaceWith, NumDirectChildren, container_ };
4608bf80f4bSopenharmony_ci    const auto removed2 = ChildChangedInfo { replaceWith2, NumDirectChildren, container_ };
4618bf80f4bSopenharmony_ci    const auto added2 = ChildChangedInfo { replaceWith2, NumDirectChildren, container_ };
4628bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, ElementsAre(removed1, removed2));
4638bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4648bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, ElementsAre(added2));
4658bf80f4bSopenharmony_ci}
4668bf80f4bSopenharmony_ci
4678bf80f4bSopenharmony_ci/**
4688bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
4698bf80f4bSopenharmony_ci * @tc.desc: test ReplaceAdd function
4708bf80f4bSopenharmony_ci * @tc.type: FUNC
4718bf80f4bSopenharmony_ci * @tc.require: I7DMS1
4728bf80f4bSopenharmony_ci */
4738bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, ReplaceAdd, TestSize.Level1)
4748bf80f4bSopenharmony_ci{
4758bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
4768bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
4778bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
4788bf80f4bSopenharmony_ci
4798bf80f4bSopenharmony_ci    const auto replace = interface_pointer_cast<IObject>(CreateTestType("NotThere"));
4808bf80f4bSopenharmony_ci    const auto replaceWith = interface_pointer_cast<IObject>(CreateTestType("Replaced"));
4818bf80f4bSopenharmony_ci
4828bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace(replace, replaceWith, false));
4838bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
4848bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replaceWith)));
4858bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replace)));
4868bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
4878bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4888bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4898bf80f4bSopenharmony_ci
4908bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replace, replaceWith, true));
4918bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount + 1);
4928bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replaceWith));
4938bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replace)));
4948bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
4958bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
4968bf80f4bSopenharmony_ci    const auto added = ChildChangedInfo { replaceWith, expectedCount, container_ };
4978bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, ElementsAre(added));
4988bf80f4bSopenharmony_ci}
4998bf80f4bSopenharmony_ci
5008bf80f4bSopenharmony_ci/**
5018bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
5028bf80f4bSopenharmony_ci * @tc.desc: test MoveEmpty function
5038bf80f4bSopenharmony_ci * @tc.type: FUNC
5048bf80f4bSopenharmony_ci * @tc.require: I7DMS1
5058bf80f4bSopenharmony_ci */
5068bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveEmpty, TestSize.Level1)
5078bf80f4bSopenharmony_ci{
5088bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(0);
5098bf80f4bSopenharmony_ci    container_->RemoveAll();
5108bf80f4bSopenharmony_ci    removedCalls_.clear();
5118bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Move(1, 1));
5128bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Move(0, 0));
5138bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Move(0, 1));
5148bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Move(moveItem, 1));
5158bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Move(moveItem, 0));
5168bf80f4bSopenharmony_ci
5178bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
5188bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
5198bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
5208bf80f4bSopenharmony_ci}
5218bf80f4bSopenharmony_ci
5228bf80f4bSopenharmony_ci/**
5238bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
5248bf80f4bSopenharmony_ci * @tc.desc: test MoveBack function
5258bf80f4bSopenharmony_ci * @tc.type: FUNC
5268bf80f4bSopenharmony_ci * @tc.require: I7DMS1
5278bf80f4bSopenharmony_ci */
5288bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveBack, TestSize.Level1)
5298bf80f4bSopenharmony_ci{
5308bf80f4bSopenharmony_ci    size_t from = NumDirectChildren - 1;
5318bf80f4bSopenharmony_ci    size_t to = 0;
5328bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(from);
5338bf80f4bSopenharmony_ci    auto moved = ChildMovedInfo { moveItem, from, to, container_ };
5348bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
5358bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(to), moveItem);
5368bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
5378bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
5388bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
5398bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
5408bf80f4bSopenharmony_ci}
5418bf80f4bSopenharmony_ci
5428bf80f4bSopenharmony_ci/**
5438bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
5448bf80f4bSopenharmony_ci * @tc.desc: test MoveForward function
5458bf80f4bSopenharmony_ci * @tc.type: FUNC
5468bf80f4bSopenharmony_ci * @tc.require: I7DMS1
5478bf80f4bSopenharmony_ci */
5488bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveForward, TestSize.Level1)
5498bf80f4bSopenharmony_ci{
5508bf80f4bSopenharmony_ci    size_t from = 0;
5518bf80f4bSopenharmony_ci    size_t to = NumDirectChildren - 1;
5528bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(from);
5538bf80f4bSopenharmony_ci    auto moved = ChildMovedInfo { moveItem, from, to, container_ };
5548bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
5558bf80f4bSopenharmony_ci
5568bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(to), moveItem);
5578bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
5588bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
5598bf80f4bSopenharmony_ci}
5608bf80f4bSopenharmony_ci
5618bf80f4bSopenharmony_ci/**
5628bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
5638bf80f4bSopenharmony_ci * @tc.desc: test MoveNext function
5648bf80f4bSopenharmony_ci * @tc.type: FUNC
5658bf80f4bSopenharmony_ci * @tc.require: I7DMS1
5668bf80f4bSopenharmony_ci */
5678bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveNext, TestSize.Level1)
5688bf80f4bSopenharmony_ci{
5698bf80f4bSopenharmony_ci    size_t from = NumDirectChildren / 2;
5708bf80f4bSopenharmony_ci    size_t to = from + 1;
5718bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(from);
5728bf80f4bSopenharmony_ci    auto moved = ChildMovedInfo { moveItem, from, to, container_ };
5738bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
5748bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(to), moveItem);
5758bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
5768bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
5778bf80f4bSopenharmony_ci}
5788bf80f4bSopenharmony_ci
5798bf80f4bSopenharmony_ci/**
5808bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
5818bf80f4bSopenharmony_ci * @tc.desc: test MoveSame function
5828bf80f4bSopenharmony_ci * @tc.type: FUNC
5838bf80f4bSopenharmony_ci * @tc.require: I7DMS1
5848bf80f4bSopenharmony_ci */
5858bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveSame, TestSize.Level1)
5868bf80f4bSopenharmony_ci{
5878bf80f4bSopenharmony_ci    size_t from = NumDirectChildren / 2;
5888bf80f4bSopenharmony_ci    size_t to = from;
5898bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(from);
5908bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
5918bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(to), moveItem);
5928bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
5938bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
5948bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
5958bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
5968bf80f4bSopenharmony_ci}
5978bf80f4bSopenharmony_ci
5988bf80f4bSopenharmony_ci/**
5998bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
6008bf80f4bSopenharmony_ci * @tc.desc: test MoveFromBiggerThanSize function
6018bf80f4bSopenharmony_ci * @tc.type: FUNC
6028bf80f4bSopenharmony_ci * @tc.require: I7DMS1
6038bf80f4bSopenharmony_ci */
6048bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveFromBiggerThanSize, TestSize.Level1)
6058bf80f4bSopenharmony_ci{
6068bf80f4bSopenharmony_ci    size_t from = NumDirectChildren + 10;
6078bf80f4bSopenharmony_ci    size_t to = 0;
6088bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(NumDirectChildren - 1);
6098bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
6108bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(to), moveItem);
6118bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
6128bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
6138bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
6148bf80f4bSopenharmony_ci    auto moved = ChildMovedInfo { moveItem, NumDirectChildren - 1, to, container_ };
6158bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
6168bf80f4bSopenharmony_ci}
6178bf80f4bSopenharmony_ci
6188bf80f4bSopenharmony_ci/**
6198bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
6208bf80f4bSopenharmony_ci * @tc.desc: test MoveToBiggerThanSize function
6218bf80f4bSopenharmony_ci * @tc.type: FUNC
6228bf80f4bSopenharmony_ci * @tc.require: I7DMS1
6238bf80f4bSopenharmony_ci */
6248bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveToBiggerThanSize, TestSize.Level1)
6258bf80f4bSopenharmony_ci{
6268bf80f4bSopenharmony_ci    size_t from = NumDirectChildren / 2;
6278bf80f4bSopenharmony_ci    size_t to = NumDirectChildren + 10;
6288bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(from);
6298bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
6308bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(NumDirectChildren - 1), moveItem);
6318bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
6328bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
6338bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
6348bf80f4bSopenharmony_ci    auto moved = ChildMovedInfo { moveItem, from, NumDirectChildren - 1, container_ };
6358bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
6368bf80f4bSopenharmony_ci}
6378bf80f4bSopenharmony_ci
6388bf80f4bSopenharmony_ci/**
6398bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
6408bf80f4bSopenharmony_ci * @tc.desc: test MoveFromToBiggerThanSize function
6418bf80f4bSopenharmony_ci * @tc.type: FUNC
6428bf80f4bSopenharmony_ci * @tc.require: I7DMS1
6438bf80f4bSopenharmony_ci */
6448bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveFromToBiggerThanSize, TestSize.Level1)
6458bf80f4bSopenharmony_ci{
6468bf80f4bSopenharmony_ci    size_t from = NumDirectChildren + 10;
6478bf80f4bSopenharmony_ci    size_t to = NumDirectChildren + 4;
6488bf80f4bSopenharmony_ci    auto moveItem = container_->GetAt(NumDirectChildren - 1);
6498bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(from, to));
6508bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(NumDirectChildren - 1), moveItem);
6518bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
6528bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
6538bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
6548bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
6558bf80f4bSopenharmony_ci}
6568bf80f4bSopenharmony_ci
6578bf80f4bSopenharmony_ci/**
6588bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
6598bf80f4bSopenharmony_ci * @tc.desc: test MoveObject function
6608bf80f4bSopenharmony_ci * @tc.type: FUNC
6618bf80f4bSopenharmony_ci * @tc.require: I7DMS1
6628bf80f4bSopenharmony_ci */
6638bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, MoveObject, TestSize.Level1)
6648bf80f4bSopenharmony_ci{
6658bf80f4bSopenharmony_ci    size_t from = NumDirectChildren - 1;
6668bf80f4bSopenharmony_ci    size_t to = 0;
6678bf80f4bSopenharmony_ci    const auto child = container_->GetAt(from);
6688bf80f4bSopenharmony_ci    auto moved = ChildMovedInfo { child, from, to, container_ };
6698bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Move(child, to));
6708bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetAt(to), child);
6718bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren);
6728bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
6738bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
6748bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
6758bf80f4bSopenharmony_ci}
6768bf80f4bSopenharmony_ci
6778bf80f4bSopenharmony_ci/**
6788bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
6798bf80f4bSopenharmony_ci * @tc.desc: test FindAllNameDirect function
6808bf80f4bSopenharmony_ci * @tc.type: FUNC
6818bf80f4bSopenharmony_ci * @tc.require: I7DMS1
6828bf80f4bSopenharmony_ci */
6838bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, FindAllNameDirect, TestSize.Level1)
6848bf80f4bSopenharmony_ci{
6858bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "Object1_1", TraversalType::NO_HIERARCHY, {}, false });
6868bf80f4bSopenharmony_ci    auto result2 = container_->FindAll({ "Object2_1", TraversalType::NO_HIERARCHY, {}, false });
6878bf80f4bSopenharmony_ci
6888bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(1));
6898bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(0));
6908bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
6918bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
6928bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
6938bf80f4bSopenharmony_ci}
6948bf80f4bSopenharmony_ci
6958bf80f4bSopenharmony_ci/**
6968bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
6978bf80f4bSopenharmony_ci * @tc.desc: test SetRequiredInterfacesReplace function
6988bf80f4bSopenharmony_ci * @tc.type: FUNC
6998bf80f4bSopenharmony_ci * @tc.require: I7DMS1
7008bf80f4bSopenharmony_ci */
7018bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, SetRequiredInterfacesReplace, TestSize.Level1)
7028bf80f4bSopenharmony_ci{
7038bf80f4bSopenharmony_ci    auto req = interface_cast<IRequiredInterfaces>(container_);
7048bf80f4bSopenharmony_ci    ASSERT_TRUE(req);
7058bf80f4bSopenharmony_ci    EXPECT_TRUE(req->SetRequiredInterfaces({ ITestType::UID }));
7068bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildTestTypes);
7078bf80f4bSopenharmony_ci
7088bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
7098bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildTestTypes;
7108bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
7118bf80f4bSopenharmony_ci    const auto replace = children[expectedCount / 2];
7128bf80f4bSopenharmony_ci
7138bf80f4bSopenharmony_ci    const auto replaceWithItem = interface_pointer_cast<IObject>(CreateTestType("Replaced"));
7148bf80f4bSopenharmony_ci    const auto replaceWithContainer = interface_pointer_cast<IObject>(CreateTestContainer("Replaced"));
7158bf80f4bSopenharmony_ci
7168bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace(replace, replaceWithContainer, false));
7178bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
7188bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replaceWithContainer)));
7198bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replace));
7208bf80f4bSopenharmony_ci
7218bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace(replace, replaceWithContainer, true));
7228bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
7238bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replaceWithContainer)));
7248bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replace));
7258bf80f4bSopenharmony_ci
7268bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replace, replaceWithItem, false));
7278bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
7288bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Contains(replaceWithItem));
7298bf80f4bSopenharmony_ci    EXPECT_THAT(container_->GetAll(), Not(Contains(replace)));
7308bf80f4bSopenharmony_ci}
7318bf80f4bSopenharmony_ci
7328bf80f4bSopenharmony_ci/**
7338bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
7348bf80f4bSopenharmony_ci * @tc.desc: test FindAnyNameDirect function
7358bf80f4bSopenharmony_ci * @tc.type: FUNC
7368bf80f4bSopenharmony_ci * @tc.require: I7DMS1
7378bf80f4bSopenharmony_ci */
7388bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, FindAnyNameDirect, TestSize.Level1)
7398bf80f4bSopenharmony_ci{
7408bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "Object1_1", TraversalType::NO_HIERARCHY, {}, false });
7418bf80f4bSopenharmony_ci    auto result2 = container_->FindAny({ "Object2_1", TraversalType::NO_HIERARCHY, {}, false });
7428bf80f4bSopenharmony_ci
7438bf80f4bSopenharmony_ci    EXPECT_NE(result1, nullptr);
7448bf80f4bSopenharmony_ci    EXPECT_EQ(result2, nullptr);
7458bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
7468bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
7478bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
7488bf80f4bSopenharmony_ci}
7498bf80f4bSopenharmony_ci
7508bf80f4bSopenharmony_ci/**
7518bf80f4bSopenharmony_ci * @tc.name: ContainerCommonTest
7528bf80f4bSopenharmony_ci * @tc.desc: test SetRequiredInterfaces function
7538bf80f4bSopenharmony_ci * @tc.type: FUNC
7548bf80f4bSopenharmony_ci * @tc.require: I7DMS1
7558bf80f4bSopenharmony_ci */
7568bf80f4bSopenharmony_ciHWTEST_P(ContainerCommonTest, SetRequiredInterfaces, TestSize.Level1)
7578bf80f4bSopenharmony_ci{
7588bf80f4bSopenharmony_ci    auto req = interface_cast<IRequiredInterfaces>(container_);
7598bf80f4bSopenharmony_ci    ASSERT_TRUE(req);
7608bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildContainers + NumDirectChildTestTypes);
7618bf80f4bSopenharmony_ci    EXPECT_TRUE(req->SetRequiredInterfaces({ ITestType::UID }));
7628bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildTestTypes);
7638bf80f4bSopenharmony_ci    EXPECT_TRUE(req->SetRequiredInterfaces({ ITestContainer::UID }));
7648bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), 0);
7658bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Add(interface_pointer_cast<IObject>(CreateTestType())));
7668bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), 0);
7678bf80f4bSopenharmony_ci    const auto container = interface_pointer_cast<IObject>(CreateTestContainer());
7688bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Add(container));
7698bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), 1);
7708bf80f4bSopenharmony_ci    const auto all = container_->GetAll();
7718bf80f4bSopenharmony_ci    ASSERT_THAT(all, SizeIs(1));
7728bf80f4bSopenharmony_ci    EXPECT_EQ(all[0], container);
7738bf80f4bSopenharmony_ci}
7748bf80f4bSopenharmony_ci
7758bf80f4bSopenharmony_ci/**
7768bf80f4bSopenharmony_ci * @tc.name: ContainerTest
7778bf80f4bSopenharmony_ci * @tc.desc: test FailAddLoop function
7788bf80f4bSopenharmony_ci * @tc.type: FUNC
7798bf80f4bSopenharmony_ci * @tc.require: I7DMS1
7808bf80f4bSopenharmony_ci */
7818bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FailAddLoop, TestSize.Level1)
7828bf80f4bSopenharmony_ci{
7838bf80f4bSopenharmony_ci    EXPECT_FALSE(container2_1_->Add(container_));
7848bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
7858bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
7868bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
7878bf80f4bSopenharmony_ci}
7888bf80f4bSopenharmony_ci
7898bf80f4bSopenharmony_ci/**
7908bf80f4bSopenharmony_ci * @tc.name: ContainerTest
7918bf80f4bSopenharmony_ci * @tc.desc: test FailInsertLoop function
7928bf80f4bSopenharmony_ci * @tc.type: FUNC
7938bf80f4bSopenharmony_ci * @tc.require: I7DMS1
7948bf80f4bSopenharmony_ci */
7958bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FailInsertLoop, TestSize.Level1)
7968bf80f4bSopenharmony_ci{
7978bf80f4bSopenharmony_ci    EXPECT_FALSE(container2_1_->Insert(0, container_));
7988bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
7998bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
8008bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
8018bf80f4bSopenharmony_ci}
8028bf80f4bSopenharmony_ci
8038bf80f4bSopenharmony_ci/**
8048bf80f4bSopenharmony_ci * @tc.name: ContainerTest
8058bf80f4bSopenharmony_ci * @tc.desc: test FailReplaceLoop function
8068bf80f4bSopenharmony_ci * @tc.type: FUNC
8078bf80f4bSopenharmony_ci * @tc.require: I7DMS1
8088bf80f4bSopenharmony_ci */
8098bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FailReplaceLoop, TestSize.Level1)
8108bf80f4bSopenharmony_ci{
8118bf80f4bSopenharmony_ci    EXPECT_FALSE(container1_1_->Replace(container1_1_->GetAll()[1], container_));
8128bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
8138bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
8148bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
8158bf80f4bSopenharmony_ci}
8168bf80f4bSopenharmony_ci
8178bf80f4bSopenharmony_ci/**
8188bf80f4bSopenharmony_ci * @tc.name: ContainerTest
8198bf80f4bSopenharmony_ci * @tc.desc: test ReplaceNullWithExisting function
8208bf80f4bSopenharmony_ci * @tc.type: FUNC
8218bf80f4bSopenharmony_ci * @tc.require: I7DMS1
8228bf80f4bSopenharmony_ci */
8238bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, ReplaceNullWithExisting, TestSize.Level1)
8248bf80f4bSopenharmony_ci{
8258bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
8268bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
8278bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
8288bf80f4bSopenharmony_ci
8298bf80f4bSopenharmony_ci    auto indexReplace = expectedCount / 2;
8308bf80f4bSopenharmony_ci    const auto replaceWith = children[indexReplace];
8318bf80f4bSopenharmony_ci
8328bf80f4bSopenharmony_ci    EXPECT_FALSE(container_->Replace({}, replaceWith, true));
8338bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount);
8348bf80f4bSopenharmony_ci
8358bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
8368bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
8378bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
8388bf80f4bSopenharmony_ci}
8398bf80f4bSopenharmony_ci
8408bf80f4bSopenharmony_ci/**
8418bf80f4bSopenharmony_ci * @tc.name: ContainerTest
8428bf80f4bSopenharmony_ci * @tc.desc: test ReplaceWithExistingAddAlways function
8438bf80f4bSopenharmony_ci * @tc.type: FUNC
8448bf80f4bSopenharmony_ci * @tc.require: I7DMS1
8458bf80f4bSopenharmony_ci */
8468bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, ReplaceWithExistingAddAlways, TestSize.Level1)
8478bf80f4bSopenharmony_ci{
8488bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
8498bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
8508bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
8518bf80f4bSopenharmony_ci
8528bf80f4bSopenharmony_ci    auto indexReplace = expectedCount / 2;
8538bf80f4bSopenharmony_ci    auto indexReplaceWith = indexReplace + 1;
8548bf80f4bSopenharmony_ci    const auto replace = children[indexReplace];
8558bf80f4bSopenharmony_ci    const auto replaceWith = children[indexReplaceWith];
8568bf80f4bSopenharmony_ci
8578bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replace, replaceWith, false));
8588bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount - 1);
8598bf80f4bSopenharmony_ci
8608bf80f4bSopenharmony_ci    const auto moved = ChildMovedInfo { replaceWith, indexReplaceWith, indexReplace, container_ };
8618bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
8628bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
8638bf80f4bSopenharmony_ci    const auto removed = ChildChangedInfo { replace, indexReplace, container_ };
8648bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, ElementsAre(removed));
8658bf80f4bSopenharmony_ci}
8668bf80f4bSopenharmony_ci
8678bf80f4bSopenharmony_ci/**
8688bf80f4bSopenharmony_ci * @tc.name: ContainerTest
8698bf80f4bSopenharmony_ci * @tc.desc: test ReplaceWithExistingDontAddAlways function
8708bf80f4bSopenharmony_ci * @tc.type: FUNC
8718bf80f4bSopenharmony_ci * @tc.require: I7DMS1
8728bf80f4bSopenharmony_ci */
8738bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, ReplaceWithExistingDontAddAlways, TestSize.Level1)
8748bf80f4bSopenharmony_ci{
8758bf80f4bSopenharmony_ci    const auto children = container_->GetAll();
8768bf80f4bSopenharmony_ci    const auto expectedCount = NumDirectChildren;
8778bf80f4bSopenharmony_ci    ASSERT_EQ(children.size(), expectedCount);
8788bf80f4bSopenharmony_ci
8798bf80f4bSopenharmony_ci    auto indexReplace = expectedCount / 2;
8808bf80f4bSopenharmony_ci    auto indexReplaceWith = indexReplace + 1;
8818bf80f4bSopenharmony_ci    const auto replace = children[indexReplace];
8828bf80f4bSopenharmony_ci    const auto replaceWith = children[indexReplaceWith];
8838bf80f4bSopenharmony_ci
8848bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Replace(replace, replaceWith, true));
8858bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), expectedCount - 1);
8868bf80f4bSopenharmony_ci
8878bf80f4bSopenharmony_ci    const auto moved = ChildMovedInfo { replaceWith, indexReplaceWith, indexReplace, container_ };
8888bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, ElementsAre(moved));
8898bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
8908bf80f4bSopenharmony_ci    const auto removed = ChildChangedInfo { replace, indexReplace, container_ };
8918bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, ElementsAre(removed));
8928bf80f4bSopenharmony_ci}
8938bf80f4bSopenharmony_ci
8948bf80f4bSopenharmony_ci/**
8958bf80f4bSopenharmony_ci * @tc.name: ContainerTest
8968bf80f4bSopenharmony_ci * @tc.desc: test AddChildTwice function
8978bf80f4bSopenharmony_ci * @tc.type: FUNC
8988bf80f4bSopenharmony_ci * @tc.require: I7DMS1
8998bf80f4bSopenharmony_ci */
9008bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, AddChildTwice, TestSize.Level1)
9018bf80f4bSopenharmony_ci{
9028bf80f4bSopenharmony_ci    const auto child = interface_pointer_cast<IObject>(CreateTestType("Twice"));
9038bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Add(child));
9048bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
9058bf80f4bSopenharmony_ci
9068bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Add(child));
9078bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
9088bf80f4bSopenharmony_ci
9098bf80f4bSopenharmony_ci    const auto children = container_->FindAll({ "Twice", TraversalType::NO_HIERARCHY });
9108bf80f4bSopenharmony_ci    ASSERT_THAT(children, SizeIs(1));
9118bf80f4bSopenharmony_ci    EXPECT_EQ(children[0], child);
9128bf80f4bSopenharmony_ci
9138bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(1));
9148bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
9158bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
9168bf80f4bSopenharmony_ci    auto expected = ChildChangedInfo { child, NumDirectChildren, container_ };
9178bf80f4bSopenharmony_ci    EXPECT_EQ(addedCalls_[0], expected);
9188bf80f4bSopenharmony_ci}
9198bf80f4bSopenharmony_ci
9208bf80f4bSopenharmony_ci/**
9218bf80f4bSopenharmony_ci * @tc.name: ContainerTest
9228bf80f4bSopenharmony_ci * @tc.desc: test FindAllEmptyName function
9238bf80f4bSopenharmony_ci * @tc.type: FUNC
9248bf80f4bSopenharmony_ci * @tc.require: I7DMS1
9258bf80f4bSopenharmony_ci */
9268bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAllEmptyName, TestSize.Level1)
9278bf80f4bSopenharmony_ci{
9288bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
9298bf80f4bSopenharmony_ci    auto result2 = container_->FindAll({ "", TraversalType::NO_HIERARCHY, { ITestContainer::UID }, false });
9308bf80f4bSopenharmony_ci    auto result3 = container_->FindAll({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestContainer::UID }, false });
9318bf80f4bSopenharmony_ci    auto result4 = container_->FindAll({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestType::UID }, false });
9328bf80f4bSopenharmony_ci
9338bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(NumChildContainers + NumChildTestTypes));
9348bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(1));
9358bf80f4bSopenharmony_ci    EXPECT_THAT(result3, SizeIs(NumChildContainers));
9368bf80f4bSopenharmony_ci    EXPECT_THAT(result4, SizeIs(NumChildTestTypes));
9378bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
9388bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
9398bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
9408bf80f4bSopenharmony_ci}
9418bf80f4bSopenharmony_ci
9428bf80f4bSopenharmony_ci/**
9438bf80f4bSopenharmony_ci * @tc.name: ContainerTest
9448bf80f4bSopenharmony_ci * @tc.desc: test FindAllNameRecursive function
9458bf80f4bSopenharmony_ci * @tc.type: FUNC
9468bf80f4bSopenharmony_ci * @tc.require: I7DMS1
9478bf80f4bSopenharmony_ci */
9488bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAllNameRecursive, TestSize.Level1)
9498bf80f4bSopenharmony_ci{
9508bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "Object1_1", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
9518bf80f4bSopenharmony_ci    auto result2 = container_->FindAll({ "Object2_1", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
9528bf80f4bSopenharmony_ci
9538bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(1));
9548bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(1));
9558bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
9568bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
9578bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
9588bf80f4bSopenharmony_ci}
9598bf80f4bSopenharmony_ci
9608bf80f4bSopenharmony_ci/**
9618bf80f4bSopenharmony_ci * @tc.name: ContainerTest
9628bf80f4bSopenharmony_ci * @tc.desc: test FindAllNameDuplicate function
9638bf80f4bSopenharmony_ci * @tc.type: FUNC
9648bf80f4bSopenharmony_ci * @tc.require: I7DMS1
9658bf80f4bSopenharmony_ci */
9668bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAllNameDuplicate, TestSize.Level1)
9678bf80f4bSopenharmony_ci{
9688bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "ObjectDupe", TraversalType::NO_HIERARCHY, {}, false });
9698bf80f4bSopenharmony_ci    auto result2 = container_->FindAll({ "ObjectDupe", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
9708bf80f4bSopenharmony_ci
9718bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(1));
9728bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(2));
9738bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
9748bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
9758bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
9768bf80f4bSopenharmony_ci}
9778bf80f4bSopenharmony_ci
9788bf80f4bSopenharmony_ci/**
9798bf80f4bSopenharmony_ci * @tc.name: ContainerTest
9808bf80f4bSopenharmony_ci * @tc.desc: test FindAllUid function
9818bf80f4bSopenharmony_ci * @tc.type: FUNC
9828bf80f4bSopenharmony_ci * @tc.require: I7DMS1
9838bf80f4bSopenharmony_ci */
9848bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAllUid, TestSize.Level1)
9858bf80f4bSopenharmony_ci{
9868bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "", TraversalType::NO_HIERARCHY, { ITestContainer::UID }, false });
9878bf80f4bSopenharmony_ci    auto result2 = container_->FindAll({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestContainer::UID }, false });
9888bf80f4bSopenharmony_ci    auto result3 = container_->FindAll({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
9898bf80f4bSopenharmony_ci    auto result4 = container_->FindAll(
9908bf80f4bSopenharmony_ci        { "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestContainer::UID }, false });
9918bf80f4bSopenharmony_ci
9928bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(1));
9938bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(2));
9948bf80f4bSopenharmony_ci    EXPECT_THAT(result3, SizeIs(3));
9958bf80f4bSopenharmony_ci    EXPECT_THAT(result4, SizeIs(1));
9968bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
9978bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
9988bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
9998bf80f4bSopenharmony_ci}
10008bf80f4bSopenharmony_ci
10018bf80f4bSopenharmony_ci/**
10028bf80f4bSopenharmony_ci * @tc.name: ContainerTest
10038bf80f4bSopenharmony_ci * @tc.desc: test FindAllUidStrict function
10048bf80f4bSopenharmony_ci * @tc.type: FUNC
10058bf80f4bSopenharmony_ci * @tc.require: I7DMS1
10068bf80f4bSopenharmony_ci */
10078bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAllUidStrict, TestSize.Level1)
10088bf80f4bSopenharmony_ci{
10098bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER,
10108bf80f4bSopenharmony_ci        { ITestType::UID, ITestContainer::UID }, true });
10118bf80f4bSopenharmony_ci    auto result2 =
10128bf80f4bSopenharmony_ci        container_->FindAll({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestType::UID }, true });
10138bf80f4bSopenharmony_ci    auto result3 = container_->FindAll({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER,
10148bf80f4bSopenharmony_ci        { ITestType::UID, ITestContainer::UID }, false });
10158bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(0));
10168bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(2));
10178bf80f4bSopenharmony_ci    EXPECT_THAT(result3, SizeIs(3));
10188bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
10198bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
10208bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
10218bf80f4bSopenharmony_ci}
10228bf80f4bSopenharmony_ci
10238bf80f4bSopenharmony_ci/**
10248bf80f4bSopenharmony_ci * @tc.name: ContainerTest
10258bf80f4bSopenharmony_ci * @tc.desc: test FindAllInvalid function
10268bf80f4bSopenharmony_ci * @tc.type: FUNC
10278bf80f4bSopenharmony_ci * @tc.require: I7DMS1
10288bf80f4bSopenharmony_ci */
10298bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAllInvalid, TestSize.Level1)
10308bf80f4bSopenharmony_ci{
10318bf80f4bSopenharmony_ci    auto result1 = container_->FindAll({ "InvalidObject", TraversalType::NO_HIERARCHY, {}, false });
10328bf80f4bSopenharmony_ci    auto result2 = container_->FindAll({ "InvalidObject", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
10338bf80f4bSopenharmony_ci    auto result3 =
10348bf80f4bSopenharmony_ci        container_->FindAll({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { META_NS::IAttachment::UID }, false });
10358bf80f4bSopenharmony_ci    auto result4 = container_->FindAll(
10368bf80f4bSopenharmony_ci        { "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestType::UID, META_NS::IAttachment::UID }, true });
10378bf80f4bSopenharmony_ci
10388bf80f4bSopenharmony_ci    EXPECT_THAT(result1, SizeIs(0));
10398bf80f4bSopenharmony_ci    EXPECT_THAT(result2, SizeIs(0));
10408bf80f4bSopenharmony_ci    EXPECT_THAT(result3, SizeIs(0));
10418bf80f4bSopenharmony_ci    EXPECT_THAT(result4, SizeIs(0));
10428bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
10438bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
10448bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
10458bf80f4bSopenharmony_ci}
10468bf80f4bSopenharmony_ci
10478bf80f4bSopenharmony_ci/**
10488bf80f4bSopenharmony_ci * @tc.name: ContainerTest
10498bf80f4bSopenharmony_ci * @tc.desc: test FindAnyEmptyName function
10508bf80f4bSopenharmony_ci * @tc.type: FUNC
10518bf80f4bSopenharmony_ci * @tc.require: I7DMS1
10528bf80f4bSopenharmony_ci */
10538bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAnyEmptyName, TestSize.Level1)
10548bf80f4bSopenharmony_ci{
10558bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
10568bf80f4bSopenharmony_ci    auto result2 = container_->FindAny({ "", TraversalType::NO_HIERARCHY, { ITestContainer::UID }, false });
10578bf80f4bSopenharmony_ci    auto result3 = container_->FindAny({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestContainer::UID }, false });
10588bf80f4bSopenharmony_ci
10598bf80f4bSopenharmony_ci    EXPECT_NE(result1, nullptr);
10608bf80f4bSopenharmony_ci    EXPECT_NE(result2, nullptr);
10618bf80f4bSopenharmony_ci    EXPECT_NE(result3, nullptr);
10628bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
10638bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
10648bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
10658bf80f4bSopenharmony_ci}
10668bf80f4bSopenharmony_ci
10678bf80f4bSopenharmony_ci/**
10688bf80f4bSopenharmony_ci * @tc.name: ContainerTest
10698bf80f4bSopenharmony_ci * @tc.desc: test FindAnyNameRecursive function
10708bf80f4bSopenharmony_ci * @tc.type: FUNC
10718bf80f4bSopenharmony_ci * @tc.require: I7DMS1
10728bf80f4bSopenharmony_ci */
10738bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAnyNameRecursive, TestSize.Level1)
10748bf80f4bSopenharmony_ci{
10758bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "Object1_1", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
10768bf80f4bSopenharmony_ci    auto result2 = container_->FindAny({ "Object2_1", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
10778bf80f4bSopenharmony_ci    auto result3 = container_->FindAnyFromHierarchy<IObject>("Object2_1");
10788bf80f4bSopenharmony_ci
10798bf80f4bSopenharmony_ci    EXPECT_NE(result1, nullptr);
10808bf80f4bSopenharmony_ci    EXPECT_NE(result2, nullptr);
10818bf80f4bSopenharmony_ci    EXPECT_EQ(result2, result3);
10828bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
10838bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
10848bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
10858bf80f4bSopenharmony_ci}
10868bf80f4bSopenharmony_ci
10878bf80f4bSopenharmony_ci/**
10888bf80f4bSopenharmony_ci * @tc.name: ContainerTest
10898bf80f4bSopenharmony_ci * @tc.desc: test FindAnyNameDuplicate function
10908bf80f4bSopenharmony_ci * @tc.type: FUNC
10918bf80f4bSopenharmony_ci * @tc.require: I7DMS1
10928bf80f4bSopenharmony_ci */
10938bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAnyNameDuplicate, TestSize.Level1)
10948bf80f4bSopenharmony_ci{
10958bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "ObjectDupe", TraversalType::NO_HIERARCHY, {}, false });
10968bf80f4bSopenharmony_ci    auto result2 = container_->FindAny({ "ObjectDupe", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
10978bf80f4bSopenharmony_ci
10988bf80f4bSopenharmony_ci    EXPECT_NE(result1, nullptr);
10998bf80f4bSopenharmony_ci    EXPECT_NE(result2, nullptr);
11008bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
11018bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
11028bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
11038bf80f4bSopenharmony_ci}
11048bf80f4bSopenharmony_ci
11058bf80f4bSopenharmony_ci/**
11068bf80f4bSopenharmony_ci * @tc.name: ContainerTest
11078bf80f4bSopenharmony_ci * @tc.desc: test FindAnyUid function
11088bf80f4bSopenharmony_ci * @tc.type: FUNC
11098bf80f4bSopenharmony_ci * @tc.require: I7DMS1
11108bf80f4bSopenharmony_ci */
11118bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAnyUid, TestSize.Level1)
11128bf80f4bSopenharmony_ci{
11138bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "", TraversalType::NO_HIERARCHY, { ITestContainer::UID }, false });
11148bf80f4bSopenharmony_ci    auto result2 = container_->FindAny({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestContainer::UID }, false });
11158bf80f4bSopenharmony_ci    auto result3 = container_->FindAny({ "SameNameDifferentUid", TraversalType::NO_HIERARCHY, {}, false });
11168bf80f4bSopenharmony_ci    auto result4 = container_->FindAny(
11178bf80f4bSopenharmony_ci        { "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestContainer::UID }, false });
11188bf80f4bSopenharmony_ci
11198bf80f4bSopenharmony_ci    EXPECT_NE(result1, nullptr);
11208bf80f4bSopenharmony_ci    EXPECT_NE(result2, nullptr);
11218bf80f4bSopenharmony_ci    EXPECT_NE(result3, nullptr);
11228bf80f4bSopenharmony_ci    EXPECT_NE(result4, nullptr);
11238bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
11248bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
11258bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
11268bf80f4bSopenharmony_ci}
11278bf80f4bSopenharmony_ci
11288bf80f4bSopenharmony_ci/**
11298bf80f4bSopenharmony_ci * @tc.name: ContainerTest
11308bf80f4bSopenharmony_ci * @tc.desc: test FindAnyUidStrict function
11318bf80f4bSopenharmony_ci * @tc.type: FUNC
11328bf80f4bSopenharmony_ci * @tc.require: I7DMS1
11338bf80f4bSopenharmony_ci */
11348bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAnyUidStrict, TestSize.Level1)
11358bf80f4bSopenharmony_ci{
11368bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER,
11378bf80f4bSopenharmony_ci        { ITestType::UID, ITestContainer::UID }, true });
11388bf80f4bSopenharmony_ci    auto result2 =
11398bf80f4bSopenharmony_ci        container_->FindAny({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestType::UID }, true });
11408bf80f4bSopenharmony_ci    auto result3 = container_->FindAny({ "SameNameDifferentUid", TraversalType::DEPTH_FIRST_PRE_ORDER,
11418bf80f4bSopenharmony_ci        { ITestType::UID, ITestContainer::UID }, false });
11428bf80f4bSopenharmony_ci    EXPECT_EQ(result1, nullptr);
11438bf80f4bSopenharmony_ci    EXPECT_NE(result2, nullptr);
11448bf80f4bSopenharmony_ci    EXPECT_NE(result3, nullptr);
11458bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
11468bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
11478bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
11488bf80f4bSopenharmony_ci}
11498bf80f4bSopenharmony_ci
11508bf80f4bSopenharmony_ci/**
11518bf80f4bSopenharmony_ci * @tc.name: ContainerTest
11528bf80f4bSopenharmony_ci * @tc.desc: test FindAnyInvalid function
11538bf80f4bSopenharmony_ci * @tc.type: FUNC
11548bf80f4bSopenharmony_ci * @tc.require: I7DMS1
11558bf80f4bSopenharmony_ci */
11568bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindAnyInvalid, TestSize.Level1)
11578bf80f4bSopenharmony_ci{
11588bf80f4bSopenharmony_ci    auto result1 = container_->FindAny({ "InvalidObject", TraversalType::NO_HIERARCHY, {}, false });
11598bf80f4bSopenharmony_ci    auto result2 = container_->FindAny({ "InvalidObject", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
11608bf80f4bSopenharmony_ci    auto result3 =
11618bf80f4bSopenharmony_ci        container_->FindAny({ "", TraversalType::DEPTH_FIRST_PRE_ORDER, { META_NS::IAttachment::UID }, false });
11628bf80f4bSopenharmony_ci    auto result4 = container_->FindAny(
11638bf80f4bSopenharmony_ci        { "", TraversalType::DEPTH_FIRST_PRE_ORDER, { ITestType::UID, META_NS::IAttachment::UID }, true });
11648bf80f4bSopenharmony_ci
11658bf80f4bSopenharmony_ci    EXPECT_EQ(result1, nullptr);
11668bf80f4bSopenharmony_ci    EXPECT_EQ(result2, nullptr);
11678bf80f4bSopenharmony_ci    EXPECT_EQ(result3, nullptr);
11688bf80f4bSopenharmony_ci    EXPECT_EQ(result4, nullptr);
11698bf80f4bSopenharmony_ci    EXPECT_THAT(addedCalls_, SizeIs(0));
11708bf80f4bSopenharmony_ci    EXPECT_THAT(removedCalls_, SizeIs(0));
11718bf80f4bSopenharmony_ci    EXPECT_THAT(movedCalls_, SizeIs(0));
11728bf80f4bSopenharmony_ci}
11738bf80f4bSopenharmony_ci
11748bf80f4bSopenharmony_ci/**
11758bf80f4bSopenharmony_ci * @tc.name: ContainerTest
11768bf80f4bSopenharmony_ci * @tc.desc: test IterationSupport function
11778bf80f4bSopenharmony_ci * @tc.type: FUNC
11788bf80f4bSopenharmony_ci * @tc.require: I7DMS1
11798bf80f4bSopenharmony_ci */
11808bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, IterationSupport, TestSize.Level1)
11818bf80f4bSopenharmony_ci{
11828bf80f4bSopenharmony_ci    {
11838bf80f4bSopenharmony_ci        int count = 0;
11848bf80f4bSopenharmony_ci        ForEachShared(container_, [&](const IObject::Ptr&) { ++count; });
11858bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumDirectChildren);
11868bf80f4bSopenharmony_ci    }
11878bf80f4bSopenharmony_ci    {
11888bf80f4bSopenharmony_ci        int count = 0;
11898bf80f4bSopenharmony_ci        IterateShared(container_, [&](const IObject::Ptr&) {
11908bf80f4bSopenharmony_ci            ++count;
11918bf80f4bSopenharmony_ci            return true;
11928bf80f4bSopenharmony_ci        });
11938bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumDirectChildren);
11948bf80f4bSopenharmony_ci    }
11958bf80f4bSopenharmony_ci
11968bf80f4bSopenharmony_ci    {
11978bf80f4bSopenharmony_ci        int count = 0;
11988bf80f4bSopenharmony_ci        ForEachShared(
11998bf80f4bSopenharmony_ci            container_, [&](const IObject::Ptr&) { ++count; }, TraversalType::DEPTH_FIRST_PRE_ORDER);
12008bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12018bf80f4bSopenharmony_ci    }
12028bf80f4bSopenharmony_ci    {
12038bf80f4bSopenharmony_ci        int count = 0;
12048bf80f4bSopenharmony_ci        IterateShared(
12058bf80f4bSopenharmony_ci            container_,
12068bf80f4bSopenharmony_ci            [&](const IObject::Ptr&) {
12078bf80f4bSopenharmony_ci                ++count;
12088bf80f4bSopenharmony_ci                return true;
12098bf80f4bSopenharmony_ci            },
12108bf80f4bSopenharmony_ci            TraversalType::DEPTH_FIRST_PRE_ORDER);
12118bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12128bf80f4bSopenharmony_ci    }
12138bf80f4bSopenharmony_ci    {
12148bf80f4bSopenharmony_ci        int count = 0;
12158bf80f4bSopenharmony_ci        ForEachUnique(
12168bf80f4bSopenharmony_ci            container_, [&](const IObject::Ptr&) { ++count; }, TraversalType::DEPTH_FIRST_PRE_ORDER);
12178bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12188bf80f4bSopenharmony_ci    }
12198bf80f4bSopenharmony_ci    {
12208bf80f4bSopenharmony_ci        int count = 0;
12218bf80f4bSopenharmony_ci        IterateUnique(
12228bf80f4bSopenharmony_ci            container_,
12238bf80f4bSopenharmony_ci            [&](const IObject::Ptr&) {
12248bf80f4bSopenharmony_ci                ++count;
12258bf80f4bSopenharmony_ci                return true;
12268bf80f4bSopenharmony_ci            },
12278bf80f4bSopenharmony_ci            TraversalType::DEPTH_FIRST_PRE_ORDER);
12288bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12298bf80f4bSopenharmony_ci    }
12308bf80f4bSopenharmony_ci    {
12318bf80f4bSopenharmony_ci        int count = 0;
12328bf80f4bSopenharmony_ci        IterateShared(
12338bf80f4bSopenharmony_ci            container_,
12348bf80f4bSopenharmony_ci            [&](const IObject::Ptr& o) {
12358bf80f4bSopenharmony_ci                ++count;
12368bf80f4bSopenharmony_ci                return o->GetName() != "SameNameDifferentUid";
12378bf80f4bSopenharmony_ci            },
12388bf80f4bSopenharmony_ci            TraversalType::DEPTH_FIRST_PRE_ORDER);
12398bf80f4bSopenharmony_ci        EXPECT_LT(count, NumChildContainers + NumChildTestTypes);
12408bf80f4bSopenharmony_ci    }
12418bf80f4bSopenharmony_ci    {
12428bf80f4bSopenharmony_ci        int count = 0;
12438bf80f4bSopenharmony_ci        ConstIterate(container_, MakeIterationConstCallable([&](const IObject::Ptr&) {
12448bf80f4bSopenharmony_ci            ++count;
12458bf80f4bSopenharmony_ci            return true;
12468bf80f4bSopenharmony_ci        }),
12478bf80f4bSopenharmony_ci            IterateStrategy { TraversalType::DEPTH_FIRST_PRE_ORDER, LockType::NO_LOCK });
12488bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12498bf80f4bSopenharmony_ci    }
12508bf80f4bSopenharmony_ci    {
12518bf80f4bSopenharmony_ci        int count = 0;
12528bf80f4bSopenharmony_ci        ConstIterate(container_, MakeIterationConstCallable([&](const IObject::Ptr&) {
12538bf80f4bSopenharmony_ci            ++count;
12548bf80f4bSopenharmony_ci            return true;
12558bf80f4bSopenharmony_ci        }),
12568bf80f4bSopenharmony_ci            IterateStrategy { TraversalType::FULL_HIERARCHY, LockType::UNIQUE_LOCK });
12578bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12588bf80f4bSopenharmony_ci    }
12598bf80f4bSopenharmony_ci    {
12608bf80f4bSopenharmony_ci        int count = 0;
12618bf80f4bSopenharmony_ci        ConstIterate(container_, MakeIterationConstCallable([&](const IObject::Ptr&) {
12628bf80f4bSopenharmony_ci            ++count;
12638bf80f4bSopenharmony_ci            return true;
12648bf80f4bSopenharmony_ci        }),
12658bf80f4bSopenharmony_ci            IterateStrategy { TraversalType::BREADTH_FIRST_ORDER, LockType::UNIQUE_LOCK });
12668bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumChildContainers + NumChildTestTypes);
12678bf80f4bSopenharmony_ci    }
12688bf80f4bSopenharmony_ci}
12698bf80f4bSopenharmony_ci
12708bf80f4bSopenharmony_ci/**
12718bf80f4bSopenharmony_ci * @tc.name: ContainerTest
12728bf80f4bSopenharmony_ci * @tc.desc: test FindOrder function
12738bf80f4bSopenharmony_ci * @tc.type: FUNC
12748bf80f4bSopenharmony_ci * @tc.require: I7DMS1
12758bf80f4bSopenharmony_ci */
12768bf80f4bSopenharmony_ciHWTEST_F(ContainerTest, FindOrder, TestSize.Level1)
12778bf80f4bSopenharmony_ci{
12788bf80f4bSopenharmony_ci    auto c = CreateContainer("X");
12798bf80f4bSopenharmony_ci    auto c1 = CreateContainer("1");
12808bf80f4bSopenharmony_ci    auto c2 = CreateContainer("2");
12818bf80f4bSopenharmony_ci    auto c1_1 = CreateTestType<IObject>("3");
12828bf80f4bSopenharmony_ci    auto c1_2 = CreateTestType<IObject>("1");
12838bf80f4bSopenharmony_ci    auto c2_1 = CreateTestType<IObject>("3");
12848bf80f4bSopenharmony_ci    auto c2_2 = CreateContainer("2_2");
12858bf80f4bSopenharmony_ci    auto c2_2_1 = CreateContainer("4");
12868bf80f4bSopenharmony_ci    auto c2_2_1_1 = CreateTestType<IObject>("4");
12878bf80f4bSopenharmony_ci    auto c2_3 = CreateTestType<IObject>("4");
12888bf80f4bSopenharmony_ci    auto c3 = CreateTestType<IObject>("3");
12898bf80f4bSopenharmony_ci
12908bf80f4bSopenharmony_ci    c->Add(c1);
12918bf80f4bSopenharmony_ci    c->Add(c2);
12928bf80f4bSopenharmony_ci    c->Add(c3);
12938bf80f4bSopenharmony_ci    c1->Add(c1_1);
12948bf80f4bSopenharmony_ci    c1->Add(c1_2);
12958bf80f4bSopenharmony_ci    c2->Add(c2_1);
12968bf80f4bSopenharmony_ci    c2->Add(c2_2);
12978bf80f4bSopenharmony_ci    c2->Add(c2_3);
12988bf80f4bSopenharmony_ci    c2_2->Add(c2_2_1);
12998bf80f4bSopenharmony_ci    c2_2_1->Add(c2_2_1_1);
13008bf80f4bSopenharmony_ci
13018bf80f4bSopenharmony_ci    {
13028bf80f4bSopenharmony_ci        auto r = c->FindAny({ "1", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
13038bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13048bf80f4bSopenharmony_ci        EXPECT_EQ(r, interface_pointer_cast<IObject>(c1));
13058bf80f4bSopenharmony_ci    }
13068bf80f4bSopenharmony_ci    {
13078bf80f4bSopenharmony_ci        auto r = c->FindAny({ "1", TraversalType::DEPTH_FIRST_POST_ORDER, {}, false });
13088bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13098bf80f4bSopenharmony_ci        EXPECT_EQ(r, c1_2);
13108bf80f4bSopenharmony_ci    }
13118bf80f4bSopenharmony_ci    {
13128bf80f4bSopenharmony_ci        auto r = c->FindAny({ "1", TraversalType::BREADTH_FIRST_ORDER, {}, false });
13138bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13148bf80f4bSopenharmony_ci        EXPECT_EQ(r, interface_pointer_cast<IObject>(c1));
13158bf80f4bSopenharmony_ci    }
13168bf80f4bSopenharmony_ci    {
13178bf80f4bSopenharmony_ci        auto r = c->FindAny({ "1", TraversalType::NO_HIERARCHY, {}, false });
13188bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13198bf80f4bSopenharmony_ci        EXPECT_EQ(r, interface_pointer_cast<IObject>(c1));
13208bf80f4bSopenharmony_ci    }
13218bf80f4bSopenharmony_ci    {
13228bf80f4bSopenharmony_ci        auto r = c->FindAny({ "3", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
13238bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13248bf80f4bSopenharmony_ci        EXPECT_EQ(r, c1_1);
13258bf80f4bSopenharmony_ci    }
13268bf80f4bSopenharmony_ci    {
13278bf80f4bSopenharmony_ci        auto r = c->FindAny({ "3", TraversalType::DEPTH_FIRST_POST_ORDER, {}, false });
13288bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13298bf80f4bSopenharmony_ci        EXPECT_EQ(r, c1_1);
13308bf80f4bSopenharmony_ci    }
13318bf80f4bSopenharmony_ci    {
13328bf80f4bSopenharmony_ci        auto r = c->FindAny({ "3", TraversalType::BREADTH_FIRST_ORDER, {}, false });
13338bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13348bf80f4bSopenharmony_ci        EXPECT_EQ(r, c3);
13358bf80f4bSopenharmony_ci    }
13368bf80f4bSopenharmony_ci    {
13378bf80f4bSopenharmony_ci        auto r = c->FindAny({ "3", TraversalType::NO_HIERARCHY, {}, false });
13388bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13398bf80f4bSopenharmony_ci        EXPECT_EQ(r, interface_pointer_cast<IObject>(c3));
13408bf80f4bSopenharmony_ci    }
13418bf80f4bSopenharmony_ci    {
13428bf80f4bSopenharmony_ci        auto r = c->FindAny({ "4", TraversalType::DEPTH_FIRST_PRE_ORDER, {}, false });
13438bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13448bf80f4bSopenharmony_ci        EXPECT_EQ(r, interface_pointer_cast<IObject>(c2_2_1));
13458bf80f4bSopenharmony_ci    }
13468bf80f4bSopenharmony_ci    {
13478bf80f4bSopenharmony_ci        auto r = c->FindAny({ "4", TraversalType::DEPTH_FIRST_POST_ORDER, {}, false });
13488bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13498bf80f4bSopenharmony_ci        EXPECT_EQ(r, c2_2_1_1);
13508bf80f4bSopenharmony_ci    }
13518bf80f4bSopenharmony_ci    {
13528bf80f4bSopenharmony_ci        auto r = c->FindAny({ "4", TraversalType::BREADTH_FIRST_ORDER, {}, false });
13538bf80f4bSopenharmony_ci        ASSERT_TRUE(r);
13548bf80f4bSopenharmony_ci        EXPECT_EQ(r, c2_3);
13558bf80f4bSopenharmony_ci    }
13568bf80f4bSopenharmony_ci    {
13578bf80f4bSopenharmony_ci        auto r = c->FindAny({ "4", TraversalType::NO_HIERARCHY, {}, false });
13588bf80f4bSopenharmony_ci        ASSERT_FALSE(r);
13598bf80f4bSopenharmony_ci    }
13608bf80f4bSopenharmony_ci}
13618bf80f4bSopenharmony_ci
13628bf80f4bSopenharmony_ci/**
13638bf80f4bSopenharmony_ci * @tc.name: FlatContainerTest
13648bf80f4bSopenharmony_ci * @tc.desc: test SameItemMultipleTimes function
13658bf80f4bSopenharmony_ci * @tc.type: FUNC
13668bf80f4bSopenharmony_ci * @tc.require: I7DMS1
13678bf80f4bSopenharmony_ci */
13688bf80f4bSopenharmony_ciHWTEST_F(FlatContainerTest, SameItemMultipleTimes, TestSize.Level1)
13698bf80f4bSopenharmony_ci{
13708bf80f4bSopenharmony_ci    const auto child = interface_pointer_cast<IObject>(CreateTestType("Twice"));
13718bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Add(child));
13728bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 1);
13738bf80f4bSopenharmony_ci
13748bf80f4bSopenharmony_ci    EXPECT_TRUE(container_->Add(child));
13758bf80f4bSopenharmony_ci    EXPECT_EQ(container_->GetSize(), NumDirectChildren + 2);
13768bf80f4bSopenharmony_ci
13778bf80f4bSopenharmony_ci    const auto children = container_->FindAll({ "Twice", TraversalType::NO_HIERARCHY });
13788bf80f4bSopenharmony_ci    ASSERT_THAT(children, SizeIs(2));
13798bf80f4bSopenharmony_ci    EXPECT_EQ(children[0], child);
13808bf80f4bSopenharmony_ci    EXPECT_EQ(children[1], child);
13818bf80f4bSopenharmony_ci
13828bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(2));
13838bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
13848bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
13858bf80f4bSopenharmony_ci    auto expected1 = ChildChangedInfo { child, NumDirectChildren, container_ };
13868bf80f4bSopenharmony_ci    auto expected2 = ChildChangedInfo { child, NumDirectChildren + 1, container_ };
13878bf80f4bSopenharmony_ci    EXPECT_EQ(addedCalls_[0], expected1);
13888bf80f4bSopenharmony_ci    EXPECT_EQ(addedCalls_[1], expected2);
13898bf80f4bSopenharmony_ci}
13908bf80f4bSopenharmony_ci
13918bf80f4bSopenharmony_ci/**
13928bf80f4bSopenharmony_ci * @tc.name: FlatContainerTest
13938bf80f4bSopenharmony_ci * @tc.desc: test IterationSupport function
13948bf80f4bSopenharmony_ci * @tc.type: FUNC
13958bf80f4bSopenharmony_ci * @tc.require: I7DMS1
13968bf80f4bSopenharmony_ci */
13978bf80f4bSopenharmony_ciHWTEST_F(FlatContainerTest, IterationSupport, TestSize.Level1)
13988bf80f4bSopenharmony_ci{
13998bf80f4bSopenharmony_ci    {
14008bf80f4bSopenharmony_ci        int count = 0;
14018bf80f4bSopenharmony_ci        ForEachShared(container_, [&](const IObject::Ptr&) { ++count; });
14028bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumDirectChildren);
14038bf80f4bSopenharmony_ci    }
14048bf80f4bSopenharmony_ci    {
14058bf80f4bSopenharmony_ci        int count = 0;
14068bf80f4bSopenharmony_ci        IterateShared(container_, [&](const IObject::Ptr&) {
14078bf80f4bSopenharmony_ci            ++count;
14088bf80f4bSopenharmony_ci            return true;
14098bf80f4bSopenharmony_ci        });
14108bf80f4bSopenharmony_ci        EXPECT_EQ(count, NumDirectChildren);
14118bf80f4bSopenharmony_ci    }
14128bf80f4bSopenharmony_ci}
14138bf80f4bSopenharmony_ci
14148bf80f4bSopenharmony_cistatic std::string BuildTestName(const testing::TestParamInfo<ContainerCommonTest::ParamType>& info)
14158bf80f4bSopenharmony_ci{
14168bf80f4bSopenharmony_ci    return info.param == META_NS::ClassId::TestContainer ? "TestContainer" : "TestFlatContainer";
14178bf80f4bSopenharmony_ci}
14188bf80f4bSopenharmony_ci
14198bf80f4bSopenharmony_ciINSTANTIATE_TEST_SUITE_P(ContainerTests, ContainerCommonTest,
14208bf80f4bSopenharmony_ci    testing::Values(META_NS::ClassId::TestContainer, META_NS::ClassId::TestFlatContainer), BuildTestName);
14218bf80f4bSopenharmony_ci
14228bf80f4bSopenharmony_ciMETA_END_NAMESPACE()
1423