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