1 /* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #include "TestRunner.h" 16 17 #include <gmock/gmock.h> 18 #include <gtest/gtest.h> 19 20 #include <meta/ext/metadata_helpers.h> 21 #include <meta/ext/object_fwd.h> 22 #include <meta/interface/intf_attach.h> 23 #include <meta/interface/intf_derived.h> 24 #include <meta/interface/intf_object.h> 25 #include <meta/interface/intf_object_registry.h> 26 27 META_BEGIN_NAMESPACE() 28 29 using namespace ::testing; 30 using namespace testing::ext; 31 32 META_REGISTER_CLASS(BaseObjectDerived, "ecc59f20-2bac-4521-8fbe-18d02cfa2ddf", META_NS::ObjectCategoryBits::NO_CATEGORY) 33 META_REGISTER_CLASS(MetaObjectDerived, "9e29e701-a3c6-439f-be85-e2d3106fcb4e", META_NS::ObjectCategoryBits::NO_CATEGORY) 34 META_REGISTER_CLASS(ObjectDerived, "aabee314-238c-4263-b295-8139bde9933d", META_NS::ObjectCategoryBits::NO_CATEGORY) 35 36 class BaseObjectDerived final : public META_NS::BaseObjectFwd { 37 META_OBJECT(BaseObjectDerived, ClassId::BaseObjectDerived, BaseObjectFwd) 38 }; 39 40 class MetaObjectDerived final : public META_NS::ObjectFwd { 41 META_OBJECT(MetaObjectDerived, ClassId::MetaObjectDerived, ObjectFwd) 42 }; 43 44 class ObjectDerived final : public META_NS::ObjectFwd { 45 META_OBJECT(ObjectDerived, ClassId::ObjectDerived, ObjectFwd) 46 }; 47 48 class BaseObjectTest : public ::testing::Test { 49 public: SetUpTestSuite()50 static void SetUpTestSuite() 51 { 52 SetTest(); 53 RegisterObjectType<BaseObjectDerived>(); 54 RegisterObjectType<MetaObjectDerived>(); 55 RegisterObjectType<ObjectDerived>(); 56 } TearDownTestSuite()57 static void TearDownTestSuite() 58 { 59 UnregisterObjectType<ObjectDerived>(); 60 UnregisterObjectType<MetaObjectDerived>(); 61 UnregisterObjectType<BaseObjectDerived>(); 62 TearDownTest(); 63 } 64 SetUp()65 void SetUp() override {} TearDown()66 void TearDown() override {} 67 68 protected: 69 // ClassId::BaseObject interfaces 70 const BASE_NS::vector<BASE_NS::Uid> BASE_OBJECT_INTERFACES { IObject::UID, IObjectInstance::UID, IObjectFlags::UID, 71 IDerived::UID, ILifecycle::UID, IStaticMetadata::UID }; 72 const BASE_NS::vector<BASE_NS::Uid> OBJECT_INTERFACES { IMetadata::UID, IOwner::UID, IAttach::UID }; 73 CheckInterface(const IObject::ConstPtr & object,BASE_NS::Uid uid,bool implements)74 void CheckInterface(const IObject::ConstPtr& object, BASE_NS::Uid uid, bool implements) 75 { 76 ASSERT_NE(object, nullptr); 77 if (implements) { 78 EXPECT_NE(object->GetInterface(uid), nullptr) << "uid: " << BASE_NS::to_string(uid).c_str(); 79 EXPECT_THAT(object->GetInterfaces(), Contains(uid)) << "uid: " << BASE_NS::to_string(uid).c_str(); 80 } else { 81 EXPECT_EQ(object->GetInterface(uid), nullptr) << "uid: " << BASE_NS::to_string(uid).c_str(); 82 EXPECT_THAT(object->GetInterfaces(), Not(Contains(uid))) << "uid: " << BASE_NS::to_string(uid).c_str(); 83 } 84 } 85 CheckInterfaces(const IObject::ConstPtr & object,bool implements,const BASE_NS::vector<BASE_NS::Uid> & uids)86 void CheckInterfaces(const IObject::ConstPtr& object, bool implements, const BASE_NS::vector<BASE_NS::Uid>& uids) 87 { 88 for (const auto& uid : uids) { 89 CheckInterface(object, uid, implements); 90 } 91 } 92 }; 93 94 HWTEST_F(BaseObjectTest, BaseObject, TestSize.Level1) 95 { 96 auto object = GetObjectRegistry().Create(META_NS::ClassId::BaseObject); 97 ASSERT_NE(object, nullptr); 98 CheckInterfaces(object, true, BASE_OBJECT_INTERFACES); 99 CheckInterfaces(object, false, OBJECT_INTERFACES); 100 EXPECT_THAT(object->GetInterfaces(), SizeIs(BASE_OBJECT_INTERFACES.size())); 101 } 102 103 HWTEST_F(BaseObjectTest, Object, TestSize.Level1) 104 { 105 auto object = GetObjectRegistry().Create(META_NS::ClassId::Object); 106 ASSERT_NE(object, nullptr); 107 CheckInterfaces(object, true, BASE_OBJECT_INTERFACES); 108 CheckInterfaces(object, true, OBJECT_INTERFACES); 109 EXPECT_THAT(object->GetInterfaces(), SizeIs(BASE_OBJECT_INTERFACES.size() + OBJECT_INTERFACES.size())); 110 } 111 112 HWTEST_F(BaseObjectTest, DeriveBaseObject, TestSize.Level1) 113 { 114 auto object = GetObjectRegistry().Create(ClassId::BaseObjectDerived); 115 ASSERT_NE(object, nullptr); 116 CheckInterfaces(object, true, BASE_OBJECT_INTERFACES); 117 CheckInterfaces(object, false, OBJECT_INTERFACES); 118 EXPECT_THAT(object->GetInterfaces(), SizeIs(BASE_OBJECT_INTERFACES.size())); 119 EXPECT_EQ(GetBaseClass(object), META_NS::ClassId::BaseObject); 120 } 121 122 HWTEST_F(BaseObjectTest, DeriveObject, TestSize.Level1) 123 { 124 auto object = GetObjectRegistry().Create(ClassId::ObjectDerived); 125 ASSERT_NE(object, nullptr); 126 CheckInterfaces(object, true, BASE_OBJECT_INTERFACES); 127 CheckInterfaces(object, true, OBJECT_INTERFACES); 128 EXPECT_THAT(object->GetInterfaces(), SizeIs(BASE_OBJECT_INTERFACES.size() + OBJECT_INTERFACES.size())); 129 EXPECT_EQ(GetBaseClass(object), META_NS::ClassId::Object); 130 } 131 132 META_END_NAMESPACE() 133