Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Aug 13, 2013, 11:35:26 PM (12 years ago)
Author:
landauf
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core6/test/core/class/IdentifierSimpleClassHierarchyTest.cc

    r9640 r9646  
    1010    {
    1111        class Interface : public OrxonoxInterface
    12             { public: Interface() { RegisterRootObject(Interface); } };
     12        {
     13            public:
     14                Interface()
     15                {
     16                    RegisterRootObject(Interface);
     17                }
     18
     19                virtual void test() = 0;
     20        };
    1321
    1422        class BaseClass : public OrxonoxClass
    15             { public: BaseClass() { RegisterRootObject(BaseClass); } };
     23        {
     24            public:
     25                BaseClass()
     26                {
     27                    RegisterRootObject(BaseClass);
     28                }
     29        };
    1630
    1731        class RealClass : public BaseClass, public Interface
    18             { public: RealClass() { RegisterObject(RealClass); } };
     32        {
     33            public:
     34                RealClass()
     35                {
     36                    RegisterObject(RealClass);
     37                }
     38
     39                virtual void test() {}
     40        };
    1941
    2042        // Fixture
     
    2446                virtual void SetUp()
    2547                {
    26                     registerClass("Interface", new ClassFactoryNoArgs<Interface>());
     48                    registerClass("OrxonoxInterface", new ClassFactoryNoArgs<OrxonoxInterface>());
     49                    registerClass("OrxonoxClass", new ClassFactoryNoArgs<OrxonoxClass>());
     50                    registerClass("Interface", static_cast<ClassFactory<Interface>*>(NULL), false).inheritsFrom(Class(OrxonoxInterface));
    2751                    registerClass("BaseClass", new ClassFactoryNoArgs<BaseClass>());
    2852                    registerClass("RealClass", new ClassFactoryNoArgs<RealClass>());
     
    3660                }
    3761        };
     62
     63        bool contains(const std::set<const Identifier*> identifiers, Identifier* identifier)
     64        {
     65            return identifiers.find(identifier) != identifiers.end();
     66        }
    3867    }
    3968
     
    6190        Identifier* identifier = Class(Interface);
    6291
     92        EXPECT_EQ(1u, identifier->getDirectChildren().size());
     93        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(RealClass)));
     94
    6395        EXPECT_EQ(1u, identifier->getChildren().size());
    64         EXPECT_EQ(0u, identifier->getParents().size());
     96        EXPECT_TRUE(contains(identifier->getChildren(), Class(RealClass)));
     97
     98        EXPECT_EQ(1u, identifier->getDirectParents().size());
     99        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
     100
     101        EXPECT_EQ(2u, identifier->getParents().size());
     102        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
     103        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
    65104    }
    66105
     
    69108        Identifier* identifier = Class(BaseClass);
    70109
     110        EXPECT_EQ(1u, identifier->getDirectChildren().size());
     111        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(RealClass)));
     112
    71113        EXPECT_EQ(1u, identifier->getChildren().size());
    72         EXPECT_EQ(0u, identifier->getParents().size());
     114        EXPECT_TRUE(contains(identifier->getChildren(), Class(RealClass)));
     115
     116        EXPECT_EQ(1u, identifier->getDirectParents().size());
     117        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
     118
     119        EXPECT_EQ(2u, identifier->getParents().size());
     120        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
     121        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
    73122    }
    74123
     
    77126        Identifier* identifier = Class(RealClass);
    78127
     128        EXPECT_EQ(0u, identifier->getDirectChildren().size());
     129
    79130        EXPECT_EQ(0u, identifier->getChildren().size());
    80         EXPECT_EQ(2u, identifier->getParents().size());
     131
     132        EXPECT_EQ(2u, identifier->getDirectParents().size());
     133        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface)));
     134        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
     135
     136        EXPECT_EQ(5u, identifier->getParents().size());
     137        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
     138        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
     139        EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
     140        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface)));
     141        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
    81142    }
    82143}
Note: See TracChangeset for help on using the changeset viewer.