[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: |
---|
[9659] | 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 | { |
---|
| 41 | Context::setRootContext(new Context(NULL)); |
---|
[10535] | 42 | ModuleInstance::getCurrentModuleInstance()->loadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); |
---|
[9649] | 43 | } |
---|
| 44 | |
---|
| 45 | virtual void TearDown() |
---|
| 46 | { |
---|
[10535] | 47 | ModuleInstance::getCurrentModuleInstance()->unloadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER); |
---|
[9649] | 48 | Context::setRootContext(NULL); |
---|
| 49 | } |
---|
| 50 | }; |
---|
[9605] | 51 | } |
---|
| 52 | |
---|
[9649] | 53 | TEST_F(ListableTest, CanCreate) |
---|
[9605] | 54 | { |
---|
[9649] | 55 | ListableClassTest* test = new ListableClassTest(); |
---|
[9605] | 56 | ASSERT_TRUE(test != NULL); |
---|
| 57 | delete test; |
---|
| 58 | } |
---|
| 59 | |
---|
[9649] | 60 | TEST_F(ListableTest, AddsToObjectList) |
---|
[9605] | 61 | { |
---|
[9649] | 62 | ListableClassTest test; |
---|
| 63 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 64 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 65 | } |
---|
| 66 | |
---|
[9649] | 67 | TEST_F(ListableTest, AddsToAllObjectLists) |
---|
[9605] | 68 | { |
---|
| 69 | ListableSubclassTest test; |
---|
[9649] | 70 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 71 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 72 | EXPECT_EQ(1u, ObjectList<ListableSubclassTest>::size()); |
---|
| 73 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test)); |
---|
| 74 | } |
---|
| 75 | |
---|
[9649] | 76 | TEST_F(ListableTest, RemovesFromObjectList) |
---|
[9605] | 77 | { |
---|
[9649] | 78 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9605] | 79 | { |
---|
[9649] | 80 | ListableClassTest test; |
---|
| 81 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 82 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 83 | } |
---|
[9649] | 84 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9605] | 85 | } |
---|
| 86 | |
---|
[9649] | 87 | TEST_F(ListableTest, RemovesFromAllObjectLists) |
---|
[9605] | 88 | { |
---|
[9649] | 89 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9606] | 90 | EXPECT_EQ(0u, ObjectList<ListableSubclassTest>::size()); |
---|
[9605] | 91 | { |
---|
| 92 | ListableSubclassTest test; |
---|
[9649] | 93 | EXPECT_EQ(1u, ObjectList<ListableClassTest>::size()); |
---|
| 94 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test)); |
---|
[9605] | 95 | EXPECT_EQ(1u, ObjectList<ListableSubclassTest>::size()); |
---|
| 96 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test)); |
---|
| 97 | } |
---|
[9649] | 98 | EXPECT_EQ(0u, ObjectList<ListableClassTest>::size()); |
---|
[9605] | 99 | EXPECT_EQ(0u, ObjectList<ListableSubclassTest>::size()); |
---|
| 100 | } |
---|
[9608] | 101 | |
---|
[9649] | 102 | TEST_F(ListableTest, CanAddObjectToContext) |
---|
[9627] | 103 | { |
---|
| 104 | Context context(NULL); |
---|
| 105 | ListableSubclassTest test; |
---|
| 106 | |
---|
| 107 | test.setContext(&context); |
---|
| 108 | |
---|
| 109 | // object is in new context |
---|
[9649] | 110 | EXPECT_EQ(1u, context.getObjectList<ListableClassTest>()->size()); |
---|
| 111 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &context)); |
---|
[9627] | 112 | EXPECT_EQ(1u, context.getObjectList<ListableSubclassTest>()->size()); |
---|
| 113 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &context)); |
---|
| 114 | } |
---|
| 115 | |
---|
[9649] | 116 | TEST_F(ListableTest, CanAddObjectToSubContext) |
---|
[9627] | 117 | { |
---|
| 118 | Context baseContext(NULL); |
---|
| 119 | Context subContext(&baseContext); |
---|
| 120 | ListableSubclassTest test; |
---|
| 121 | |
---|
| 122 | test.setContext(&subContext); |
---|
| 123 | |
---|
| 124 | // object is in both contexts |
---|
[9649] | 125 | EXPECT_EQ(1u, baseContext.getObjectList<ListableClassTest>()->size()); |
---|
| 126 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &baseContext)); |
---|
[9627] | 127 | EXPECT_EQ(1u, baseContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 128 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &baseContext)); |
---|
| 129 | |
---|
[9649] | 130 | EXPECT_EQ(1u, subContext.getObjectList<ListableClassTest>()->size()); |
---|
| 131 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext)); |
---|
[9627] | 132 | EXPECT_EQ(1u, subContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 133 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext)); |
---|
| 134 | } |
---|
| 135 | |
---|
[9649] | 136 | TEST_F(ListableTest, CanChangeContext) |
---|
[9608] | 137 | { |
---|
| 138 | Context* rootContext = Context::getRootContext(); |
---|
[9627] | 139 | Context newContext(NULL); |
---|
[9608] | 140 | ListableSubclassTest test; |
---|
| 141 | |
---|
[9627] | 142 | // object is in root context |
---|
[9649] | 143 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 144 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9608] | 145 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 146 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 147 | |
---|
[9627] | 148 | // object is NOT in new context |
---|
[9649] | 149 | EXPECT_EQ(0u, newContext.getObjectList<ListableClassTest>()->size()); |
---|
| 150 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &newContext)); |
---|
[9608] | 151 | EXPECT_EQ(0u, newContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 152 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &newContext)); |
---|
| 153 | |
---|
| 154 | test.setContext(&newContext); |
---|
| 155 | |
---|
[9627] | 156 | // object was removed from root context |
---|
[9649] | 157 | EXPECT_EQ(0u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 158 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9608] | 159 | EXPECT_EQ(0u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 160 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 161 | |
---|
[9627] | 162 | // object is now in new context |
---|
[9649] | 163 | EXPECT_EQ(1u, newContext.getObjectList<ListableClassTest>()->size()); |
---|
| 164 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &newContext)); |
---|
[9608] | 165 | EXPECT_EQ(1u, newContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 166 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &newContext)); |
---|
| 167 | } |
---|
[9627] | 168 | |
---|
[9649] | 169 | TEST_F(ListableTest, CanChangeToSubContext) |
---|
[9627] | 170 | { |
---|
| 171 | Context* rootContext = Context::getRootContext(); |
---|
| 172 | Context subContext(rootContext); |
---|
| 173 | ListableSubclassTest test; |
---|
| 174 | |
---|
| 175 | // object is in root context |
---|
[9649] | 176 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 177 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 178 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 179 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 180 | |
---|
| 181 | // object is NOT in sub context |
---|
[9649] | 182 | EXPECT_EQ(0u, subContext.getObjectList<ListableClassTest>()->size()); |
---|
| 183 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &subContext)); |
---|
[9627] | 184 | EXPECT_EQ(0u, subContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 185 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext)); |
---|
| 186 | |
---|
| 187 | test.setContext(&subContext); |
---|
| 188 | |
---|
| 189 | // object is still in root context |
---|
[9649] | 190 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 191 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 192 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 193 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 194 | |
---|
| 195 | // object is now also in sub context |
---|
[9649] | 196 | EXPECT_EQ(1u, subContext.getObjectList<ListableClassTest>()->size()); |
---|
| 197 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext)); |
---|
[9627] | 198 | EXPECT_EQ(1u, subContext.getObjectList<ListableSubclassTest>()->size()); |
---|
| 199 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext)); |
---|
| 200 | } |
---|
| 201 | |
---|
[9649] | 202 | TEST_F(ListableTest, CanChangeFromSubcontextToSubContext) |
---|
[9627] | 203 | { |
---|
| 204 | Context* rootContext = Context::getRootContext(); |
---|
| 205 | Context subContext1(rootContext); |
---|
| 206 | Context subContext2(rootContext); |
---|
| 207 | ListableSubclassTest test; |
---|
| 208 | |
---|
| 209 | test.setContext(&subContext1); |
---|
| 210 | |
---|
| 211 | // object is in root context |
---|
[9649] | 212 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 213 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 214 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 215 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 216 | |
---|
| 217 | // object is also in sub context 1 |
---|
[9649] | 218 | EXPECT_EQ(1u, subContext1.getObjectList<ListableClassTest>()->size()); |
---|
| 219 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext1)); |
---|
[9627] | 220 | EXPECT_EQ(1u, subContext1.getObjectList<ListableSubclassTest>()->size()); |
---|
| 221 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext1)); |
---|
| 222 | |
---|
| 223 | // object is NOT in sub context 2 |
---|
[9649] | 224 | EXPECT_EQ(0u, subContext2.getObjectList<ListableClassTest>()->size()); |
---|
| 225 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &subContext2)); |
---|
[9627] | 226 | EXPECT_EQ(0u, subContext2.getObjectList<ListableSubclassTest>()->size()); |
---|
| 227 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext2)); |
---|
| 228 | |
---|
| 229 | test.setContext(&subContext2); |
---|
| 230 | |
---|
| 231 | // object is still in root context |
---|
[9649] | 232 | EXPECT_EQ(1u, rootContext->getObjectList<ListableClassTest>()->size()); |
---|
| 233 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, rootContext)); |
---|
[9627] | 234 | EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size()); |
---|
| 235 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext)); |
---|
| 236 | |
---|
| 237 | // object was removed from sub context 1 |
---|
[9649] | 238 | EXPECT_EQ(0u, subContext1.getObjectList<ListableClassTest>()->size()); |
---|
| 239 | EXPECT_FALSE(objectListContains<ListableClassTest>(&test, &subContext1)); |
---|
[9627] | 240 | EXPECT_EQ(0u, subContext1.getObjectList<ListableSubclassTest>()->size()); |
---|
| 241 | EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext1)); |
---|
| 242 | |
---|
| 243 | // object is now in sub context 2 |
---|
[9649] | 244 | EXPECT_EQ(1u, subContext2.getObjectList<ListableClassTest>()->size()); |
---|
| 245 | EXPECT_TRUE(objectListContains<ListableClassTest>(&test, &subContext2)); |
---|
[9627] | 246 | EXPECT_EQ(1u, subContext2.getObjectList<ListableSubclassTest>()->size()); |
---|
| 247 | EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext2)); |
---|
| 248 | } |
---|
[9605] | 249 | } |
---|