[9605] | 1 | #include <gtest/gtest.h> |
---|
| 2 | #include "core/object/Listable.h" |
---|
| 3 | #include "core/CoreIncludes.h" |
---|
[10481] | 4 | #include "core/module/ModuleInstance.h" |
---|
[9605] | 5 | |
---|
| 6 | namespace orxonox |
---|
| 7 | { |
---|
| 8 | namespace |
---|
| 9 | { |
---|
[9649] | 10 | class ListableClassTest : public Listable |
---|
[9605] | 11 | { |
---|
| 12 | public: |
---|
[10544] | 13 | ListableClassTest() { RegisterObject(ListableClassTest); } |
---|
[9605] | 14 | }; |
---|
| 15 | |
---|
[9649] | 16 | class ListableSubclassTest : public ListableClassTest |
---|
[9605] | 17 | { |
---|
| 18 | public: |
---|
| 19 | ListableSubclassTest() { RegisterObject(ListableSubclassTest); } |
---|
| 20 | }; |
---|
| 21 | |
---|
[10395] | 22 | RegisterClassNoArgs(ListableClassTest); |
---|
| 23 | RegisterClassNoArgs(ListableSubclassTest); |
---|
| 24 | |
---|
[9605] | 25 | template <class T> |
---|
[9608] | 26 | bool objectListContains(T* element, Context* context = Context::getRootContext()) |
---|
[9605] | 27 | { |
---|
[9608] | 28 | for (typename ObjectList<T>::iterator it = static_cast<ObjectListElement<T>*>(context->getObjectList<T>()->begin()); |
---|
| 29 | it != static_cast<ObjectListElement<T>*>(context->getObjectList<T>()->end()); ++it) |
---|
[9605] | 30 | if (*it == element) |
---|
| 31 | return true; |
---|
| 32 | return false; |
---|
| 33 | } |
---|
[9649] | 34 | |
---|
| 35 | // Fixture |
---|
| 36 | class ListableTest : public ::testing::Test |
---|
| 37 | { |
---|
| 38 | public: |
---|
| 39 | virtual void SetUp() |
---|
| 40 | { |
---|
[10544] | 41 | new IdentifierManager(); |
---|
| 42 | ModuleInstance::getCurrentModuleInstance()->loadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); |
---|
[9649] | 43 | Context::setRootContext(new Context(NULL)); |
---|
| 44 | } |
---|
| 45 | |
---|
| 46 | virtual void TearDown() |
---|
| 47 | { |
---|
[10544] | 48 | Context::destroyRootContext(); |
---|
[10535] | 49 | ModuleInstance::getCurrentModuleInstance()->unloadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); |
---|
[10544] | 50 | delete &IdentifierManager::getInstance(); |
---|
[9649] | 51 | } |
---|
| 52 | }; |
---|
[9605] | 53 | } |
---|
| 54 | |
---|
[9649] | 55 | TEST_F(ListableTest, CanCreate) |
---|
[9605] | 56 | { |
---|
[9649] | 57 | ListableClassTest* test = new ListableClassTest(); |
---|
[9605] | 58 | ASSERT_TRUE(test != NULL); |
---|
| 59 | delete test; |
---|
| 60 | } |
---|
| 61 | |
---|
[9649] | 62 | TEST_F(ListableTest, AddsToObjectList) |
---|
[9605] | 63 | { |
---|
[9649] | 64 | ListableClassTest test; |
---|
| 65 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 66 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 67 | } |
---|
| 68 | |
---|
[9649] | 69 | TEST_F(ListableTest, AddsToAllObjectLists) |
---|
[9605] | 70 | { |
---|
| 71 | ListableSubclassTest test; |
---|
[9649] | 72 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 73 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 74 | EXPECT_EQ(1u, ObjectList<ListableSubclassTest>::size()); |
---|
| 75 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test)); |
---|
| 76 | } |
---|
| 77 | |
---|
[9649] | 78 | TEST_F(ListableTest, RemovesFromObjectList) |
---|
[9605] | 79 | { |
---|
[9649] | 80 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9605] | 81 | { |
---|
[9649] | 82 | ListableClassTest test; |
---|
| 83 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 84 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 85 | } |
---|
[9649] | 86 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9605] | 87 | } |
---|
| 88 | |
---|
[9649] | 89 | TEST_F(ListableTest, RemovesFromAllObjectLists) |
---|
[9605] | 90 | { |
---|
[9649] | 91 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9606] | 92 | EXPECT_EQ(0u, ObjectList<ListableSubclassTest>::size()); |
---|
[9605] | 93 | { |
---|
| 94 | ListableSubclassTest test; |
---|
[9649] | 95 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 96 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 97 | EXPECT_EQ(1u, ObjectList<ListableSubclassTest>::size()); |
---|
| 98 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test)); |
---|
| 99 | } |
---|
[9649] | 100 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9605] | 101 | EXPECT_EQ(0u, ObjectList<ListableSubclassTest>::size()); |
---|
| 102 | } |
---|
[9608] | 103 | |
---|
[9649] | 104 | TEST_F(ListableTest, CanAddObjectToContext) |
---|
[9627] | 105 | { |
---|
| 106 | Context context(NULL); |
---|
| 107 | ListableSubclassTest test; |
---|
| 108 | |
---|
| 109 | test.setContext(&context); |
---|
| 110 | |
---|
| 111 | // object is in new context |
---|
[9649] | 112 | EXPECT_EQ(1u, context.getObjectList<ListableClassTest>()->size()); |
---|
| 113 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &context)); |
---|
[9627] | 114 | EXPECT_EQ(1u, context.getObjectList<ListableSubclassTest>()->size()); |
---|
| 115 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &context)); |
---|
| 116 | } |
---|
| 117 | |
---|
[9649] | 118 | TEST_F(ListableTest, CanAddObjectToSubContext) |
---|
[9627] | 119 | { |
---|
| 120 | Context baseContext(NULL); |
---|
| 121 | Context subContext(&baseContext); |
---|
| 122 | ListableSubclassTest test; |
---|
| 123 | |
---|
| 124 | test.setContext(&subContext); |
---|
| 125 | |
---|
| 126 | // object is in both contexts |
---|
[9649] | 127 | EXPECT_EQ(1u, baseContext.getObjectList<ListableClassTest>()->size()); |
---|
| 128 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &baseContext)); |
---|
[9627] | 129 | EXPECT_EQ(1u, baseContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 130 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &baseContext)); |
---|
| 131 | |
---|
[9649] | 132 | EXPECT_EQ(1u, subContext.getObjectList<ListableClassTest>()->size()); |
---|
| 133 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext)); |
---|
[9627] | 134 | EXPECT_EQ(1u, subContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 135 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext)); |
---|
| 136 | } |
---|
| 137 | |
---|
[9649] | 138 | TEST_F(ListableTest, CanChangeContext) |
---|
[9608] | 139 | { |
---|
| 140 | Context* rootContext = Context::getRootContext(); |
---|
[9627] | 141 | Context newContext(NULL); |
---|
[9608] | 142 | ListableSubclassTest test; |
---|
| 143 | |
---|
[9627] | 144 | // object is in root context |
---|
[9649] | 145 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 146 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9608] | 147 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 148 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 149 | |
---|
[9627] | 150 | // object is NOT in new context |
---|
[9649] | 151 | EXPECT_EQ(0u, newContext.getObjectList<ListableClassTest>()->size()); |
---|
| 152 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &newContext)); |
---|
[9608] | 153 | EXPECT_EQ(0u, newContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 154 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &newContext)); |
---|
| 155 | |
---|
| 156 | test.setContext(&newContext); |
---|
| 157 | |
---|
[9627] | 158 | // object was removed from root context |
---|
[9649] | 159 | EXPECT_EQ(0u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 160 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9608] | 161 | EXPECT_EQ(0u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 162 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 163 | |
---|
[9627] | 164 | // object is now in new context |
---|
[9649] | 165 | EXPECT_EQ(1u, newContext.getObjectList<ListableClassTest>()->size()); |
---|
| 166 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &newContext)); |
---|
[9608] | 167 | EXPECT_EQ(1u, newContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 168 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &newContext)); |
---|
| 169 | } |
---|
[9627] | 170 | |
---|
[9649] | 171 | TEST_F(ListableTest, CanChangeToSubContext) |
---|
[9627] | 172 | { |
---|
| 173 | Context* rootContext = Context::getRootContext(); |
---|
| 174 | Context subContext(rootContext); |
---|
| 175 | ListableSubclassTest test; |
---|
| 176 | |
---|
| 177 | // object is in root context |
---|
[9649] | 178 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 179 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 180 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 181 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 182 | |
---|
| 183 | // object is NOT in sub context |
---|
[9649] | 184 | EXPECT_EQ(0u, subContext.getObjectList<ListableClassTest>()->size()); |
---|
| 185 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &subContext)); |
---|
[9627] | 186 | EXPECT_EQ(0u, subContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 187 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext)); |
---|
| 188 | |
---|
| 189 | test.setContext(&subContext); |
---|
| 190 | |
---|
| 191 | // object is still in root context |
---|
[9649] | 192 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 193 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 194 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 195 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 196 | |
---|
| 197 | // object is now also in sub context |
---|
[9649] | 198 | EXPECT_EQ(1u, subContext.getObjectList<ListableClassTest>()->size()); |
---|
| 199 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext)); |
---|
[9627] | 200 | EXPECT_EQ(1u, subContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 201 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext)); |
---|
| 202 | } |
---|
| 203 | |
---|
[9649] | 204 | TEST_F(ListableTest, CanChangeFromSubcontextToSubContext) |
---|
[9627] | 205 | { |
---|
| 206 | Context* rootContext = Context::getRootContext(); |
---|
| 207 | Context subContext1(rootContext); |
---|
| 208 | Context subContext2(rootContext); |
---|
| 209 | ListableSubclassTest test; |
---|
| 210 | |
---|
| 211 | test.setContext(&subContext1); |
---|
| 212 | |
---|
| 213 | // object is in root context |
---|
[9649] | 214 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 215 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 216 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 217 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 218 | |
---|
| 219 | // object is also in sub context 1 |
---|
[9649] | 220 | EXPECT_EQ(1u, subContext1.getObjectList<ListableClassTest>()->size()); |
---|
| 221 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext1)); |
---|
[9627] | 222 | EXPECT_EQ(1u, subContext1.getObjectList<ListableSubclassTest>()->size()); |
---|
| 223 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext1)); |
---|
| 224 | |
---|
| 225 | // object is NOT in sub context 2 |
---|
[9649] | 226 | EXPECT_EQ(0u, subContext2.getObjectList<ListableClassTest>()->size()); |
---|
| 227 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &subContext2)); |
---|
[9627] | 228 | EXPECT_EQ(0u, subContext2.getObjectList<ListableSubclassTest>()->size()); |
---|
| 229 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext2)); |
---|
| 230 | |
---|
| 231 | test.setContext(&subContext2); |
---|
| 232 | |
---|
| 233 | // object is still in root context |
---|
[9649] | 234 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 235 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 236 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 237 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 238 | |
---|
| 239 | // object was removed from sub context 1 |
---|
[9649] | 240 | EXPECT_EQ(0u, subContext1.getObjectList<ListableClassTest>()->size()); |
---|
| 241 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &subContext1)); |
---|
[9627] | 242 | EXPECT_EQ(0u, subContext1.getObjectList<ListableSubclassTest>()->size()); |
---|
| 243 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext1)); |
---|
| 244 | |
---|
| 245 | // object is now in sub context 2 |
---|
[9649] | 246 | EXPECT_EQ(1u, subContext2.getObjectList<ListableClassTest>()->size()); |
---|
| 247 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext2)); |
---|
[9627] | 248 | EXPECT_EQ(1u, subContext2.getObjectList<ListableSubclassTest>()->size()); |
---|
| 249 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext2)); |
---|
| 250 | } |
---|
[9605] | 251 | } |
---|