summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-14 23:42:35 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-01-14 23:42:35 +0100
commit89c88d33277163bda7aa3d8d8fab1529ce6b2504 (patch)
treee392976eb4fe3f805fb41b34a00d1b8cd2c63073 /test
parent9145e85c4aaddf51c2b676ead04bcdff01f9962d (diff)
parent7d14fd98944996192047659afcdae67e6c8c3b03 (diff)
Merge branch 'master' of somweyr.de:ousia
Diffstat (limited to 'test')
-rw-r--r--test/core/model/DomainTest.cpp99
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());
+}
}
}