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/container_observer.h>
208bf80f4bSopenharmony_ci#include <meta/api/make_callback.h>
218bf80f4bSopenharmony_ci#include <meta/base/ref_uri.h>
228bf80f4bSopenharmony_ci
238bf80f4bSopenharmony_ci#include "src/test_runner.h"
248bf80f4bSopenharmony_ci#include "src/test_utils.h"
258bf80f4bSopenharmony_ci#include "src/testing_objects.h"
268bf80f4bSopenharmony_ci#include "src/util.h"
278bf80f4bSopenharmony_ci
288bf80f4bSopenharmony_ciusing namespace testing;
298bf80f4bSopenharmony_ciusing namespace testing::ext;
308bf80f4bSopenharmony_ci
318bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
328bf80f4bSopenharmony_ci
338bf80f4bSopenharmony_ciclass IntfContainerObserverTest : public testing::Test {
348bf80f4bSopenharmony_cipublic:
358bf80f4bSopenharmony_ci    void SetUp() override
368bf80f4bSopenharmony_ci    {
378bf80f4bSopenharmony_ci        container_ = interface_pointer_cast<IContainer>(CreateTestContainer("Base"));
388bf80f4bSopenharmony_ci        ASSERT_NE(container_, nullptr);
398bf80f4bSopenharmony_ci        ASSERT_NE(observer_.GetIObject(), nullptr);
408bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("Object1_1"));
418bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("SameNameDifferentUid"));
428bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("ObjectDupe"));
438bf80f4bSopenharmony_ci        container1_1_ = interface_pointer_cast<IContainer>(CreateTestContainer("Container1_1"));
448bf80f4bSopenharmony_ci        container_->Add(interface_pointer_cast<IObject>(container1_1_));
458bf80f4bSopenharmony_ci        container1_1_->Add(CreateTestType<IObject>("Object2_1"));
468bf80f4bSopenharmony_ci        container1_1_->Add(CreateTestType<IObject>("ObjectDupe"));
478bf80f4bSopenharmony_ci        container1_1_->Add(CreateTestType<IObject>("SameNameDifferentUid"));
488bf80f4bSopenharmony_ci        container_->Add(CreateTestType<IObject>("Object1_3"));
498bf80f4bSopenharmony_ci        container2_1_ = interface_pointer_cast<IContainer>(CreateTestContainer("SameNameDifferentUid"));
508bf80f4bSopenharmony_ci        container1_1_->Add(interface_pointer_cast<IObject>(container2_1_));
518bf80f4bSopenharmony_ci
528bf80f4bSopenharmony_ci        observer_.Container(container_)
538bf80f4bSopenharmony_ci            .OnDescendantAdded([this](const ChildChangedInfo& info) { OnAdded(info); })
548bf80f4bSopenharmony_ci            .OnDescendantRemoved([this](const ChildChangedInfo& info) { OnRemoved(info); })
558bf80f4bSopenharmony_ci            .OnDescendantMoved([this](const ChildMovedInfo& info) { OnMoved(info); });
568bf80f4bSopenharmony_ci    }
578bf80f4bSopenharmony_ci    void TearDown() override
588bf80f4bSopenharmony_ci    {
598bf80f4bSopenharmony_ci        container_.reset();
608bf80f4bSopenharmony_ci        observer_.ResetIObject();
618bf80f4bSopenharmony_ci    }
628bf80f4bSopenharmony_ci    static void SetUpTestSuite()
638bf80f4bSopenharmony_ci    {
648bf80f4bSopenharmony_ci        SetTest();
658bf80f4bSopenharmony_ci    }
668bf80f4bSopenharmony_ci    static void TearDownTestSuite()
678bf80f4bSopenharmony_ci    {
688bf80f4bSopenharmony_ci        ResetTest();
698bf80f4bSopenharmony_ci    }
708bf80f4bSopenharmony_ci
718bf80f4bSopenharmony_ciprotected:
728bf80f4bSopenharmony_ci    void OnAdded(const ChildChangedInfo& info)
738bf80f4bSopenharmony_ci    {
748bf80f4bSopenharmony_ci        addedCalls_.push_back(info);
758bf80f4bSopenharmony_ci    }
768bf80f4bSopenharmony_ci    void OnRemoved(const ChildChangedInfo& info)
778bf80f4bSopenharmony_ci    {
788bf80f4bSopenharmony_ci        removedCalls_.push_back(info);
798bf80f4bSopenharmony_ci    }
808bf80f4bSopenharmony_ci    void OnMoved(const ChildMovedInfo& info)
818bf80f4bSopenharmony_ci    {
828bf80f4bSopenharmony_ci        movedCalls_.push_back(info);
838bf80f4bSopenharmony_ci    }
848bf80f4bSopenharmony_ci
858bf80f4bSopenharmony_ci    BASE_NS::vector<ChildChangedInfo> addedCalls_;
868bf80f4bSopenharmony_ci    BASE_NS::vector<ChildChangedInfo> removedCalls_;
878bf80f4bSopenharmony_ci    BASE_NS::vector<ChildMovedInfo> movedCalls_;
888bf80f4bSopenharmony_ci
898bf80f4bSopenharmony_ci    IContainer::Ptr container_;
908bf80f4bSopenharmony_ci    IContainer::Ptr container1_1_;
918bf80f4bSopenharmony_ci    IContainer::Ptr container2_1_;
928bf80f4bSopenharmony_ci    META_NS::ContainerObserver observer_;
938bf80f4bSopenharmony_ci};
948bf80f4bSopenharmony_ci
958bf80f4bSopenharmony_ci/**
968bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest
978bf80f4bSopenharmony_ci * @tc.desc: test AddDirectChild function
988bf80f4bSopenharmony_ci * @tc.type: FUNC
998bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1008bf80f4bSopenharmony_ci */
1018bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, AddDirectChild, TestSize.Level1)
1028bf80f4bSopenharmony_ci{
1038bf80f4bSopenharmony_ci    auto child = CreateTestType<IObject>("DirectChild");
1048bf80f4bSopenharmony_ci    ASSERT_TRUE(container_->Add(child));
1058bf80f4bSopenharmony_ci
1068bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(1));
1078bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
1088bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1098bf80f4bSopenharmony_ci
1108bf80f4bSopenharmony_ci    auto info = addedCalls_[0];
1118bf80f4bSopenharmony_ci    EXPECT_EQ(info.object, child);
1128bf80f4bSopenharmony_ci    EXPECT_EQ(info.parent.lock(), container_);
1138bf80f4bSopenharmony_ci}
1148bf80f4bSopenharmony_ci
1158bf80f4bSopenharmony_ci/**
1168bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest
1178bf80f4bSopenharmony_ci * @tc.desc: test AddDescendantChild function
1188bf80f4bSopenharmony_ci * @tc.type: FUNC
1198bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1208bf80f4bSopenharmony_ci */
1218bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, AddDescendantChild, TestSize.Level1)
1228bf80f4bSopenharmony_ci{
1238bf80f4bSopenharmony_ci    auto child = CreateTestType<IObject>("Descendant");
1248bf80f4bSopenharmony_ci    ASSERT_TRUE(container2_1_->Add(child));
1258bf80f4bSopenharmony_ci
1268bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(1));
1278bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
1288bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1298bf80f4bSopenharmony_ci
1308bf80f4bSopenharmony_ci    auto info = addedCalls_[0];
1318bf80f4bSopenharmony_ci    EXPECT_EQ(info.object, child);
1328bf80f4bSopenharmony_ci    EXPECT_EQ(info.parent.lock(), container2_1_);
1338bf80f4bSopenharmony_ci}
1348bf80f4bSopenharmony_ci
1358bf80f4bSopenharmony_ci/**
1368bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest
1378bf80f4bSopenharmony_ci * @tc.desc: test ChangedAfterChild function
1388bf80f4bSopenharmony_ci * @tc.type: FUNC
1398bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1408bf80f4bSopenharmony_ci */
1418bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, ChangeAfterChild, TestSize.Level1)
1428bf80f4bSopenharmony_ci{
1438bf80f4bSopenharmony_ci    auto container = CreateTestContainer<IContainer>("DescendantContainer");
1448bf80f4bSopenharmony_ci    ASSERT_TRUE(container2_1_->Add(container));
1458bf80f4bSopenharmony_ci
1468bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(1));
1478bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
1488bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1498bf80f4bSopenharmony_ci
1508bf80f4bSopenharmony_ci    auto info = addedCalls_[0];
1518bf80f4bSopenharmony_ci    EXPECT_EQ(info.object, interface_pointer_cast<IObject>(container));
1528bf80f4bSopenharmony_ci    EXPECT_EQ(info.parent.lock(), container2_1_);
1538bf80f4bSopenharmony_ci
1548bf80f4bSopenharmony_ci    auto child = CreateTestType<IObject>("DescendantChild");
1558bf80f4bSopenharmony_ci    ASSERT_TRUE(container->Add(child));
1568bf80f4bSopenharmony_ci
1578bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(2));
1588bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
1598bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1608bf80f4bSopenharmony_ci
1618bf80f4bSopenharmony_ci    info = addedCalls_[1];
1628bf80f4bSopenharmony_ci    EXPECT_EQ(info.object, child);
1638bf80f4bSopenharmony_ci    EXPECT_EQ(info.parent.lock(), container);
1648bf80f4bSopenharmony_ci
1658bf80f4bSopenharmony_ci    EXPECT_TRUE(container1_1_->Remove(container2_1_));
1668bf80f4bSopenharmony_ci
1678bf80f4bSopenharmony_ci    EXPECT_TRUE(container->Remove(child));
1688bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(2));
1698bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(1));
1708bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1718bf80f4bSopenharmony_ci
1728bf80f4bSopenharmony_ci    info = removedCalls_[0];
1738bf80f4bSopenharmony_ci    EXPECT_EQ(info.object, interface_pointer_cast<IObject>(container2_1_));
1748bf80f4bSopenharmony_ci    EXPECT_EQ(info.parent.lock(), container1_1_);
1758bf80f4bSopenharmony_ci}
1768bf80f4bSopenharmony_ci
1778bf80f4bSopenharmony_ci/**
1788bf80f4bSopenharmony_ci * @tc.name: IntfContainerObserverTest
1798bf80f4bSopenharmony_ci * @tc.desc: test RemoveDescendant function
1808bf80f4bSopenharmony_ci * @tc.type: FUNC
1818bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1828bf80f4bSopenharmony_ci */
1838bf80f4bSopenharmony_ciHWTEST_F(IntfContainerObserverTest, RemoveDescendant, TestSize.Level1)
1848bf80f4bSopenharmony_ci{
1858bf80f4bSopenharmony_ci    container_->Remove(container1_1_);
1868bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(0));
1878bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(1));
1888bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
1898bf80f4bSopenharmony_ci
1908bf80f4bSopenharmony_ci    auto info = removedCalls_[0];
1918bf80f4bSopenharmony_ci    EXPECT_EQ(info.object, interface_pointer_cast<IObject>(container1_1_));
1928bf80f4bSopenharmony_ci    EXPECT_EQ(info.parent.lock(), container_);
1938bf80f4bSopenharmony_ci    removedCalls_.clear();
1948bf80f4bSopenharmony_ci
1958bf80f4bSopenharmony_ci    auto child = CreateTestType<IObject>("Descendant");
1968bf80f4bSopenharmony_ci    container1_1_->Add(child);
1978bf80f4bSopenharmony_ci
1988bf80f4bSopenharmony_ci    ASSERT_THAT(addedCalls_, SizeIs(0));
1998bf80f4bSopenharmony_ci    ASSERT_THAT(removedCalls_, SizeIs(0));
2008bf80f4bSopenharmony_ci    ASSERT_THAT(movedCalls_, SizeIs(0));
2018bf80f4bSopenharmony_ci}
2028bf80f4bSopenharmony_ci
2038bf80f4bSopenharmony_ciMETA_END_NAMESPACE()