Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/test/core/object/ListableTest.cc @ 10395

Last change on this file since 10395 was 10395, checked in by landauf, 10 years ago

create and initialize Identifiers explicitly via registerClass(). registerClass() must be called before using an Identifier of this type.
(some tests will currently fail)

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