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/ext/object.h>
208bf80f4bSopenharmony_ci#include <meta/interface/intf_attach.h>
218bf80f4bSopenharmony_ci#include <meta/interface/intf_derived.h>
228bf80f4bSopenharmony_ci#include <meta/interface/intf_object.h>
238bf80f4bSopenharmony_ci#include <meta/interface/intf_object_registry.h>
248bf80f4bSopenharmony_ci
258bf80f4bSopenharmony_ci#include "src/test_runner.h"
268bf80f4bSopenharmony_ci
278bf80f4bSopenharmony_ciusing namespace testing::ext;
288bf80f4bSopenharmony_ci
298bf80f4bSopenharmony_ciMETA_BEGIN_NAMESPACE()
308bf80f4bSopenharmony_ci
318bf80f4bSopenharmony_ciMETA_REGISTER_CLASS(BaseObjectDerived, "ecc59f20-2bac-4521-8fbe-18d02cfa2ddf", META_NS::ObjectCategoryBits::NO_CATEGORY)
328bf80f4bSopenharmony_ciMETA_REGISTER_CLASS(MetaObjectDerived, "9e29e701-a3c6-439f-be85-e2d3106fcb4e", META_NS::ObjectCategoryBits::NO_CATEGORY)
338bf80f4bSopenharmony_ciMETA_REGISTER_CLASS(ObjectDerived, "aabee314-238c-4263-b295-8139bde9933d", META_NS::ObjectCategoryBits::NO_CATEGORY)
348bf80f4bSopenharmony_ci
358bf80f4bSopenharmony_ciclass BaseObjectDerived final
368bf80f4bSopenharmony_ci    : public META_NS::BaseObjectFwd<BaseObjectDerived, ClassId::BaseObjectDerived, META_NS::ClassId::BaseObject> {};
378bf80f4bSopenharmony_ci
388bf80f4bSopenharmony_ciclass MetaObjectDerived final
398bf80f4bSopenharmony_ci    : public META_NS::MetaObjectFwd<MetaObjectDerived, ClassId::MetaObjectDerived, META_NS::ClassId::MetaObject> {};
408bf80f4bSopenharmony_ci
418bf80f4bSopenharmony_ciclass ObjectDerived final : public META_NS::ObjectFwd<ObjectDerived, ClassId::ObjectDerived, META_NS::ClassId::Object> {
428bf80f4bSopenharmony_ci};
438bf80f4bSopenharmony_ci
448bf80f4bSopenharmony_ciclass BaseObjectTest : public testing::Test {
458bf80f4bSopenharmony_cipublic:
468bf80f4bSopenharmony_ci    static void SetUpTestSuite()
478bf80f4bSopenharmony_ci    {
488bf80f4bSopenharmony_ci        SetTest();
498bf80f4bSopenharmony_ci        RegisterObjectType<BaseObjectDerived>();
508bf80f4bSopenharmony_ci        RegisterObjectType<MetaObjectDerived>();
518bf80f4bSopenharmony_ci        RegisterObjectType<ObjectDerived>();
528bf80f4bSopenharmony_ci    }
538bf80f4bSopenharmony_ci    static void TearDownTestSuite()
548bf80f4bSopenharmony_ci    {
558bf80f4bSopenharmony_ci        ResetTest();
568bf80f4bSopenharmony_ci        UnregisterObjectType<ObjectDerived>();
578bf80f4bSopenharmony_ci        UnregisterObjectType<MetaObjectDerived>();
588bf80f4bSopenharmony_ci        UnregisterObjectType<BaseObjectDerived>();
598bf80f4bSopenharmony_ci    }
608bf80f4bSopenharmony_ci    void SetUp() override {}
618bf80f4bSopenharmony_ci    void TearDown() override {}
628bf80f4bSopenharmony_ciprotected:
638bf80f4bSopenharmony_ci    const BASE_NS::vector<BASE_NS::Uid> BASE_OBJECT_INTERFACES { IObject::UID, IObjectInstance::UID, IObjectFlags::UID,
648bf80f4bSopenharmony_ci        IDerived::UID, ILifecycle::UID };
658bf80f4bSopenharmony_ci
668bf80f4bSopenharmony_ci    const BASE_NS::vector<BASE_NS::Uid> META_OBJECT_INTERFACES { IObjectContextProvider::UID, IMetadata::UID,
678bf80f4bSopenharmony_ci        IMetadataInternal::UID };
688bf80f4bSopenharmony_ci
698bf80f4bSopenharmony_ci    const BASE_NS::vector<BASE_NS::Uid> OBJECT_INTERFACES { IAttach::UID, IContainerQuery::UID };
708bf80f4bSopenharmony_ci
718bf80f4bSopenharmony_ci    void CheckInterface(const IObject::ConstPtr& object, BASE_NS::Uid uid, bool implements)
728bf80f4bSopenharmony_ci    {
738bf80f4bSopenharmony_ci        ASSERT_NE(object, nullptr);
748bf80f4bSopenharmony_ci        if (implements) {
758bf80f4bSopenharmony_ci            EXPECT_NE(object->GetInterface(uid), nullptr) << "uid: " << BASE_NS::to_string(uid).c_str();
768bf80f4bSopenharmony_ci            EXPECT_THAT(object->GetInterfaces(), testing::Contains(uid)) << "uid: " << BASE_NS::to_string(uid).c_str();
778bf80f4bSopenharmony_ci        } else {
788bf80f4bSopenharmony_ci            EXPECT_EQ(object->GetInterface(uid), nullptr) << "uid: " << BASE_NS::to_string(uid).c_str();
798bf80f4bSopenharmony_ci            EXPECT_THAT(object->GetInterfaces(), testing::Not(testing::Contains(uid))) <<
808bf80f4bSopenharmony_ci                "uid: " << BASE_NS::to_string(uid).c_str();
818bf80f4bSopenharmony_ci        }
828bf80f4bSopenharmony_ci    }
838bf80f4bSopenharmony_ci
848bf80f4bSopenharmony_ci    void CheckInterfaces(const IObject::ConstPtr& object, bool implements, const BASE_NS::vector<BASE_NS::Uid>& uids)
858bf80f4bSopenharmony_ci    {
868bf80f4bSopenharmony_ci        for (const auto& uid : uids) {
878bf80f4bSopenharmony_ci            CheckInterface(object, uid, implements);
888bf80f4bSopenharmony_ci        }
898bf80f4bSopenharmony_ci    }
908bf80f4bSopenharmony_ci};
918bf80f4bSopenharmony_ci
928bf80f4bSopenharmony_ci/**
938bf80f4bSopenharmony_ci * @tc.name: BaseObjectTest
948bf80f4bSopenharmony_ci * @tc.desc: test BaseObject function
958bf80f4bSopenharmony_ci * @tc.type: FUNC
968bf80f4bSopenharmony_ci * @tc.require: I7DMS1
978bf80f4bSopenharmony_ci */
988bf80f4bSopenharmony_ciHWTEST_F(BaseObjectTest, BaseObject, TestSize.Level1)
998bf80f4bSopenharmony_ci{
1008bf80f4bSopenharmony_ci    auto object = GetObjectRegistry().Create(META_NS::ClassId::BaseObject);
1018bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1028bf80f4bSopenharmony_ci    CheckInterfaces(object, true, BASE_OBJECT_INTERFACES);
1038bf80f4bSopenharmony_ci    CheckInterfaces(object, false, META_OBJECT_INTERFACES);
1048bf80f4bSopenharmony_ci    CheckInterfaces(object, false, OBJECT_INTERFACES);
1058bf80f4bSopenharmony_ci    EXPECT_THAT(object->GetInterfaces(), testing::SizeIs(BASE_OBJECT_INTERFACES.size()));
1068bf80f4bSopenharmony_ci}
1078bf80f4bSopenharmony_ci
1088bf80f4bSopenharmony_ci/**
1098bf80f4bSopenharmony_ci * @tc.name: BaseObjectTest
1108bf80f4bSopenharmony_ci * @tc.desc: test MetaObject function
1118bf80f4bSopenharmony_ci * @tc.type: FUNC
1128bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1138bf80f4bSopenharmony_ci */
1148bf80f4bSopenharmony_ciHWTEST_F(BaseObjectTest, MetaObject, TestSize.Level1)
1158bf80f4bSopenharmony_ci{
1168bf80f4bSopenharmony_ci    auto object = GetObjectRegistry().Create(META_NS::ClassId::MetaObject);
1178bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1188bf80f4bSopenharmony_ci    CheckInterfaces(object, true, BASE_OBJECT_INTERFACES);
1198bf80f4bSopenharmony_ci    CheckInterfaces(object, true, META_OBJECT_INTERFACES);
1208bf80f4bSopenharmony_ci    CheckInterfaces(object, false, OBJECT_INTERFACES);
1218bf80f4bSopenharmony_ci    EXPECT_THAT(
1228bf80f4bSopenharmony_ci        object->GetInterfaces(), testing::SizeIs(BASE_OBJECT_INTERFACES.size() + META_OBJECT_INTERFACES.size()));
1238bf80f4bSopenharmony_ci}
1248bf80f4bSopenharmony_ci
1258bf80f4bSopenharmony_ci/**
1268bf80f4bSopenharmony_ci * @tc.name: BaseObjectTest
1278bf80f4bSopenharmony_ci * @tc.desc: test Object function
1288bf80f4bSopenharmony_ci * @tc.type: FUNC
1298bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1308bf80f4bSopenharmony_ci */
1318bf80f4bSopenharmony_ciHWTEST_F(BaseObjectTest, Object, TestSize.Level1)
1328bf80f4bSopenharmony_ci{
1338bf80f4bSopenharmony_ci    auto object = GetObjectRegistry().Create(META_NS::ClassId::Object);
1348bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1358bf80f4bSopenharmony_ci    CheckInterfaces(object, true, BASE_OBJECT_INTERFACES);
1368bf80f4bSopenharmony_ci    CheckInterfaces(object, true, META_OBJECT_INTERFACES);
1378bf80f4bSopenharmony_ci    CheckInterfaces(object, true, OBJECT_INTERFACES);
1388bf80f4bSopenharmony_ci    EXPECT_THAT(object->GetInterfaces(),
1398bf80f4bSopenharmony_ci        testing::SizeIs(BASE_OBJECT_INTERFACES.size() + META_OBJECT_INTERFACES.size() + OBJECT_INTERFACES.size()));
1408bf80f4bSopenharmony_ci}
1418bf80f4bSopenharmony_ci
1428bf80f4bSopenharmony_ci/**
1438bf80f4bSopenharmony_ci * @tc.name: BaseObjectTest
1448bf80f4bSopenharmony_ci * @tc.desc: test DeriveBaseObject function
1458bf80f4bSopenharmony_ci * @tc.type: FUNC
1468bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1478bf80f4bSopenharmony_ci */
1488bf80f4bSopenharmony_ciHWTEST_F(BaseObjectTest, DeriveBaseObject, TestSize.Level1)
1498bf80f4bSopenharmony_ci{
1508bf80f4bSopenharmony_ci    auto object = GetObjectRegistry().Create(ClassId::BaseObjectDerived);
1518bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1528bf80f4bSopenharmony_ci    CheckInterfaces(object, true, BASE_OBJECT_INTERFACES);
1538bf80f4bSopenharmony_ci    CheckInterfaces(object, false, META_OBJECT_INTERFACES);
1548bf80f4bSopenharmony_ci    CheckInterfaces(object, false, OBJECT_INTERFACES);
1558bf80f4bSopenharmony_ci    EXPECT_THAT(object->GetInterfaces(), testing::SizeIs(BASE_OBJECT_INTERFACES.size()));
1568bf80f4bSopenharmony_ci    auto derived = interface_cast<IDerived>(object);
1578bf80f4bSopenharmony_ci    ASSERT_NE(derived, nullptr);
1588bf80f4bSopenharmony_ci    EXPECT_EQ(ObjectId(derived->GetSuperClassUid()), META_NS::ClassId::BaseObject);
1598bf80f4bSopenharmony_ci}
1608bf80f4bSopenharmony_ci
1618bf80f4bSopenharmony_ci/**
1628bf80f4bSopenharmony_ci * @tc.name: BaseObjectTest
1638bf80f4bSopenharmony_ci * @tc.desc: test DeriveBaseObject function
1648bf80f4bSopenharmony_ci * @tc.type: FUNC
1658bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1668bf80f4bSopenharmony_ci */
1678bf80f4bSopenharmony_ciHWTEST_F(BaseObjectTest, DeriveMetaObject, TestSize.Level1)
1688bf80f4bSopenharmony_ci{
1698bf80f4bSopenharmony_ci    auto object = GetObjectRegistry().Create(ClassId::MetaObjectDerived);
1708bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1718bf80f4bSopenharmony_ci    CheckInterfaces(object, true, BASE_OBJECT_INTERFACES);
1728bf80f4bSopenharmony_ci    CheckInterfaces(object, true, META_OBJECT_INTERFACES);
1738bf80f4bSopenharmony_ci    CheckInterfaces(object, false, OBJECT_INTERFACES);
1748bf80f4bSopenharmony_ci    EXPECT_THAT(
1758bf80f4bSopenharmony_ci        object->GetInterfaces(), testing::SizeIs(BASE_OBJECT_INTERFACES.size() + META_OBJECT_INTERFACES.size()));
1768bf80f4bSopenharmony_ci    auto derived = interface_cast<IDerived>(object);
1778bf80f4bSopenharmony_ci    ASSERT_NE(derived, nullptr);
1788bf80f4bSopenharmony_ci    EXPECT_EQ(ObjectId(derived->GetSuperClassUid()), META_NS::ClassId::MetaObject);
1798bf80f4bSopenharmony_ci}
1808bf80f4bSopenharmony_ci
1818bf80f4bSopenharmony_ci/**
1828bf80f4bSopenharmony_ci * @tc.name: BaseObjectTest
1838bf80f4bSopenharmony_ci * @tc.desc: test DeriveObject function
1848bf80f4bSopenharmony_ci * @tc.type: FUNC
1858bf80f4bSopenharmony_ci * @tc.require: I7DMS1
1868bf80f4bSopenharmony_ci */
1878bf80f4bSopenharmony_ciHWTEST_F(BaseObjectTest, DeriveObject, TestSize.Level1)
1888bf80f4bSopenharmony_ci{
1898bf80f4bSopenharmony_ci    auto object = GetObjectRegistry().Create(ClassId::ObjectDerived);
1908bf80f4bSopenharmony_ci    ASSERT_NE(object, nullptr);
1918bf80f4bSopenharmony_ci    CheckInterfaces(object, true, BASE_OBJECT_INTERFACES);
1928bf80f4bSopenharmony_ci    CheckInterfaces(object, true, META_OBJECT_INTERFACES);
1938bf80f4bSopenharmony_ci    CheckInterfaces(object, true, OBJECT_INTERFACES);
1948bf80f4bSopenharmony_ci    EXPECT_THAT(object->GetInterfaces(),
1958bf80f4bSopenharmony_ci        testing::SizeIs(BASE_OBJECT_INTERFACES.size() + META_OBJECT_INTERFACES.size() + OBJECT_INTERFACES.size()));
1968bf80f4bSopenharmony_ci    auto derived = interface_cast<IDerived>(object);
1978bf80f4bSopenharmony_ci    ASSERT_NE(derived, nullptr);
1988bf80f4bSopenharmony_ci    EXPECT_EQ(ObjectId(derived->GetSuperClassUid()), META_NS::ClassId::Object);
1998bf80f4bSopenharmony_ci}
2008bf80f4bSopenharmony_ciMETA_END_NAMESPACE()