Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core6/test/core/class/IdentifierClassHierarchyTest.cc @ 9647

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

implemented new concept to initialize the class hierarchy: each identifier is initialized individually by creating an object of the corresponding class. identifiers of abstract classes must be told explicitly about their direct parents. this allows to build the class tree correctly also for complicated setups like multiple inheritance of abstract classes.

  • Property svn:eol-style set to native
File size: 17.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    //                 +------ Class0
10    // BaseClass <-----+---------------------+--- Class1
11    //                 +---------------------+-+- Class2a
12    //                 +---------------------+-+- Class2b
13    //                 +-+-+-- Class3        | |
14    //                   | |                 | |
15    // BaseInterface1 <--+---- Interface1 <--´ |
16    //                     |                   |
17    // BaseInterface2 <----+-- Interface2 <----´
18
19    namespace
20    {
21        class BaseInterface1 : public OrxonoxInterface
22        {
23            public:
24                BaseInterface1()
25                {
26                    RegisterRootObject(BaseInterface1);
27                }
28
29                virtual void test1() = 0;
30        };
31
32        class BaseInterface2 : public OrxonoxInterface
33        {
34            public:
35                BaseInterface2()
36                {
37                    RegisterRootObject(BaseInterface2);
38                }
39
40                virtual void test2() = 0;
41        };
42
43        class Interface1 : public BaseInterface1
44        {
45            public:
46                Interface1()
47                {
48                    RegisterObject(Interface1);
49                }
50        };
51
52        class Interface2 : public BaseInterface2
53        {
54            public:
55                Interface2()
56                {
57                    RegisterObject(Interface2);
58                }
59        };
60
61        class BaseClass : public OrxonoxClass
62        {
63            public:
64                BaseClass()
65                {
66                    RegisterRootObject(BaseClass);
67                }
68        };
69
70        class Class0 : public BaseClass
71        {
72            public:
73                Class0()
74                {
75                    RegisterObject(Class0);
76                }
77        };
78
79        class Class1 : public BaseClass, public Interface1
80        {
81            public:
82                Class1()
83                {
84                    RegisterObject(Class1);
85                }
86
87                virtual void test1() {}
88        };
89
90        class Class2a : public BaseClass, public Interface1, Interface2
91        {
92            public:
93                Class2a()
94                {
95                    RegisterObject(Class2a);
96                }
97
98                virtual void test1() {}
99                virtual void test2() {}
100        };
101
102        class Class2b : public BaseClass, public Interface2, Interface1
103        {
104            public:
105                Class2b()
106                {
107                    RegisterObject(Class2b);
108                }
109
110                virtual void test1() {}
111                virtual void test2() {}
112        };
113
114        class Class3 : public BaseClass, public BaseInterface1, BaseInterface2
115        {
116            public:
117                Class3()
118                {
119                    RegisterObject(Class3);
120                }
121
122                virtual void test1() {}
123                virtual void test2() {}
124        };
125
126        // Fixture
127        class IdentifierClassHierarchyTest : public ::testing::Test
128        {
129            public:
130                virtual void SetUp()
131                {
132                    registerClass("OrxonoxInterface", new ClassFactoryNoArgs<OrxonoxInterface>());
133                    registerClass("OrxonoxClass", new ClassFactoryNoArgs<OrxonoxClass>());
134                    registerClass("BaseInterface1", static_cast<ClassFactory<BaseInterface1>*>(NULL), false).inheritsFrom(Class(OrxonoxInterface));
135                    registerClass("BaseInterface2", static_cast<ClassFactory<BaseInterface2>*>(NULL), false).inheritsFrom(Class(OrxonoxInterface));
136                    registerClass("Interface1", static_cast<ClassFactory<Interface1>*>(NULL), false).inheritsFrom(Class(BaseInterface1));
137                    registerClass("Interface2", static_cast<ClassFactory<Interface2>*>(NULL), false).inheritsFrom(Class(BaseInterface2));
138                    registerClass("BaseClass", new ClassFactoryNoArgs<BaseClass>());
139                    registerClass("Class0", new ClassFactoryNoArgs<Class0>());
140                    registerClass("Class1", new ClassFactoryNoArgs<Class1>());
141                    registerClass("Class2a", new ClassFactoryNoArgs<Class2a>());
142                    registerClass("Class2b", new ClassFactoryNoArgs<Class2b>());
143                    registerClass("Class3", new ClassFactoryNoArgs<Class3>());
144
145                    IdentifierManager::getInstance().createClassHierarchy();
146                }
147
148                virtual void TearDown()
149                {
150                    IdentifierManager::getInstance().destroyAllIdentifiers();
151                }
152        };
153
154        bool contains(const std::set<const Identifier*> identifiers, Identifier* identifier)
155        {
156            return identifiers.find(identifier) != identifiers.end();
157        }
158    }
159
160    TEST(IdentifierClassHierarchyTest_NoFixture, NoInitialization)
161    {
162        {
163            Identifier* identifier = Class(BaseInterface1);
164            EXPECT_EQ(0u, identifier->getChildren().size());
165            EXPECT_EQ(0u, identifier->getParents().size());
166        }
167        {
168            Identifier* identifier = Class(BaseInterface2);
169            EXPECT_EQ(0u, identifier->getChildren().size());
170            EXPECT_EQ(0u, identifier->getParents().size());
171        }
172        {
173            Identifier* identifier = Class(Interface1);
174            EXPECT_EQ(0u, identifier->getChildren().size());
175            EXPECT_EQ(0u, identifier->getParents().size());
176        }
177        {
178            Identifier* identifier = Class(Interface2);
179            EXPECT_EQ(0u, identifier->getChildren().size());
180            EXPECT_EQ(0u, identifier->getParents().size());
181        }
182        {
183            Identifier* identifier = Class(BaseClass);
184            EXPECT_EQ(0u, identifier->getChildren().size());
185            EXPECT_EQ(0u, identifier->getParents().size());
186        }
187        {
188            Identifier* identifier = Class(Class0);
189            EXPECT_EQ(0u, identifier->getChildren().size());
190            EXPECT_EQ(0u, identifier->getParents().size());
191        }
192        {
193            Identifier* identifier = Class(Class1);
194            EXPECT_EQ(0u, identifier->getChildren().size());
195            EXPECT_EQ(0u, identifier->getParents().size());
196        }
197        {
198            Identifier* identifier = Class(Class2a);
199            EXPECT_EQ(0u, identifier->getChildren().size());
200            EXPECT_EQ(0u, identifier->getParents().size());
201        }
202        {
203            Identifier* identifier = Class(Class2b);
204            EXPECT_EQ(0u, identifier->getChildren().size());
205            EXPECT_EQ(0u, identifier->getParents().size());
206        }
207        {
208            Identifier* identifier = Class(Class3);
209            EXPECT_EQ(0u, identifier->getChildren().size());
210            EXPECT_EQ(0u, identifier->getParents().size());
211        }
212    }
213
214    TEST_F(IdentifierClassHierarchyTest, TestBaseInterface1)
215    {
216        Identifier* identifier = Class(BaseInterface1);
217
218        EXPECT_EQ(2u, identifier->getDirectChildren().size());
219        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Interface1)));
220        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3)));
221
222        EXPECT_EQ(5u, identifier->getChildren().size());
223        EXPECT_TRUE(contains(identifier->getChildren(), Class(Interface1)));
224        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3)));
225        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1)));
226        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
227        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
228
229        EXPECT_EQ(1u, identifier->getDirectParents().size());
230        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
231
232        EXPECT_EQ(2u, identifier->getParents().size());
233        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
234        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
235    }
236
237    TEST_F(IdentifierClassHierarchyTest, TestBaseInterface2)
238    {
239        Identifier* identifier = Class(BaseInterface2);
240
241        EXPECT_EQ(2u, identifier->getDirectChildren().size());
242        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Interface2)));
243        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3)));
244
245        EXPECT_EQ(4u, identifier->getChildren().size());
246        EXPECT_TRUE(contains(identifier->getChildren(), Class(Interface2)));
247        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3)));
248        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
249        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
250
251        EXPECT_EQ(1u, identifier->getDirectParents().size());
252        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
253
254        EXPECT_EQ(2u, identifier->getParents().size());
255        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
256        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
257    }
258
259    TEST_F(IdentifierClassHierarchyTest, TestInterface1)
260    {
261        Identifier* identifier = Class(Interface1);
262
263        EXPECT_EQ(3u, identifier->getDirectChildren().size());
264        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class1)));
265        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2a)));
266        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2b)));
267
268        EXPECT_EQ(3u, identifier->getChildren().size());
269        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1)));
270        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
271        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
272
273        EXPECT_EQ(1u, identifier->getDirectParents().size());
274        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface1)));
275
276        EXPECT_EQ(3u, identifier->getParents().size());
277        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
278        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
279        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
280    }
281
282    TEST_F(IdentifierClassHierarchyTest, TestInterface2)
283    {
284        Identifier* identifier = Class(Interface2);
285
286        EXPECT_EQ(2u, identifier->getDirectChildren().size());
287        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2a)));
288        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2b)));
289
290        EXPECT_EQ(2u, identifier->getChildren().size());
291        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
292        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
293
294        EXPECT_EQ(1u, identifier->getDirectParents().size());
295        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface2)));
296
297        EXPECT_EQ(3u, identifier->getParents().size());
298        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
299        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
300        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
301    }
302
303    TEST_F(IdentifierClassHierarchyTest, TestBaseClass)
304    {
305        Identifier* identifier = Class(BaseClass);
306
307        EXPECT_EQ(5u, identifier->getDirectChildren().size());
308        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class0)));
309        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class1)));
310        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2a)));
311        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2b)));
312        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3)));
313
314        EXPECT_EQ(5u, identifier->getChildren().size());
315        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class0)));
316        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1)));
317        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
318        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
319        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3)));
320
321        EXPECT_EQ(1u, identifier->getDirectParents().size());
322        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
323
324        EXPECT_EQ(2u, identifier->getParents().size());
325        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
326        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
327    }
328
329    TEST_F(IdentifierClassHierarchyTest, TestClass0)
330    {
331        Identifier* identifier = Class(Class0);
332
333        EXPECT_EQ(0u, identifier->getDirectChildren().size());
334
335        EXPECT_EQ(0u, identifier->getChildren().size());
336
337        EXPECT_EQ(1u, identifier->getDirectParents().size());
338        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
339
340        EXPECT_EQ(3u, identifier->getParents().size());
341        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
342        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
343        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
344    }
345
346    TEST_F(IdentifierClassHierarchyTest, TestClass1)
347    {
348        Identifier* identifier = Class(Class1);
349
350        EXPECT_EQ(0u, identifier->getDirectChildren().size());
351
352        EXPECT_EQ(0u, identifier->getChildren().size());
353
354        EXPECT_EQ(2u, identifier->getDirectParents().size());
355        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
356        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
357
358        EXPECT_EQ(6u, identifier->getParents().size());
359        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
360        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
361        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
362        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
363        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
364        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface1)));
365    }
366
367    TEST_F(IdentifierClassHierarchyTest, TestClass2a)
368    {
369        Identifier* identifier = Class(Class2a);
370
371        EXPECT_EQ(0u, identifier->getDirectChildren().size());
372
373        EXPECT_EQ(0u, identifier->getChildren().size());
374
375        EXPECT_EQ(3u, identifier->getDirectParents().size());
376        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
377        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
378        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface2)));
379
380        EXPECT_EQ(8u, identifier->getParents().size());
381        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
382        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
383        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
384        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
385        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
386        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface1)));
387        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
388        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface2)));
389    }
390
391    TEST_F(IdentifierClassHierarchyTest, TestClass2b)
392    {
393        Identifier* identifier = Class(Class2b);
394
395        EXPECT_EQ(0u, identifier->getDirectChildren().size());
396
397        EXPECT_EQ(0u, identifier->getChildren().size());
398
399        EXPECT_EQ(3u, identifier->getDirectParents().size());
400        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
401        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
402        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface2)));
403
404        EXPECT_EQ(8u, identifier->getParents().size());
405        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
406        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
407        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
408        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
409        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
410        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface1)));
411        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
412        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface2)));
413    }
414
415    TEST_F(IdentifierClassHierarchyTest, TestClass3)
416    {
417        Identifier* identifier = Class(Class3);
418
419        EXPECT_EQ(0u, identifier->getDirectChildren().size());
420
421        EXPECT_EQ(0u, identifier->getChildren().size());
422
423        EXPECT_EQ(3u, identifier->getDirectParents().size());
424        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
425        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface1)));
426        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface2)));
427
428        EXPECT_EQ(6u, identifier->getParents().size());
429        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
430        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
431        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
432        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
433        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
434        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
435    }
436}
Note: See TracBrowser for help on using the repository browser.