summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--slicer/json/serializer.cpp22
-rw-r--r--slicer/json/serializer.h21
-rw-r--r--slicer/test/serializers.cpp73
-rw-r--r--slicer/xml/serializer.cpp22
-rw-r--r--slicer/xml/serializer.h27
5 files changed, 30 insertions, 135 deletions
diff --git a/slicer/json/serializer.cpp b/slicer/json/serializer.cpp
index 6d99725..e2db939 100644
--- a/slicer/json/serializer.cpp
+++ b/slicer/json/serializer.cpp
@@ -368,14 +368,11 @@ namespace Slicer {
void
JsonStreamSerializer::Serialize(ModelPartForRootPtr modelRoot)
{
- json::Value doc;
- modelRoot->OnEachChild([&doc](auto &&, auto && PH2, auto &&) {
- return JsonSerializer::ModelTreeIterateRoot(&doc, PH2);
- });
- json::serializeValue(doc, strm, "utf-8");
+ JsonValueSerializer::Serialize(modelRoot);
+ json::serializeValue(value, strm, "utf-8");
}
- JsonFileSerializer::JsonFileSerializer(std::filesystem::path p) : path(std::move(p)) { }
+ JsonFileSerializer::JsonFileSerializer(const std::filesystem::path & p) : JsonStreamSerializer {strm}, strm(p) { }
JsonFileDeserializer::JsonFileDeserializer(std::filesystem::path p) : path(std::move(p)) { }
@@ -388,19 +385,6 @@ namespace Slicer {
std::visit(DocumentTreeIterate(mp), obj);
}
- void
- JsonFileSerializer::Serialize(ModelPartForRootPtr modelRoot)
- {
- json::Value doc;
- modelRoot->OnEachChild([&doc](auto &&, auto && PH2, auto &&) {
- return JsonSerializer::ModelTreeIterateRoot(&doc, PH2);
- });
- std::ofstream outFile(path);
- json::serializeValue(doc, outFile, "utf-8");
- }
-
- JsonValueSerializer::JsonValueSerializer(json::Value & v) : value(v) { }
-
JsonValueDeserializer::JsonValueDeserializer(const json::Value & v) : value(v) { }
void
diff --git a/slicer/json/serializer.h b/slicer/json/serializer.h
index 32500e8..e2687ce 100644
--- a/slicer/json/serializer.h
+++ b/slicer/json/serializer.h
@@ -2,6 +2,7 @@
#define SLICER_JSON_H
#include <filesystem>
+#include <fstream>
#include <iosfwd>
#include <jsonpp.h>
#include <slicer/modelParts.h>
@@ -18,34 +19,30 @@ namespace Slicer {
static void ModelTreeIterateRoot(json::Value *, ModelPartPtr mp);
};
- class DLL_PUBLIC JsonStreamSerializer : public JsonSerializer {
+ class DLL_PUBLIC JsonValueSerializer : public JsonSerializer {
public:
- explicit JsonStreamSerializer(std::ostream &);
-
void Serialize(ModelPartForRootPtr) override;
protected:
- std::ostream & strm;
+ json::Value value;
};
- class DLL_PUBLIC JsonFileSerializer : public JsonSerializer {
+ class DLL_PUBLIC JsonStreamSerializer : public JsonValueSerializer {
public:
- explicit JsonFileSerializer(std::filesystem::path);
+ explicit JsonStreamSerializer(std::ostream &);
void Serialize(ModelPartForRootPtr) override;
protected:
- const std::filesystem::path path;
+ std::ostream & strm;
};
- class DLL_PUBLIC JsonValueSerializer : public JsonSerializer {
+ class DLL_PUBLIC JsonFileSerializer : public JsonStreamSerializer {
public:
- explicit JsonValueSerializer(json::Value &);
-
- void Serialize(ModelPartForRootPtr) override;
+ explicit JsonFileSerializer(const std::filesystem::path &);
protected:
- json::Value & value;
+ std::ofstream strm;
};
class DLL_PUBLIC JsonStreamDeserializer : public Deserializer {
diff --git a/slicer/test/serializers.cpp b/slicer/test/serializers.cpp
index 9389090..6efc02b 100644
--- a/slicer/test/serializers.cpp
+++ b/slicer/test/serializers.cpp
@@ -104,46 +104,6 @@ public:
BOOST_TEST_CHECKPOINT("Checksum: " << input << " === " << output);
diff(expected, output);
}
-
- template<typename T, typename Deserializer, typename Serializer, typename Internal>
- void
- verifyByHelper(const fs::path & infile, const std::function<Internal(const fs::path &)> & in,
- const std::function<void(const Internal &, const fs::path &)> & out,
- const std::function<void(Internal &)> & ifree, const std::function<void(const T &)> & check = nullptr)
- {
- const fs::path input = rootDir / "initial" / infile;
- const fs::path tmph = binDir / "byHandler";
- fs::create_directory(tmph);
- const fs::path output = tmph / infile;
-
- BOOST_TEST_CHECKPOINT("Read: " << input);
- Internal docRead = in(input);
-
- BOOST_TEST_CHECKPOINT("Deserialize: " << input);
- T p = Slicer::DeserializeAny<Deserializer, T>(docRead);
- ifree(docRead);
-
- if (check) {
- BOOST_TEST_CHECKPOINT("Check1: " << input);
- check(p);
- }
-
- BOOST_TEST_CHECKPOINT("Serialize: " << input);
- Internal docWrite;
- Slicer::SerializeAny<Serializer>(p, docWrite);
-
- if (check) {
- BOOST_TEST_CHECKPOINT("Check2: " << input);
- check(p);
- }
-
- BOOST_TEST_CHECKPOINT("Write: " << output);
- out(docWrite, output);
- ifree(docWrite);
-
- BOOST_TEST_CHECKPOINT("Checksum: " << input << " === " << output);
- diff(input, output);
- }
};
void
@@ -638,28 +598,6 @@ BOOST_AUTO_TEST_CASE(invalid_enum)
BOOST_AUTO_TEST_SUITE_END()
-BOOST_FIXTURE_TEST_SUITE(byHandler, FileBased)
-
-BOOST_AUTO_TEST_CASE(optionals_areset2_json)
-{
- verifyByHelper<TestModule::OptionalsPtr, Slicer::JsonValueDeserializer, Slicer::JsonValueSerializer, json::Value>(
- "optionals-areset2.json", readJson, writeJson, freeJson, checkOptionals_areset);
-}
-
-BOOST_AUTO_TEST_CASE(optionals_areset_xml)
-{
- verifyByHelper<TestModule::OptionalsPtr, Slicer::XmlDocumentDeserializer, Slicer::XmlDocumentSerializer,
- xmlpp::Document *>("optionals-areset.xml", readXml, writeXml, freeXml, checkOptionals_areset);
-}
-
-BOOST_AUTO_TEST_CASE(simple_complete_validator)
-{
- verifyByHelper<TestModule::IsoDate, Slicer::XmlDocumentDeserializer, Slicer::XmlDocumentSerializer,
- xmlpp::Document *>("isodate.xml", readXml, writeXml, freeXml);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
BOOST_AUTO_TEST_CASE(missingConversion)
{
auto in = json::parseValue(R"J({"conv": "2016-06-30 12:34:56"})J");
@@ -667,8 +605,7 @@ BOOST_AUTO_TEST_CASE(missingConversion)
Slicer::NoConversionFound);
auto obj = std::make_shared<TestModule2::MissingConv>("2016-06-30 12:34:56");
- json::Value v;
- BOOST_REQUIRE_THROW(Slicer::SerializeAny<Slicer::JsonValueSerializer>(obj, v), Slicer::NoConversionFound);
+ BOOST_REQUIRE_THROW(Slicer::SerializeAny<Slicer::JsonValueSerializer>(obj), Slicer::NoConversionFound);
}
BOOST_AUTO_TEST_CASE(conversion)
@@ -677,9 +614,9 @@ BOOST_AUTO_TEST_CASE(conversion)
auto obj = Slicer::DeserializeAny<Slicer::JsonValueDeserializer, TestModule2::ConvPtr>(in);
BOOST_REQUIRE_EQUAL("2016-06-30 12:34:56", obj->conv);
- json::Value v;
- Slicer::SerializeAny<Slicer::JsonValueSerializer>(obj, v);
- BOOST_REQUIRE_EQUAL("2016-06-30 12:34:56", std::get<json::String>(std::get<json::Object>(v)["conv"]));
+ std::stringstream out;
+ Slicer::SerializeAny<Slicer::JsonStreamSerializer>(obj, out);
+ BOOST_REQUIRE_EQUAL(R"J({"conv":"2016-06-30 12:34:56"})J", out.view());
}
BOOST_AUTO_TEST_CASE(DeserializeJsonAbstractEmpty)
@@ -747,7 +684,7 @@ BOOST_AUTO_TEST_CASE(DeserializeXmlIncorrectSeqElementName)
BOOST_AUTO_TEST_CASE(customerModelPartCounters)
{
- BOOST_REQUIRE_EQUAL(35, TestModule::completions);
+ BOOST_REQUIRE_EQUAL(22, TestModule::completions);
}
BOOST_AUTO_TEST_CASE(enum_lookups)
diff --git a/slicer/xml/serializer.cpp b/slicer/xml/serializer.cpp
index 76efa95..96c1a9f 100644
--- a/slicer/xml/serializer.cpp
+++ b/slicer/xml/serializer.cpp
@@ -441,14 +441,11 @@ namespace Slicer {
void
XmlStreamSerializer::Serialize(ModelPartForRootPtr modelRoot)
{
- xmlpp::Document doc;
- modelRoot->OnEachChild([&doc](auto && PH1, auto && PH2, auto &&) {
- return XmlSerializer::ModelTreeIterateRoot(&doc, PH1, PH2);
- });
+ XmlDocumentSerializer::Serialize(modelRoot);
doc.write_to_stream(strm);
}
- XmlFileSerializer::XmlFileSerializer(std::filesystem::path p) : path(std::move(p)) { }
+ XmlFileSerializer::XmlFileSerializer(const std::filesystem::path & p) : XmlStreamSerializer {strm}, strm(p) { }
XmlFileDeserializer::XmlFileDeserializer(std::filesystem::path p) : path(std::move(p)) { }
@@ -460,18 +457,6 @@ namespace Slicer {
DocumentTreeIterate(doc, modelRoot);
}
- void
- XmlFileSerializer::Serialize(ModelPartForRootPtr modelRoot)
- {
- xmlpp::Document doc;
- modelRoot->OnEachChild([&doc](auto && PH1, auto && PH2, auto &&) {
- return XmlSerializer::ModelTreeIterateRoot(&doc, PH1, PH2);
- });
- doc.write_to_file_formatted(path);
- }
-
- XmlDocumentSerializer::XmlDocumentSerializer(xmlpp::Document *& d) : doc(d) { }
-
XmlDocumentDeserializer::XmlDocumentDeserializer(const xmlpp::Document * d) : doc(d) { }
void
@@ -483,9 +468,8 @@ namespace Slicer {
void
XmlDocumentSerializer::Serialize(ModelPartForRootPtr modelRoot)
{
- doc = new xmlpp::Document();
modelRoot->OnEachChild([this](auto && PH1, auto && PH2, auto &&) {
- return XmlSerializer::ModelTreeIterateRoot(doc, PH1, PH2);
+ return XmlSerializer::ModelTreeIterateRoot(&doc, PH1, PH2);
});
}
diff --git a/slicer/xml/serializer.h b/slicer/xml/serializer.h
index fd8616c..d07a77e 100644
--- a/slicer/xml/serializer.h
+++ b/slicer/xml/serializer.h
@@ -8,9 +8,11 @@
#ifndef __clang__
# pragma GCC diagnostic ignored "-Wuseless-cast"
#endif
+#include <libxml++/document.h>
#include <libxml++/nodes/element.h>
#pragma GCC diagnostic pop
#include <filesystem>
+#include <fstream>
#include <functional>
#include <iosfwd>
#include <slicer/modelParts.h>
@@ -20,10 +22,6 @@
namespace Glib {
class ustring;
}
-namespace xmlpp {
- class Document;
- class Node;
-}
namespace Slicer {
using CurrentElementCreator = ::AdHoc::LazyPointer<xmlpp::Element, xmlpp::Element *>;
@@ -41,35 +39,30 @@ namespace Slicer {
static void ModelTreeIterateDictElements(xmlpp::Element * element, const ModelPartPtr & dict);
};
- class DLL_PUBLIC XmlStreamSerializer : public XmlSerializer {
+ class DLL_PUBLIC XmlDocumentSerializer : public XmlSerializer {
public:
- explicit XmlStreamSerializer(std::ostream &);
-
void Serialize(ModelPartForRootPtr) override;
protected:
- std::ostream & strm;
+ xmlpp::Document doc;
};
- class DLL_PUBLIC XmlFileSerializer : public XmlSerializer {
+ class DLL_PUBLIC XmlStreamSerializer : public XmlDocumentSerializer {
public:
- explicit XmlFileSerializer(std::filesystem::path);
+ explicit XmlStreamSerializer(std::ostream &);
void Serialize(ModelPartForRootPtr) override;
protected:
- const std::filesystem::path path;
+ std::ostream & strm;
};
- class DLL_PUBLIC XmlDocumentSerializer : public XmlSerializer {
+ class DLL_PUBLIC XmlFileSerializer : public XmlStreamSerializer {
public:
- explicit XmlDocumentSerializer(xmlpp::Document *&);
-
- void Serialize(ModelPartForRootPtr) override;
+ explicit XmlFileSerializer(const std::filesystem::path &);
protected:
- // cppcheck-suppress unsafeClassCanLeak
- xmlpp::Document *& doc;
+ std::ofstream strm;
};
class DLL_PUBLIC XmlDeserializer : public Deserializer {