Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/SuperOrxoBros_HS18/SuperOrxoBros_HS18/test/core/object/ListableTest.cc @ 12175

Last change on this file since 12175 was 12175, checked in by siramesh, 5 years ago

Super Orxo Bros (Sidharth Ramesh, Nisa Balta, Jeff Ren)

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