Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/test/core/class/IdentifierNestedClassHierarchyTest.cc @ 10363

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

bugfix: class hierarchy wrongly considered the classes of nested members as base classes of the surrounding class. this is now fixed by using RTTI (i.e. dynamic_cast). also added some tests.

File size: 15.6 KB
Line 
1#include <gtest/gtest.h>
2#include "core/CoreIncludes.h"
3#include "core/class/Identifiable.h"
4#include "core/class/OrxonoxClass.h"
5#include "core/class/OrxonoxInterface.h"
6
7namespace orxonox
8{
9    // Tests the class hierarchy with classes that contain other classes as members.
10    //
11    //                    +------ Nested1         +------ Class1_notNested
12    //                    +------ Nested2         +------ Class2_oneNested
13    // OrxonoxClass <-----+------ BaseClass <-----+------ Class3_twoNested <----------- Class3_Child
14    //                                            +------ Class4_class1Nested
15    //                                            +------ Class5_class2Nested
16    //                                            +------ Class6_class3Nested <-------- Class6_Child
17
18    namespace
19    {
20        class Nested1 : public OrxonoxClass
21        {
22            public:
23                Nested1() { RegisterObject(Nested1); }
24        };
25
26        class Nested2 : public OrxonoxClass
27        {
28            public:
29                Nested2() { RegisterObject(Nested2); }
30        };
31
32        class BaseClass : public OrxonoxClass
33        {
34            public:
35                BaseClass() { RegisterObject(BaseClass); }
36        };
37
38        class Class1_notNested : public BaseClass
39        {
40            public:
41                Class1_notNested() { RegisterObject(Class1_notNested); }
42        };
43
44        class Class2_oneNested : public BaseClass
45        {
46            public:
47                Class2_oneNested() { RegisterObject(Class2_oneNested); }
48                Nested1 nested1_;
49        };
50
51        class Class3_twoNested : public BaseClass
52        {
53            public:
54                Class3_twoNested() { RegisterObject(Class3_twoNested); }
55                Nested1 nested1_;
56                Nested2 nested2_;
57        };
58
59        class Class4_class1Nested : public BaseClass
60        {
61            public:
62                Class4_class1Nested() { RegisterObject(Class4_class1Nested); }
63                Class1_notNested nested_;
64        };
65
66        class Class5_class2Nested : public BaseClass
67        {
68            public:
69                Class5_class2Nested() { RegisterObject(Class5_class2Nested); }
70                Class2_oneNested nested_;
71        };
72
73        class Class6_class3Nested : public BaseClass
74        {
75            public:
76                Class6_class3Nested() { RegisterObject(Class6_class3Nested); }
77                Class3_twoNested nested_;
78        };
79
80        class Class3_Child : public Class3_twoNested
81        {
82            public:
83                Class3_Child() { RegisterObject(Class3_Child); }
84        };
85
86        class Class6_Child : public Class6_class3Nested
87        {
88            public:
89                Class6_Child() { RegisterObject(Class6_Child); }
90        };
91
92        // Fixture
93        class IdentifierNestedClassHierarchyTest : public ::testing::Test
94        {
95            public:
96                virtual void SetUp()
97                {
98                    registerClass("Context", new ClassFactoryWithContext<Context>());
99                    registerClass("Listable", new ClassFactoryWithContext<Listable>());
100                    registerClass("Configurable", new ClassFactoryNoArgs<Configurable>());
101                    registerClass("OrxonoxClass", new ClassFactoryNoArgs<OrxonoxClass>());
102                    registerClass("Nested1", new ClassFactoryNoArgs<Nested1>());
103                    registerClass("Nested2", new ClassFactoryNoArgs<Nested2>());
104                    registerClass("BaseClass", new ClassFactoryNoArgs<BaseClass>());
105                    registerClass("Class1_notNested", new ClassFactoryNoArgs<Class1_notNested>());
106                    registerClass("Class2_oneNested", new ClassFactoryNoArgs<Class2_oneNested>());
107                    registerClass("Class3_twoNested", new ClassFactoryNoArgs<Class3_twoNested>());
108                    registerClass("Class4_class1Nested", new ClassFactoryNoArgs<Class4_class1Nested>());
109                    registerClass("Class5_class2Nested", new ClassFactoryNoArgs<Class5_class2Nested>());
110                    registerClass("Class6_class3Nested", new ClassFactoryNoArgs<Class6_class3Nested>());
111                    registerClass("Class3_Child", new ClassFactoryNoArgs<Class3_Child>());
112                    registerClass("Class6_Child", new ClassFactoryNoArgs<Class6_Child>());
113
114                    IdentifierManager::getInstance().createClassHierarchy();
115                }
116
117                virtual void TearDown()
118                {
119                    IdentifierManager::getInstance().destroyAllIdentifiers();
120                }
121        };
122
123        bool contains(const std::set<const Identifier*> identifiers, Identifier* identifier)
124        {
125            return identifiers.find(identifier) != identifiers.end();
126        }
127    }
128
129    TEST_F(IdentifierNestedClassHierarchyTest, TestNested1)
130    {
131        Identifier* identifier = Class(Nested1);
132
133        EXPECT_EQ(0u, identifier->getDirectChildren().size());
134        EXPECT_EQ(0u, identifier->getChildren().size());
135
136        EXPECT_EQ(1u, identifier->getDirectParents().size());
137        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
138
139        EXPECT_EQ(4u, identifier->getParents().size());
140        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
141        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
142        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
143        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
144    }
145
146    TEST_F(IdentifierNestedClassHierarchyTest, TestNested2)
147    {
148        Identifier* identifier = Class(Nested2);
149
150        EXPECT_EQ(0u, identifier->getDirectChildren().size());
151        EXPECT_EQ(0u, identifier->getChildren().size());
152
153        EXPECT_EQ(1u, identifier->getDirectParents().size());
154        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
155
156        EXPECT_EQ(4u, identifier->getParents().size());
157        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
158        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
159        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
160        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
161    }
162
163    TEST_F(IdentifierNestedClassHierarchyTest, TestBaseClass)
164    {
165        Identifier* identifier = Class(BaseClass);
166
167        EXPECT_EQ(6u, identifier->getDirectChildren().size());
168        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class1_notNested)));
169        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2_oneNested)));
170        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3_twoNested)));
171        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class4_class1Nested)));
172        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class5_class2Nested)));
173        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class6_class3Nested)));
174
175        EXPECT_EQ(8u, identifier->getChildren().size());
176        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1_notNested)));
177        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2_oneNested)));
178        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3_twoNested)));
179        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class4_class1Nested)));
180        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class5_class2Nested)));
181        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class6_class3Nested)));
182        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3_Child)));
183        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class6_Child)));
184
185        EXPECT_EQ(1u, identifier->getDirectParents().size());
186        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
187
188        EXPECT_EQ(4u, identifier->getParents().size());
189        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
190        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
191        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
192        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
193    }
194
195    TEST_F(IdentifierNestedClassHierarchyTest, TestClass1_notNested)
196    {
197        Identifier* identifier = Class(Class1_notNested);
198
199        EXPECT_EQ(0u, identifier->getDirectChildren().size());
200        EXPECT_EQ(0u, identifier->getChildren().size());
201
202        EXPECT_EQ(1u, identifier->getDirectParents().size());
203        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
204
205        EXPECT_EQ(5u, identifier->getParents().size());
206        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
207        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
208        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
209        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
210        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
211    }
212
213    TEST_F(IdentifierNestedClassHierarchyTest, TestClass2_oneNested)
214    {
215        Identifier* identifier = Class(Class2_oneNested);
216
217        EXPECT_EQ(0u, identifier->getDirectChildren().size());
218        EXPECT_EQ(0u, identifier->getChildren().size());
219
220        EXPECT_EQ(1u, identifier->getDirectParents().size());
221        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
222
223        EXPECT_EQ(5u, identifier->getParents().size());
224        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
225        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
226        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
227        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
228        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
229    }
230
231    TEST_F(IdentifierNestedClassHierarchyTest, TestClass3_twoNested)
232    {
233        Identifier* identifier = Class(Class3_twoNested);
234
235        EXPECT_EQ(1u, identifier->getDirectChildren().size());
236        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3_Child)));
237
238        EXPECT_EQ(1u, identifier->getChildren().size());
239        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3_Child)));
240
241        EXPECT_EQ(1u, identifier->getDirectParents().size());
242        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
243
244        EXPECT_EQ(5u, identifier->getParents().size());
245        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
246        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
247        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
248        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
249        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
250    }
251
252    TEST_F(IdentifierNestedClassHierarchyTest, TestClass4_class1Nested)
253    {
254        Identifier* identifier = Class(Class4_class1Nested);
255
256        EXPECT_EQ(0u, identifier->getDirectChildren().size());
257        EXPECT_EQ(0u, identifier->getChildren().size());
258
259        EXPECT_EQ(1u, identifier->getDirectParents().size());
260        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
261
262        EXPECT_EQ(5u, identifier->getParents().size());
263        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
264        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
265        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
266        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
267        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
268    }
269
270    TEST_F(IdentifierNestedClassHierarchyTest, TestClass5_class2Nested)
271    {
272        Identifier* identifier = Class(Class5_class2Nested);
273
274        EXPECT_EQ(0u, identifier->getDirectChildren().size());
275        EXPECT_EQ(0u, identifier->getChildren().size());
276
277        EXPECT_EQ(1u, identifier->getDirectParents().size());
278        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
279
280        EXPECT_EQ(5u, identifier->getParents().size());
281        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
282        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
283        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
284        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
285        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
286    }
287
288    TEST_F(IdentifierNestedClassHierarchyTest, TestClass6_class3Nested)
289    {
290        Identifier* identifier = Class(Class6_class3Nested);
291
292        EXPECT_EQ(1u, identifier->getDirectChildren().size());
293        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class6_Child)));
294
295        EXPECT_EQ(1u, identifier->getChildren().size());
296        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class6_Child)));
297
298        EXPECT_EQ(1u, identifier->getDirectParents().size());
299        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
300
301        EXPECT_EQ(5u, identifier->getParents().size());
302        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
303        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
304        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
305        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
306        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
307    }
308
309    TEST_F(IdentifierNestedClassHierarchyTest, TestClass3_Child)
310    {
311        Identifier* identifier = Class(Class3_Child);
312
313        EXPECT_EQ(0u, identifier->getDirectChildren().size());
314        EXPECT_EQ(0u, identifier->getChildren().size());
315
316        EXPECT_EQ(1u, identifier->getDirectParents().size());
317        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Class3_twoNested)));
318
319        EXPECT_EQ(6u, identifier->getParents().size());
320        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
321        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
322        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
323        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
324        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
325        EXPECT_TRUE(contains(identifier->getParents(), Class(Class3_twoNested)));
326    }
327
328    TEST_F(IdentifierNestedClassHierarchyTest, TestClass6_Child)
329    {
330        Identifier* identifier = Class(Class6_Child);
331
332        EXPECT_EQ(0u, identifier->getDirectChildren().size());
333        EXPECT_EQ(0u, identifier->getChildren().size());
334
335        EXPECT_EQ(1u, identifier->getDirectParents().size());
336        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Class6_class3Nested)));
337
338        EXPECT_EQ(6u, identifier->getParents().size());
339        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
340        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
341        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
342        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
343        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
344        EXPECT_TRUE(contains(identifier->getParents(), Class(Class6_class3Nested)));
345    }
346}
Note: See TracBrowser for help on using the repository browser.