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