Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core7/test/core/class/IdentifierClassHierarchyTest.cc @ 10379

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

use lists instead of sets to store parent identifiers. this allows to store the exact order of initialization of parent classes.

  • Property svn:eol-style set to native
File size: 19.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 : virtual public OrxonoxInterface
22        {
23            public:
24                BaseInterface1()
25                {
26                    RegisterObject(BaseInterface1);
27                }
28
29                virtual void test1() = 0;
30        };
31
32        class BaseInterface2 : virtual public OrxonoxInterface
33        {
34            public:
35                BaseInterface2()
36                {
37                    RegisterObject(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                    RegisterObject(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("Context", new ClassFactoryWithContext<Context>());
133                    registerClass("Listable", new ClassFactoryWithContext<Listable>());
134                    registerClass("Configurable", new ClassFactoryNoArgs<Configurable>());
135                    registerClass("OrxonoxInterface", new ClassFactoryNoArgs<OrxonoxInterface>());
136                    registerClass("OrxonoxClass", new ClassFactoryNoArgs<OrxonoxClass>());
137                    registerClass("BaseInterface1", static_cast<ClassFactory<BaseInterface1>*>(NULL), false)->inheritsFrom(Class(OrxonoxInterface));
138                    registerClass("BaseInterface2", static_cast<ClassFactory<BaseInterface2>*>(NULL), false)->inheritsFrom(Class(OrxonoxInterface));
139                    registerClass("Interface1", static_cast<ClassFactory<Interface1>*>(NULL), false)->inheritsFrom(Class(BaseInterface1));
140                    registerClass("Interface2", static_cast<ClassFactory<Interface2>*>(NULL), false)->inheritsFrom(Class(BaseInterface2));
141                    registerClass("BaseClass", new ClassFactoryNoArgs<BaseClass>());
142                    registerClass("Class0", new ClassFactoryNoArgs<Class0>());
143                    registerClass("Class1", new ClassFactoryNoArgs<Class1>());
144                    registerClass("Class2a", new ClassFactoryNoArgs<Class2a>());
145                    registerClass("Class2b", new ClassFactoryNoArgs<Class2b>());
146                    registerClass("Class3", new ClassFactoryNoArgs<Class3>());
147
148                    IdentifierManager::getInstance().createClassHierarchy();
149                }
150
151                virtual void TearDown()
152                {
153                    IdentifierManager::getInstance().destroyAllIdentifiers();
154                }
155        };
156
157        bool contains(const std::list<const Identifier*> identifiers, Identifier* identifier)
158        {
159            return std::find(identifiers.begin(), identifiers.end(), identifier) != identifiers.end();
160        }
161
162        bool contains(const std::set<const Identifier*> identifiers, Identifier* identifier)
163        {
164            return identifiers.find(identifier) != identifiers.end();
165        }
166    }
167
168    TEST(IdentifierClassHierarchyTest_NoFixture, NoInitialization)
169    {
170        {
171            Identifier* identifier = Class(BaseInterface1);
172            EXPECT_EQ(0u, identifier->getChildren().size());
173            EXPECT_EQ(0u, identifier->getParents().size());
174        }
175        {
176            Identifier* identifier = Class(BaseInterface2);
177            EXPECT_EQ(0u, identifier->getChildren().size());
178            EXPECT_EQ(0u, identifier->getParents().size());
179        }
180        {
181            Identifier* identifier = Class(Interface1);
182            EXPECT_EQ(0u, identifier->getChildren().size());
183            EXPECT_EQ(0u, identifier->getParents().size());
184        }
185        {
186            Identifier* identifier = Class(Interface2);
187            EXPECT_EQ(0u, identifier->getChildren().size());
188            EXPECT_EQ(0u, identifier->getParents().size());
189        }
190        {
191            Identifier* identifier = Class(BaseClass);
192            EXPECT_EQ(0u, identifier->getChildren().size());
193            EXPECT_EQ(0u, identifier->getParents().size());
194        }
195        {
196            Identifier* identifier = Class(Class0);
197            EXPECT_EQ(0u, identifier->getChildren().size());
198            EXPECT_EQ(0u, identifier->getParents().size());
199        }
200        {
201            Identifier* identifier = Class(Class1);
202            EXPECT_EQ(0u, identifier->getChildren().size());
203            EXPECT_EQ(0u, identifier->getParents().size());
204        }
205        {
206            Identifier* identifier = Class(Class2a);
207            EXPECT_EQ(0u, identifier->getChildren().size());
208            EXPECT_EQ(0u, identifier->getParents().size());
209        }
210        {
211            Identifier* identifier = Class(Class2b);
212            EXPECT_EQ(0u, identifier->getChildren().size());
213            EXPECT_EQ(0u, identifier->getParents().size());
214        }
215        {
216            Identifier* identifier = Class(Class3);
217            EXPECT_EQ(0u, identifier->getChildren().size());
218            EXPECT_EQ(0u, identifier->getParents().size());
219        }
220    }
221
222    TEST_F(IdentifierClassHierarchyTest, TestBaseInterface1)
223    {
224        Identifier* identifier = Class(BaseInterface1);
225
226        EXPECT_EQ(2u, identifier->getDirectChildren().size());
227        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Interface1)));
228        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3)));
229
230        EXPECT_EQ(5u, identifier->getChildren().size());
231        EXPECT_TRUE(contains(identifier->getChildren(), Class(Interface1)));
232        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3)));
233        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1)));
234        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
235        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
236
237        EXPECT_EQ(1u, identifier->getDirectParents().size());
238        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
239
240        EXPECT_EQ(4u, identifier->getParents().size());
241        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
242        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
243        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
244        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
245    }
246
247    TEST_F(IdentifierClassHierarchyTest, TestBaseInterface2)
248    {
249        Identifier* identifier = Class(BaseInterface2);
250
251        EXPECT_EQ(2u, identifier->getDirectChildren().size());
252        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Interface2)));
253        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3)));
254
255        EXPECT_EQ(4u, identifier->getChildren().size());
256        EXPECT_TRUE(contains(identifier->getChildren(), Class(Interface2)));
257        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3)));
258        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
259        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
260
261        EXPECT_EQ(1u, identifier->getDirectParents().size());
262        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
263
264        EXPECT_EQ(4u, identifier->getParents().size());
265        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
266        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
267        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
268        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
269    }
270
271    TEST_F(IdentifierClassHierarchyTest, TestInterface1)
272    {
273        Identifier* identifier = Class(Interface1);
274
275        EXPECT_EQ(3u, identifier->getDirectChildren().size());
276        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class1)));
277        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2a)));
278        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2b)));
279
280        EXPECT_EQ(3u, identifier->getChildren().size());
281        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1)));
282        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
283        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
284
285        EXPECT_EQ(1u, identifier->getDirectParents().size());
286        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface1)));
287
288        EXPECT_EQ(5u, identifier->getParents().size());
289        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
290        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
291        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
292        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
293        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
294    }
295
296    TEST_F(IdentifierClassHierarchyTest, TestInterface2)
297    {
298        Identifier* identifier = Class(Interface2);
299
300        EXPECT_EQ(2u, identifier->getDirectChildren().size());
301        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2a)));
302        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2b)));
303
304        EXPECT_EQ(2u, identifier->getChildren().size());
305        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
306        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
307
308        EXPECT_EQ(1u, identifier->getDirectParents().size());
309        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface2)));
310
311        EXPECT_EQ(5u, identifier->getParents().size());
312        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
313        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
314        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
315        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
316        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
317    }
318
319    TEST_F(IdentifierClassHierarchyTest, TestBaseClass)
320    {
321        Identifier* identifier = Class(BaseClass);
322
323        EXPECT_EQ(5u, identifier->getDirectChildren().size());
324        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class0)));
325        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class1)));
326        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2a)));
327        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class2b)));
328        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(Class3)));
329
330        EXPECT_EQ(5u, identifier->getChildren().size());
331        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class0)));
332        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class1)));
333        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2a)));
334        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class2b)));
335        EXPECT_TRUE(contains(identifier->getChildren(), Class(Class3)));
336
337        EXPECT_EQ(1u, identifier->getDirectParents().size());
338        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
339
340        EXPECT_EQ(4u, identifier->getParents().size());
341        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
342        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
343        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
344        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
345    }
346
347    TEST_F(IdentifierClassHierarchyTest, TestClass0)
348    {
349        Identifier* identifier = Class(Class0);
350
351        EXPECT_EQ(0u, identifier->getDirectChildren().size());
352
353        EXPECT_EQ(0u, identifier->getChildren().size());
354
355        EXPECT_EQ(1u, identifier->getDirectParents().size());
356        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
357
358        EXPECT_EQ(5u, identifier->getParents().size());
359        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
360        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
361        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
362        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
363        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
364    }
365
366    TEST_F(IdentifierClassHierarchyTest, TestClass1)
367    {
368        Identifier* identifier = Class(Class1);
369
370        EXPECT_EQ(0u, identifier->getDirectChildren().size());
371
372        EXPECT_EQ(0u, identifier->getChildren().size());
373
374        EXPECT_EQ(2u, identifier->getDirectParents().size());
375        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
376        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
377
378        EXPECT_EQ(8u, identifier->getParents().size());
379        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
380        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
381        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
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    }
388
389    TEST_F(IdentifierClassHierarchyTest, TestClass2a)
390    {
391        Identifier* identifier = Class(Class2a);
392
393        EXPECT_EQ(0u, identifier->getDirectChildren().size());
394
395        EXPECT_EQ(0u, identifier->getChildren().size());
396
397        EXPECT_EQ(3u, identifier->getDirectParents().size());
398        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
399        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
400        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface2)));
401
402        EXPECT_EQ(10u, identifier->getParents().size());
403        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
404        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
405        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
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, TestClass2b)
416    {
417        Identifier* identifier = Class(Class2b);
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(Interface1)));
426        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface2)));
427
428        EXPECT_EQ(10u, identifier->getParents().size());
429        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
430        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
431        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
432        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
433        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
434        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
435        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
436        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface1)));
437        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
438        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface2)));
439    }
440
441    TEST_F(IdentifierClassHierarchyTest, TestClass3)
442    {
443        Identifier* identifier = Class(Class3);
444
445        EXPECT_EQ(0u, identifier->getDirectChildren().size());
446
447        EXPECT_EQ(0u, identifier->getChildren().size());
448
449        EXPECT_EQ(3u, identifier->getDirectParents().size());
450        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
451        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface1)));
452        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface2)));
453
454        EXPECT_EQ(8u, identifier->getParents().size());
455        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
456        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
457        EXPECT_TRUE(contains(identifier->getParents(), Class(Configurable)));
458        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
459        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
460        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
461        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
462        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
463    }
464}
Note: See TracBrowser for help on using the repository browser.