diff --git a/src/serialization/cereal/serialization_node_base.h b/src/serialization/cereal/serialization_node_base.h new file mode 100644 index 0000000000000000000000000000000000000000..5cf94d7c93db5389976d5e82a1bc39de83faab30 --- /dev/null +++ b/src/serialization/cereal/serialization_node_base.h @@ -0,0 +1,77 @@ +#ifndef _WOLF_IO_CEREAL_NODE_BASE_H_ +#define _WOLF_IO_CEREAL_NODE_BASE_H_ + +// Wolf includes +#include "../../node_base.h" + +#include <cereal/cereal.hpp> +#include <cereal/types/polymorphic.hpp> + +namespace wolf { + +struct NodeBase::Serializer { + + template <class Archive> + static void serialize(Archive& ar, NodeBase& o, std::uint32_t const /*version*/) + { + ar( cereal::make_nvp("node_class_", o.node_class_) ); + ar( cereal::make_nvp("node_type_", o.node_type_) ); + ar( cereal::make_nvp("node_name_", o.node_name_) ); + ar( cereal::make_nvp("node_id_", o.node_id_) ); + +// ar( cereal::make_nvp("problem_ptr_", o.problem_ptr_) ); + + // Not sure what to do with this guy ... + //ar( cereal::make_nvp("node_id_count_", o.node_id_count_) ); + } + + template <class Archive> + static void load_and_construct( Archive& ar, cereal::construct<wolf::NodeBase>& construct, + std::uint32_t const /*version*/ ) + { + decltype(std::declval<wolf::NodeBase>().getClass()) nb_class; + decltype(std::declval<wolf::NodeBase>().getType()) nb_type; + decltype(std::declval<wolf::NodeBase>().getName()) nb_name; + + ar( cereal::make_nvp("node_class_", nb_class) ); + ar( cereal::make_nvp("node_type_", nb_type) ); + ar( cereal::make_nvp("node_name_", nb_name) ); + + construct( nb_class, nb_type, nb_name ); + + ar( cereal::make_nvp("node_id_", construct->node_id_) ); + +// ar( cereal::make_nvp("problem_ptr_", construct->problem_ptr_) ); + + // Not sure what to do with this guy ... + //ar( cereal::make_nvp("node_id_count_", construct->node_id_count_) ); + } +}; + +} // namespace wolf + +namespace cereal { + +/// @note No default constructor thus the need +/// for these specializations +template <> +struct LoadAndConstruct<wolf::NodeBase> +{ + template <class Archive> + static void load_and_construct( Archive& ar, + cereal::construct<wolf::NodeBase>& construct, + std::uint32_t const version ) + { + wolf::NodeBase::Serializer::load_and_construct(ar, construct, version); + } +}; + +template <class Archive> +void serialize(Archive& ar, wolf::NodeBase& o, std::uint32_t const version) +{ + wolf::NodeBase::Serializer::serialize(ar, o, version); +} + +} // namespace cereal + +#endif /* _WOLF_IO_CEREAL_NODE_BASE_H_ */ diff --git a/src/test/serialization/cereal/gtest_serialization_node_base.cpp b/src/test/serialization/cereal/gtest_serialization_node_base.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b0a51b833d2645dadf751660616b61f17144a1f7 --- /dev/null +++ b/src/test/serialization/cereal/gtest_serialization_node_base.cpp @@ -0,0 +1,247 @@ +/* + * gtest_node_base_serialization.cpp + * + * Created on: Jul 16, 2017 + * Author: Jeremie Deray + */ + +#include "../../utils_gtest.h" + +#include "../../../serialization/cereal/serialization_node_base.h" + +#include "../../../serialization/cereal/archives.h" + +#include <cereal/types/memory.hpp> +#include <fstream> + +class WolfTestCerealSerializationNodeBase : public testing::Test +{ +public: + + WolfTestCerealSerializationNodeBase() /*: + nb(nb_class), + nb_ptr(std::make_shared<wolf::NodeBase>(nb_class))*/ + { + // + } + + const std::string path_to_io = "/tmp/"; + + decltype(std::declval<wolf::NodeBase>().getClass()) nb_class = "Foo"; + decltype(std::declval<wolf::NodeBase>().getClass()) nb_type = "Bar"; + decltype(std::declval<wolf::NodeBase>().getClass()) nb_name = "Dummy"; + + decltype(std::declval<wolf::NodeBase>().nodeId()) id; + +// wolf::NodeBase nb; +// wolf::NodeBasePtr nb_ptr; +}; + +TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBaseXML) +{ + { + // This guy has node_id = 1 + wolf::NodeBase nb(nb_class, nb_type, nb_name); + + id = nb.nodeId(); + + std::ofstream os(path_to_io + "node_base_serialization.xml"); + cereal::XMLOutputArchive xml_archive(os); + + ASSERT_NO_THROW( xml_archive( nb ) ); + } + + { + std::ifstream is(path_to_io + "node_base_serialization.xml"); + cereal::XMLInputArchive xml_archive(is); + + // This guy has node_id = 2 + wolf::NodeBase nb("SuperDummy"); + + ASSERT_NO_THROW( xml_archive( nb ) ); + + ASSERT_EQ(nb.getClass(), nb_class); + ASSERT_EQ(nb.getType(), nb_type); + ASSERT_EQ(nb.getName(), nb_name); + ASSERT_EQ(nb.nodeId(), id); + } + + PRINTF("All good at " + "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBaseXML !\n"); +} + +TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBasePtrXML) +{ + { + // This guy has node_id = 3 + wolf::NodeBasePtr nb = std::make_shared<wolf::NodeBase>(nb_class, nb_type, nb_name); + + id = nb->nodeId(); + + std::ofstream os(path_to_io + "node_base_ptr_serialization.xml"); + cereal::XMLOutputArchive xml_archive(os); + + ASSERT_NO_THROW( xml_archive( nb ) ); + } + + { + std::ifstream is(path_to_io + "node_base_ptr_serialization.xml"); + cereal::XMLInputArchive xml_archive(is); + + wolf::NodeBasePtr nb; + + ASSERT_NO_THROW( xml_archive( nb ) ); + + ASSERT_EQ(nb->getClass(), nb_class); + ASSERT_EQ(nb->getType(), nb_type); + ASSERT_EQ(nb->getName(), nb_name); + ASSERT_EQ(nb->nodeId(), id); + + ASSERT_TRUE( + std::dynamic_pointer_cast< + wolf::NodeBase>(nb) != nullptr); + } + + PRINTF("All good at " + "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBasePtrXML !\n"); +} + +TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBaseJSON) +{ + { + wolf::NodeBase nb(nb_class, nb_type, nb_name); + + id = nb.nodeId(); + + std::ofstream os(path_to_io + "node_base_serialization.json"); + cereal::JSONOutputArchive json_archive(os); + + ASSERT_NO_THROW( json_archive( nb ) ); + } + + { + std::ifstream is(path_to_io + "node_base_serialization.json"); + cereal::JSONInputArchive json_archive(is); + + wolf::NodeBase blank("This guy has node_id = 1"); + wolf::NodeBase nb("SuperDummy"); + + ASSERT_NO_THROW( json_archive( nb ) ); + + ASSERT_EQ(nb.getClass(), nb_class); + ASSERT_EQ(nb.getType(), nb_type); + ASSERT_EQ(nb.getName(), nb_name); + ASSERT_EQ(nb.nodeId(), id); + } + + PRINTF("All good at " + "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBaseJSON !\n"); +} + +TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBasePtrJSON) +{ + { + wolf::NodeBasePtr nb = std::make_shared<wolf::NodeBase>(nb_class, nb_type, nb_name); + + id = nb->nodeId(); + + std::ofstream os(path_to_io + "node_base_ptr_serialization.json"); + cereal::JSONOutputArchive json_archive(os); + + ASSERT_NO_THROW( json_archive( nb ) ); + } + + { + std::ifstream is(path_to_io + "node_base_ptr_serialization.json"); + cereal::JSONInputArchive json_archive(is); + + wolf::NodeBasePtr nb; + + ASSERT_NO_THROW( json_archive( nb ) ); + + ASSERT_EQ(nb->getClass(), nb_class); + ASSERT_EQ(nb->getType(), nb_type); + ASSERT_EQ(nb->getName(), nb_name); + ASSERT_EQ(nb->nodeId(), id); + + ASSERT_TRUE( + std::dynamic_pointer_cast< + wolf::NodeBase>(nb) != nullptr); + } + + PRINTF("All good at " + "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBasePtrJSON !\n"); +} + +TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBaseBinary) +{ + { + wolf::NodeBase nb(nb_class, nb_type, nb_name); + + id = nb.nodeId(); + + std::ofstream os(path_to_io + "node_base_serialization.bin"); + cereal::BinaryOutputArchive bin_archive(os); + + ASSERT_NO_THROW( bin_archive( nb ) ); + } + + { + std::ifstream is(path_to_io + "node_base_serialization.bin"); + cereal::BinaryInputArchive bin_archive(is); + + wolf::NodeBase blank("This guy has node_id = 1"); + wolf::NodeBase nb("SuperDummy"); + + ASSERT_NO_THROW( bin_archive( nb ) ); + + ASSERT_EQ(nb.getClass(), nb_class); + ASSERT_EQ(nb.getType(), nb_type); + ASSERT_EQ(nb.getName(), nb_name); + ASSERT_EQ(nb.nodeId(), id); + } + + PRINTF("All good at " + "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBaseBinary !\n"); +} + +TEST_F(WolfTestCerealSerializationNodeBase, CerealSerializationNodeBasePtrBinary) +{ + { + wolf::NodeBasePtr nb = std::make_shared<wolf::NodeBase>(nb_class, nb_type, nb_name); + + id = nb->nodeId(); + + std::ofstream os(path_to_io + "node_base_ptr_serialization.bin"); + cereal::BinaryOutputArchive bin_archive(os); + + ASSERT_NO_THROW( bin_archive( nb ) ); + } + + { + std::ifstream is(path_to_io + "node_base_ptr_serialization.bin"); + cereal::BinaryInputArchive bin_archive(is); + + wolf::NodeBasePtr nb; + + ASSERT_NO_THROW( bin_archive( nb ) ); + + ASSERT_EQ(nb->getClass(), nb_class); + ASSERT_EQ(nb->getType(), nb_type); + ASSERT_EQ(nb->getName(), nb_name); + ASSERT_EQ(nb->nodeId(), id); + + ASSERT_TRUE( + std::dynamic_pointer_cast< + wolf::NodeBase>(nb) != nullptr); + } + + PRINTF("All good at " + "WolfTestCerealSerializationNodeBase::CerealSerializationNodeBasePtrBinary !\n"); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}