Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

fixed bug: Listable::setContext didn't work properly with sub-contexts (contexts whose root-context is != NULL)

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