#include #include "core/object/Listable.h" #include "core/CoreIncludes.h" #include "core/module/ModuleInstance.h" namespace orxonox { namespace { class ListableClassTest : public Listable { public: ListableClassTest() { RegisterObject(ListableClassTest); } }; class ListableSubclassTest : public ListableClassTest { public: ListableSubclassTest() { RegisterObject(ListableSubclassTest); } }; RegisterClassNoArgs(ListableClassTest); RegisterClassNoArgs(ListableSubclassTest); template bool objectListContains(T* element, Context* context = Context::getRootContext()) { for (typename ObjectList::iterator it = static_cast*>(context->getObjectList()->begin()); it != static_cast*>(context->getObjectList()->end()); ++it) if (*it == element) return true; return false; } // Fixture class ListableTest : public ::testing::Test { public: virtual void SetUp() override { new IdentifierManager(); ModuleInstance::getCurrentModuleInstance()->loadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); Context::setRootContext(new Context(nullptr)); } virtual void TearDown() override { Context::destroyRootContext(); ModuleInstance::getCurrentModuleInstance()->unloadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); delete &IdentifierManager::getInstance(); } }; } TEST_F(ListableTest, CanCreate) { ListableClassTest* test = new ListableClassTest(); ASSERT_TRUE(test != nullptr); delete test; } TEST_F(ListableTest, AddsToObjectList) { ListableClassTest test; EXPECT_EQ(1u, ObjectList().size()); EXPECT_TRUE(objectListContains(&test)); } TEST_F(ListableTest, AddsToAllObjectLists) { ListableSubclassTest test; EXPECT_EQ(1u, ObjectList().size()); EXPECT_TRUE(objectListContains(&test)); EXPECT_EQ(1u, ObjectList().size()); EXPECT_TRUE(objectListContains(&test)); } TEST_F(ListableTest, RemovesFromObjectList) { EXPECT_EQ(0u, ObjectList().size()); { ListableClassTest test; EXPECT_EQ(1u, ObjectList().size()); EXPECT_TRUE(objectListContains(&test)); } EXPECT_EQ(0u, ObjectList().size()); } TEST_F(ListableTest, RemovesFromAllObjectLists) { EXPECT_EQ(0u, ObjectList().size()); EXPECT_EQ(0u, ObjectList().size()); { ListableSubclassTest test; EXPECT_EQ(1u, ObjectList().size()); EXPECT_TRUE(objectListContains(&test)); EXPECT_EQ(1u, ObjectList().size()); EXPECT_TRUE(objectListContains(&test)); } EXPECT_EQ(0u, ObjectList().size()); EXPECT_EQ(0u, ObjectList().size()); } TEST_F(ListableTest, CanAddObjectToContext) { Context context(nullptr); ListableSubclassTest test; test.setContext(&context); // object is in new context EXPECT_EQ(1u, context.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &context)); EXPECT_EQ(1u, context.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &context)); } TEST_F(ListableTest, CanAddObjectToSubContext) { Context baseContext(nullptr); Context subContext(&baseContext); ListableSubclassTest test; test.setContext(&subContext); // object is in both contexts EXPECT_EQ(1u, baseContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &baseContext)); EXPECT_EQ(1u, baseContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &baseContext)); EXPECT_EQ(1u, subContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext)); EXPECT_EQ(1u, subContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext)); } TEST_F(ListableTest, CanChangeContext) { Context* rootContext = Context::getRootContext(); Context newContext(nullptr); ListableSubclassTest test; // object is in root context EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); // object is NOT in new context EXPECT_EQ(0u, newContext.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &newContext)); EXPECT_EQ(0u, newContext.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &newContext)); test.setContext(&newContext); // object was removed from root context EXPECT_EQ(0u, rootContext->getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, rootContext)); EXPECT_EQ(0u, rootContext->getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, rootContext)); // object is now in new context EXPECT_EQ(1u, newContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &newContext)); EXPECT_EQ(1u, newContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &newContext)); } TEST_F(ListableTest, CanChangeToSubContext) { Context* rootContext = Context::getRootContext(); Context subContext(rootContext); ListableSubclassTest test; // object is in root context EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); // object is NOT in sub context EXPECT_EQ(0u, subContext.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &subContext)); EXPECT_EQ(0u, subContext.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &subContext)); test.setContext(&subContext); // object is still in root context EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); // object is now also in sub context EXPECT_EQ(1u, subContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext)); EXPECT_EQ(1u, subContext.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext)); } TEST_F(ListableTest, CanChangeFromSubcontextToSubContext) { Context* rootContext = Context::getRootContext(); Context subContext1(rootContext); Context subContext2(rootContext); ListableSubclassTest test; test.setContext(&subContext1); // object is in root context EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); // object is also in sub context 1 EXPECT_EQ(1u, subContext1.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext1)); EXPECT_EQ(1u, subContext1.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext1)); // object is NOT in sub context 2 EXPECT_EQ(0u, subContext2.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &subContext2)); EXPECT_EQ(0u, subContext2.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &subContext2)); test.setContext(&subContext2); // object is still in root context EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); EXPECT_EQ(1u, rootContext->getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, rootContext)); // object was removed from sub context 1 EXPECT_EQ(0u, subContext1.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &subContext1)); EXPECT_EQ(0u, subContext1.getObjectList()->size()); EXPECT_FALSE(objectListContains(&test, &subContext1)); // object is now in sub context 2 EXPECT_EQ(1u, subContext2.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext2)); EXPECT_EQ(1u, subContext2.getObjectList()->size()); EXPECT_TRUE(objectListContains(&test, &subContext2)); } }