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, 9 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.