diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-14 23:42:35 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-14 23:42:35 +0100 |
commit | 89c88d33277163bda7aa3d8d8fab1529ce6b2504 (patch) | |
tree | e392976eb4fe3f805fb41b34a00d1b8cd2c63073 /test | |
parent | 9145e85c4aaddf51c2b676ead04bcdff01f9962d (diff) | |
parent | 7d14fd98944996192047659afcdae67e6c8c3b03 (diff) |
Merge branch 'master' of somweyr.de:ousia
Diffstat (limited to 'test')
-rw-r--r-- | test/core/model/DomainTest.cpp | 99 |
1 files changed, 83 insertions, 16 deletions
diff --git a/test/core/model/DomainTest.cpp b/test/core/model/DomainTest.cpp index 3b62b48..af00151 100644 --- a/test/core/model/DomainTest.cpp +++ b/test/core/model/DomainTest.cpp @@ -104,7 +104,7 @@ TEST(Descriptor, pathTo) std::vector<Rooted<Node>> path = book->pathTo(section); ASSERT_EQ(1U, path.size()); ASSERT_TRUE(path[0]->isa(RttiTypes::FieldDescriptor)); - + // get the text node. Rooted<StructuredClass> text = getClass("text", domain); // get the path between book and text via paragraph. @@ -114,7 +114,7 @@ TEST(Descriptor, pathTo) ASSERT_TRUE(path[1]->isa(RttiTypes::StructuredClass)); ASSERT_EQ("paragraph", path[1]->getName()); ASSERT_TRUE(path[2]->isa(RttiTypes::FieldDescriptor)); - + // get the subsection node. Rooted<StructuredClass> subsection = getClass("subsection", domain); // try to get the path between book and subsection. @@ -125,31 +125,98 @@ TEST(Descriptor, pathTo) TEST(Descriptor, pathToAdvanced) { - // Now we build a really nasty domain with lots of transparency - // and inheritance + /* + * Now we build a really nasty domain with lots of transparency + * and inheritance. The basic idea is to have three paths from start to + * finish, where one is blocked by overriding fields and the longer valid + * one is found first such that it has to be replaced by the shorter one + * during the search. + * + * To achieve that we have the following structure: + * 1.) The start class inherits from A. + * 2.) A has the target as child in the default field, but the default + * field is overridden in the start class. + * 3.) A has B as child in another field. + * 4.) B is transparent and has no children (but C as subclass) + * 5.) C is a subclass of B, transparent and has + * the target as child (shortest path). + * 6.) start has D as child in the default field. + * 7.) D is transparent has E as child in the default field. + * 8.) E is transparent and has target as child in the default field + * (longer path) + * + * So the path start_field , E , E_field should be returned. + */ Logger logger; Manager mgr{1}; Rooted<SystemTypesystem> sys{new SystemTypesystem(mgr)}; - // Get the domain. - Rooted<Domain> domain {new Domain(mgr, sys, "nasty")}; + // Construct the domain + Rooted<Domain> domain{new Domain(mgr, sys, "nasty")}; Cardinality any; any.merge(Range<size_t>::typeRangeFrom(0)); - - // Our root class A + + // Let's create the classes that we need first Rooted<StructuredClass> A{new StructuredClass( mgr, "A", domain, any, {nullptr}, {nullptr}, false, true)}; domain->addStructuredClass(A); - // We also create a field for it. + Rooted<StructuredClass> start{new StructuredClass( + mgr, "start", domain, any, {nullptr}, A, false, false)}; + domain->addStructuredClass(start); + Rooted<StructuredClass> B{new StructuredClass( + mgr, "B", domain, any, {nullptr}, {nullptr}, true, false)}; + domain->addStructuredClass(B); + Rooted<StructuredClass> C{ + new StructuredClass(mgr, "C", domain, any, {nullptr}, B, true, false)}; + domain->addStructuredClass(C); + Rooted<StructuredClass> D{new StructuredClass( + mgr, "D", domain, any, {nullptr}, {nullptr}, true, false)}; + domain->addStructuredClass(D); + Rooted<StructuredClass> E{new StructuredClass( + mgr, "E", domain, any, {nullptr}, {nullptr}, true, false)}; + domain->addStructuredClass(E); + Rooted<StructuredClass> target{ + new StructuredClass(mgr, "target", domain, any)}; + domain->addStructuredClass(target); + // We create two fields for A Rooted<FieldDescriptor> A_field{new FieldDescriptor(mgr, A)}; A->addFieldDescriptor(A_field); + A_field->addChild(target); + Rooted<FieldDescriptor> A_field2{new FieldDescriptor( + mgr, A, FieldDescriptor::FieldType::SUBTREE, "second")}; + A->addFieldDescriptor(A_field2); + A_field2->addChild(B); + // We create no field for B + // One for C + Rooted<FieldDescriptor> C_field{new FieldDescriptor(mgr, C)}; + C->addFieldDescriptor(C_field); + C_field->addChild(target); + // one for start + Rooted<FieldDescriptor> start_field{new FieldDescriptor(mgr, start)}; + start->addFieldDescriptor(start_field); + start_field->addChild(D); + // One for D + Rooted<FieldDescriptor> D_field{new FieldDescriptor(mgr, D)}; + D->addFieldDescriptor(D_field); + D_field->addChild(E); + // One for E + Rooted<FieldDescriptor> E_field{new FieldDescriptor(mgr, E)}; + E->addFieldDescriptor(E_field); + E_field->addChild(target); - // our first transparent child B - Rooted<StructuredClass> B{new StructuredClass( - mgr, "B", domain, any, {nullptr}, {nullptr}, true)}; - A_field->addChild(B); - - //TODO: Continue -} + #ifdef MANAGER_GRAPHVIZ_EXPORT + // dump the manager state + mgr.exportGraphviz("nastyDomain.dot"); + #endif + // and now we should be able to find the shortest path as suggested + std::vector<Rooted<Node>> path = start->pathTo(target); + ASSERT_EQ(3U, path.size()); + ASSERT_TRUE(path[0]->isa(RttiTypes::FieldDescriptor)); + ASSERT_EQ("second", path[0]->getName()); + ASSERT_TRUE(path[1]->isa(RttiTypes::StructuredClass)); + ASSERT_EQ("B", path[1]->getName()); + ASSERT_TRUE(path[2]->isa(RttiTypes::FieldDescriptor)); + ASSERT_EQ("", path[2]->getName()); +} } } |