#include #include "core/object/Listable.h" #include "core/CoreIncludes.h" namespace orxonox { namespace { class ListableTest : public Listable { public: ListableTest() { RegisterRootObject(ListableTest); } }; class ListableSubclassTest : public ListableTest { public: ListableSubclassTest() { RegisterObject(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; } } TEST(ListableTest, CanCreate) { ListableTest* test = new ListableTest(); ASSERT_TRUE(test != NULL); delete test; } TEST(ListableTest, AddsToObjectList) { ListableTest test; EXPECT_EQ(1u, ObjectList::size()); EXPECT_TRUE(objectListContains(&test)); } TEST(ListableTest, AddsToAllObjectLists) { ListableSubclassTest test; EXPECT_EQ(1u, ObjectList::size()); EXPECT_TRUE(objectListContains(&test)); EXPECT_EQ(1u, ObjectList::size()); EXPECT_TRUE(objectListContains(&test)); } TEST(ListableTest, RemovesFromObjectList) { EXPECT_EQ(0u, ObjectList::size()); { ListableTest test; EXPECT_EQ(1u, ObjectList::size()); EXPECT_TRUE(objectListContains(&test)); } EXPECT_EQ(0u, ObjectList::size()); } TEST(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(ListableTest, CanAddObjectToContext) { Context context(NULL); 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(ListableTest, CanAddObjectToSubContext) { Context baseContext(NULL); 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(ListableTest, CanChangeContext) { Context* rootContext = Context::getRootContext(); Context newContext(NULL); 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(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(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)); } }