From 0149f97eca604662493e8aa2ebcceecba5fc5b94 Mon Sep 17 00:00:00 2001 From: Benjamin Paassen Date: Wed, 4 Feb 2015 16:58:42 +0100 Subject: reworked test for domain parsing. The skeleton works. --- test/plugins/xml/XmlParserTest.cpp | 103 +++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 9 deletions(-) (limited to 'test/plugins/xml/XmlParserTest.cpp') diff --git a/test/plugins/xml/XmlParserTest.cpp b/test/plugins/xml/XmlParserTest.cpp index b90f39e..60e7c9b 100644 --- a/test/plugins/xml/XmlParserTest.cpp +++ b/test/plugins/xml/XmlParserTest.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -73,26 +74,110 @@ TEST(XmlParser, generic) #endif } +static void checkStructuredClass( + Handle n, const std::string &name, Handle domain, + Variant cardinality = AnyCardinality, + Handle attributesDescriptor = nullptr, + Handle superclass = nullptr, bool transparent = false, + bool root = false) +{ + ASSERT_FALSE(n == nullptr); + Handle sc = n.cast(); + ASSERT_FALSE(sc == nullptr); + ASSERT_EQ(name, sc->getName()); + ASSERT_EQ(domain, sc->getParent()); + ASSERT_EQ(cardinality, sc->getCardinality()); + ASSERT_EQ(transparent, sc->isTransparent()); + ASSERT_EQ(root, sc->hasRootPermission()); +} + +static Rooted checkStructuredClass( + const std::string &resolve, const std::string &name, Handle domain, + Variant cardinality = AnyCardinality, + Handle attributesDescriptor = nullptr, + Handle superclass = nullptr, bool transparent = false, + bool root = false) +{ + auto res = domain->resolve(RttiTypes::StructuredClass, resolve); + if (res.size() != 1) { + throw OusiaException("resolution error!"); + } + Handle sc = res[0].node.cast(); + checkStructuredClass(sc, name, domain, cardinality, attributesDescriptor, + superclass, transparent, root); + return sc; +} + +static void checkFieldDescriptor( + Handle n, const std::string &name, Handle parent, + NodeVector children, + FieldDescriptor::FieldType type = FieldDescriptor::FieldType::TREE, + Handle primitiveType = nullptr, bool optional = false) +{ + ASSERT_FALSE(n.isNull()); + Handle field = n.cast(); + ASSERT_FALSE(field.isNull()); + ASSERT_EQ(name, field->getName()); + ASSERT_EQ(parent, field->getParent()); + ASSERT_EQ(type, field->getFieldType()); + ASSERT_EQ(primitiveType, field->getPrimitiveType()); + ASSERT_EQ(optional, field->isOptional()); + // check the children. + ASSERT_EQ(children.size(), field->getChildren().size()); + for (unsigned int c = 0; c < children.size(); c++) { + ASSERT_EQ(children[c], field->getChildren()[c]); + } +} + +static void checkFieldDescriptor( + Handle desc, NodeVector children, + const std::string &name = "", + FieldDescriptor::FieldType type = FieldDescriptor::FieldType::TREE, + Handle primitiveType = nullptr, bool optional = false) +{ + auto res = desc->resolve(RttiTypes::FieldDescriptor, name); + ASSERT_EQ(1, res.size()); + checkFieldDescriptor(res[0].node, name, desc, children, type, primitiveType, + optional); +} + TEST(XmlParser, domainParsing) { XmlStandaloneEnvironment env(logger); Rooted n = env.parse("book_domain.oxm", "", "", RttiSet{&RttiTypes::Domain}); - ASSERT_FALSE(n.isNull()); + ASSERT_FALSE(n == nullptr); + ASSERT_FALSE(logger.hasError()); // check the domain node. Rooted domain = n.cast(); ASSERT_EQ("book", domain->getName()); // get the book struct node. - auto res = domain->resolve(RttiTypes::StructuredClass, "book"); - ASSERT_EQ(1, res.size()); - Rooted bookStruct = res[0].node.cast(); - ASSERT_EQ("book", bookStruct->getName()); Cardinality single; single.merge({1}); - ASSERT_EQ(single, bookStruct->getCardinality()); - //TODO: Something is wrong here -// ASSERT_TRUE(bookStruct->isRoot()); - ASSERT_FALSE(bookStruct->isTransparent()); + Rooted book = checkStructuredClass( + "book", "book", domain, single, nullptr, nullptr, false, true); + // get the chapter struct node. + Rooted chapter = + checkStructuredClass("chapter", "chapter", domain); + Rooted section = + checkStructuredClass("section", "section", domain); + Rooted subsection = + checkStructuredClass("subsection", "subsection", domain); + Rooted paragraph = + checkStructuredClass("paragraph", "paragraph", domain, AnyCardinality, + nullptr, nullptr, true, false); + Rooted text = checkStructuredClass( + "text", "text", domain, AnyCardinality, nullptr, nullptr, true, false); + + // check the FieldDescriptors. + checkFieldDescriptor(book, {chapter, paragraph}); + checkFieldDescriptor(chapter, {section, paragraph}); + checkFieldDescriptor(section, {subsection, paragraph}); + checkFieldDescriptor(subsection, {paragraph}); + checkFieldDescriptor(paragraph, {text}); + checkFieldDescriptor( + text, {}, "content", FieldDescriptor::FieldType::PRIMITIVE, + env.project->getSystemTypesystem()->getStringType(), false); } } -- cgit v1.2.3