#include #include "core/CoreIncludes.h" #include "core/class/Identifiable.h" #include "core/class/OrxonoxClass.h" #include "core/class/OrxonoxInterface.h" #include "core/module/ModuleInstance.h" namespace orxonox { namespace { class Interface : virtual public OrxonoxInterface { public: Interface() { RegisterObject(Interface); } virtual void test() = 0; }; class BaseClass : public OrxonoxClass { public: BaseClass() { RegisterObject(BaseClass); } }; class RealClass : public BaseClass, public Interface { public: RealClass() { RegisterObject(RealClass); } virtual void test() override {} }; RegisterAbstractClass(Interface).inheritsFrom(); RegisterClassNoArgs(BaseClass); RegisterClassNoArgs(RealClass); // Fixture class IdentifierSimpleClassHierarchyTest : public ::testing::Test { public: virtual void SetUp() override { new IdentifierManager(); ModuleInstance::getCurrentModuleInstance()->loadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); Context::setRootContext(new Context(nullptr)); Identifier::initConfigValues_s = false; // TODO: hack! IdentifierManager::getInstance().createClassHierarchy(); } virtual void TearDown() override { IdentifierManager::getInstance().destroyClassHierarchy(); Context::destroyRootContext(); ModuleInstance::getCurrentModuleInstance()->unloadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); delete &IdentifierManager::getInstance(); } }; bool contains(const std::list identifiers, Identifier* identifier) { return std::find(identifiers.begin(), identifiers.end(), identifier) != identifiers.end(); } bool contains(const std::set identifiers, Identifier* identifier) { return identifiers.find(identifier) != identifiers.end(); } } TEST_F(IdentifierSimpleClassHierarchyTest, TestInterface) { Identifier* identifier = Class(Interface); EXPECT_EQ(1u, identifier->getDirectChildren().size()); EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(RealClass))); EXPECT_EQ(1u, identifier->getChildren().size()); EXPECT_TRUE(contains(identifier->getChildren(), Class(RealClass))); EXPECT_EQ(1u, identifier->getDirectParents().size()); EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface))); EXPECT_EQ(4u, identifier->getParents().size()); EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable))); EXPECT_TRUE(contains(identifier->getParents(), Class(Listable))); EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable))); EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface))); } TEST_F(IdentifierSimpleClassHierarchyTest, BaseClass) { Identifier* identifier = Class(BaseClass); EXPECT_EQ(1u, identifier->getDirectChildren().size()); EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(RealClass))); EXPECT_EQ(1u, identifier->getChildren().size()); EXPECT_TRUE(contains(identifier->getChildren(), Class(RealClass))); EXPECT_EQ(1u, identifier->getDirectParents().size()); EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass))); EXPECT_EQ(4u, identifier->getParents().size()); EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable))); EXPECT_TRUE(contains(identifier->getParents(), Class(Listable))); EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable))); EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass))); } TEST_F(IdentifierSimpleClassHierarchyTest, RealClass) { Identifier* identifier = Class(RealClass); EXPECT_EQ(0u, identifier->getDirectChildren().size()); EXPECT_EQ(0u, identifier->getChildren().size()); EXPECT_EQ(2u, identifier->getDirectParents().size()); EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface))); EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass))); EXPECT_EQ(7u, identifier->getParents().size()); EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable))); EXPECT_TRUE(contains(identifier->getParents(), Class(Listable))); EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable))); EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface))); EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass))); EXPECT_TRUE(contains(identifier->getParents(), Class(Interface))); EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass))); } }