Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core6/test/core/object/ListableTest.cc @ 9649

Last change on this file since 9649 was 9649, checked in by landauf, 11 years ago

added ability to set the root-context explicitly (and also to destroy it before the class-hierarchy is destroyed).
currently it's not possible to set the root context explicitly during startup of the game because it is already used by static initialization

  • Property svn:eol-style set to native
File size: 10.2 KB
RevLine 
[9605]1#include <gtest/gtest.h>
2#include "core/object/Listable.h"
3#include "core/CoreIncludes.h"
4
5namespace orxonox
6{
7    namespace
8    {
[9649]9        class ListableClassTest : public Listable
[9605]10        {
11            public:
[9649]12            ListableClassTest() { RegisterRootObject(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}
Note: See TracBrowser for help on using the repository browser.