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/IdentifierExternalClassHierarchyTest.cc

    r9640 r9646  
    88    {
    99        class Interface : virtual public Identifiable
    10             { public: Interface() { RegisterRootObject(Interface); } };
     10        {
     11            public:
     12                Interface()
     13                {
     14                    RegisterRootObject(Interface);
     15                }
     16
     17                virtual void test() = 0;
     18        };
    1119
    1220        class BaseClass : virtual public Identifiable
    13             { public: BaseClass() { RegisterRootObject(BaseClass); } };
     21        {
     22            public:
     23                BaseClass()
     24                {
     25                    RegisterRootObject(BaseClass);
     26                }
     27        };
    1428
    1529        class RealClass : public BaseClass, public Interface
    16             { public: RealClass() { RegisterObject(RealClass); } };
     30        {
     31            public:
     32                RealClass()
     33                {
     34                    RegisterObject(RealClass);
     35                }
     36
     37                virtual void test() {}
     38        };
    1739
    1840        // Fixture
     
    2244                virtual void SetUp()
    2345                {
    24                     registerClass("Interface", new ClassFactoryNoArgs<Interface>());
     46                    registerClass("Interface", static_cast<ClassFactory<Interface>*>(NULL), false).inheritsFrom(Class(Identifiable));
    2547                    registerClass("BaseClass", new ClassFactoryNoArgs<BaseClass>());
    2648                    registerClass("RealClass", new ClassFactoryNoArgs<RealClass>());
     
    3456                }
    3557        };
     58
     59        bool contains(const std::set<const Identifier*> identifiers, Identifier* identifier)
     60        {
     61            return identifiers.find(identifier) != identifiers.end();
     62        }
    3663    }
    3764
     
    5986        Identifier* identifier = Class(Interface);
    6087
     88        EXPECT_EQ(1u, identifier->getDirectChildren().size());
     89        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(RealClass)));
     90
    6191        EXPECT_EQ(1u, identifier->getChildren().size());
    62         EXPECT_EQ(0u, identifier->getParents().size());
     92        EXPECT_TRUE(contains(identifier->getChildren(), Class(RealClass)));
     93
     94        EXPECT_EQ(1u, identifier->getDirectParents().size());
     95        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Identifiable)));
     96
     97        EXPECT_EQ(1u, identifier->getParents().size());
     98        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
    6399    }
    64100
     
    67103        Identifier* identifier = Class(BaseClass);
    68104
     105        EXPECT_EQ(1u, identifier->getDirectChildren().size());
     106        EXPECT_TRUE(contains(identifier->getDirectChildren(), Class(RealClass)));
     107
    69108        EXPECT_EQ(1u, identifier->getChildren().size());
    70         EXPECT_EQ(0u, identifier->getParents().size());
     109        EXPECT_TRUE(contains(identifier->getChildren(), Class(RealClass)));
     110
     111        EXPECT_EQ(1u, identifier->getDirectParents().size());
     112        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Identifiable)));
     113
     114        EXPECT_EQ(1u, identifier->getParents().size());
     115        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
    71116    }
    72117
     
    75120        Identifier* identifier = Class(RealClass);
    76121
     122        EXPECT_EQ(0u, identifier->getDirectChildren().size());
     123
    77124        EXPECT_EQ(0u, identifier->getChildren().size());
    78         EXPECT_EQ(2u, identifier->getParents().size());
     125
     126        EXPECT_EQ(2u, identifier->getDirectParents().size());
     127        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface)));
     128        EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
     129
     130        EXPECT_EQ(3u, identifier->getParents().size());
     131        EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
     132        EXPECT_TRUE(contains(identifier->getParents(), Class(Interface)));
     133        EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
    79134    }
    80135}
Note: See TracChangeset for help on using the changeset viewer.