diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-01-07 22:00:23 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-01-07 22:00:23 +0000 |
commit | 3bbd61689bb9faa8d628adce55403c6430e079a5 (patch) | |
tree | 4f552c601ce8f33bc0eaadc43ab61b39376fe485 | |
parent | Move mp not null to cover all cases (diff) | |
download | slicer-3bbd61689bb9faa8d628adce55403c6430e079a5.tar.bz2 slicer-3bbd61689bb9faa8d628adce55403c6430e079a5.tar.xz slicer-3bbd61689bb9faa8d628adce55403c6430e079a5.zip |
Support for XML text in otherwise complex objects, test data and test case
-rw-r--r-- | slicer/test/initial/entityref.xml | 2 | ||||
-rw-r--r-- | slicer/test/preprocessor.cpp | 2 | ||||
-rw-r--r-- | slicer/test/serializers.cpp | 12 | ||||
-rw-r--r-- | slicer/test/types.ice | 6 | ||||
-rw-r--r-- | slicer/xml/serializer.cpp | 15 |
5 files changed, 35 insertions, 2 deletions
diff --git a/slicer/test/initial/entityref.xml b/slicer/test/initial/entityref.xml new file mode 100644 index 0000000..05f3f62 --- /dev/null +++ b/slicer/test/initial/entityref.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<EntityRef Id="26">Hull City</EntityRef> diff --git a/slicer/test/preprocessor.cpp b/slicer/test/preprocessor.cpp index 54099df..10fedef 100644 --- a/slicer/test/preprocessor.cpp +++ b/slicer/test/preprocessor.cpp @@ -13,7 +13,7 @@ namespace fs = boost::filesystem; -const unsigned int COMPONENTS_IN_TEST_ICE = 26; +const unsigned int COMPONENTS_IN_TEST_ICE = 27; BOOST_FIXTURE_TEST_SUITE ( preprocessor, FileStructure ); diff --git a/slicer/test/serializers.cpp b/slicer/test/serializers.cpp index 12dc37b..6395ce0 100644 --- a/slicer/test/serializers.cpp +++ b/slicer/test/serializers.cpp @@ -204,6 +204,13 @@ checkAssertEq(const T & expected, const T & actual) BOOST_REQUIRE_EQUAL(expected, actual); } +void +checkEntityRef(const TestModule2::EntityRef & er) +{ + BOOST_REQUIRE_EQUAL(er.Id, 26); + BOOST_REQUIRE_EQUAL(er.Name, "Hull City"); +} + xmlpp::Document * readXml(const fs::path & path) { @@ -282,6 +289,11 @@ BOOST_AUTO_TEST_CASE( simpleint_json ) verifyByFile<Ice::Int, Slicer::JsonFileDeserializer>("int2.json", boost::bind(checkAssertEq<Ice::Int>, 27, _1)); } +BOOST_AUTO_TEST_CASE( complexClass_xmlattrAndText ) +{ + verifyByFile<TestModule2::EntityRef, Slicer::XmlFileDeserializer>("entityref.xml", checkEntityRef); +} + BOOST_AUTO_TEST_CASE( sequenceOfClass_xml ) { verifyByFile<TestModule::Classes, Slicer::XmlFileDeserializer>("seqOfClass.xml", checkSeqOfClass); diff --git a/slicer/test/types.ice b/slicer/test/types.ice index 6339cd7..7a66387 100644 --- a/slicer/test/types.ice +++ b/slicer/test/types.ice @@ -110,5 +110,11 @@ module TestModule2 { TestModule::DateTime dt; TestModule::Base base; }; + struct EntityRef { + [ "slicer:xml:attribute" ] + int Id; + [ "slicer:xml:text" ] + string Name; + }; }; diff --git a/slicer/xml/serializer.cpp b/slicer/xml/serializer.cpp index 4670012..99c4e1c 100644 --- a/slicer/xml/serializer.cpp +++ b/slicer/xml/serializer.cpp @@ -10,6 +10,7 @@ namespace Slicer { const std::string md_attribute = "xml:attribute"; + const std::string md_text = "xml:text"; class BadBooleanValue : public std::invalid_argument { public: @@ -196,7 +197,16 @@ namespace Slicer { } } else if (auto content = dynamic_cast<const xmlpp::ContentNode *>(node)) { - mp->SetValue(new XmlContentValueSource(content)); + ModelPartPtr smp; + if (!content->is_white_space()) { + smp = mp->GetChild(boost::bind(metaDataFlagSet, boost::bind(&Slicer::HookCommon::GetMetadata, _1), md_text)); + } + if (smp) { + smp->SetValue(new XmlContentValueSource(content)); + } + else { + mp->SetValue(new XmlContentValueSource(content)); + } } node = node->get_next_sibling(); } @@ -217,6 +227,9 @@ namespace Slicer { if (hp && metaDataFlagSet(hp->GetMetadata(), md_attribute)) { mp->GetValue(new XmlAttributeValueTarget(n, name)); } + else if (hp && metaDataFlagSet(hp->GetMetadata(), md_text)) { + mp->GetValue(new XmlContentValueTarget(n)); + } else { ModelTreeProcessElement(n->add_child(name), mp); } |