diff options
author | randomdan <randomdan@localhost> | 2014-06-05 10:34:29 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2014-06-05 10:34:29 +0000 |
commit | 8df49cbf6252576c6ee694f6e8703bfa27bf267c (patch) | |
tree | 3adac5f6098244fa4e49a104b57abd2f28a379b8 | |
parent | More friendly linkflags and some ycm configs (diff) | |
download | slicer-8df49cbf6252576c6ee694f6e8703bfa27bf267c.tar.bz2 slicer-8df49cbf6252576c6ee694f6e8703bfa27bf267c.tar.xz slicer-8df49cbf6252576c6ee694f6e8703bfa27bf267c.zip |
Adds unit tests covering class of builtin types and class of optional built in, seq, dict, struct, class
Address support for optionals
-rw-r--r-- | slicer/slicer/modelParts.h | 44 | ||||
-rw-r--r-- | slicer/slicer/slicer.h | 2 | ||||
-rw-r--r-- | slicer/test/initial/builtins.xml | 11 | ||||
-rw-r--r-- | slicer/test/initial/optionals-areset.xml | 38 | ||||
-rw-r--r-- | slicer/test/initial/optionals-notset.xml | 3 | ||||
-rw-r--r-- | slicer/test/run-slicer.cpp | 61 | ||||
-rw-r--r-- | slicer/xml/serializer.cpp | 2 |
7 files changed, 143 insertions, 18 deletions
diff --git a/slicer/slicer/modelParts.h b/slicer/slicer/modelParts.h index 761c557..0bdcb25 100644 --- a/slicer/slicer/modelParts.h +++ b/slicer/slicer/modelParts.h @@ -61,6 +61,7 @@ namespace Slicer { virtual void Complete(); virtual void SetValue(ValueSourcePtr); virtual void GetValue(ValueTargetPtr); + virtual bool HasValue() const = 0; }; template<typename T> @@ -80,6 +81,7 @@ namespace Slicer { virtual ModelPartPtr GetChild(const std::string &) override { return NULL; } virtual void SetValue(ValueSourcePtr s) override { s->set(Member); } virtual void GetValue(ValueTargetPtr s) override { s->get(Member); } + virtual bool HasValue() const override { return true; } private: T & Member; @@ -102,7 +104,7 @@ namespace Slicer { modelPart = new T(*OptionalMember); } } - virtual void OnEachChild(const ChildHandler & ch) + virtual void OnEachChild(const ChildHandler & ch) override { if (OptionalMember) { modelPart->OnEachChild(ch); @@ -144,6 +146,8 @@ namespace Slicer { modelPart->GetValue(s); } + virtual bool HasValue() const override { return OptionalMember; } + private: IceUtil::Optional< typename T::element_type > & OptionalMember; ModelPartPtr modelPart; @@ -154,23 +158,24 @@ namespace Slicer { public: class HookBase : public IceUtil::Shared { public: - virtual ModelPartPtr Get(T & t) const = 0; + virtual ModelPartPtr Get(T * t) const = 0; }; typedef IceUtil::Handle<HookBase> HookPtr; template <typename MT, MT T::*M, typename MP> class Hook : public HookBase { public: - ModelPartPtr Get(T & t) const override + ModelPartPtr Get(T * t) const override { - return new MP(t.*M); + return t ? new MP(t->*M) : NULL; } }; virtual void OnEachChild(const ChildHandler & ch) { for (auto h = hooks.begin(); h != hooks.end(); h++) { - ch(h->first, h->second->Get(GetModel())); + auto modelPart = h->second->Get(GetModel()); + ch(h->first, modelPart && modelPart->HasValue() ? modelPart : ModelPartPtr()); } } @@ -183,7 +188,7 @@ namespace Slicer { return NULL; } - virtual T & GetModel() = 0; + virtual T * GetModel() = 0; typedef std::map<std::string, HookPtr> Hooks; @@ -211,11 +216,13 @@ namespace Slicer { ModelObject = new typename T::element_type(); } - typename T::element_type & GetModel() override + typename T::element_type * GetModel() override { - return *ModelObject; + return ModelObject.get(); } + virtual bool HasValue() const override { return ModelObject; } + private: T & ModelObject; }; @@ -235,11 +242,13 @@ namespace Slicer { { } - T & GetModel() override + T * GetModel() override { - return ModelObject; + return &ModelObject; } + virtual bool HasValue() const override { return true; } + private: T & ModelObject; }; @@ -272,11 +281,13 @@ namespace Slicer { ch(rootName, new ModelPartForClass<T>(ModelObject)); } - typename T::element_type & GetModel() override + typename T::element_type * GetModel() override { - return *ModelObject; + return ModelObject.get(); } + virtual bool HasValue() const override { return ModelObject; } + private: T ModelObject; static std::string rootName; @@ -306,6 +317,8 @@ namespace Slicer { ModelPartPtr GetChild(const std::string &) override; + virtual bool HasValue() const override { return true; } + private: ModelPartPtr elementModelPart(typename T::value_type &) const; @@ -322,11 +335,13 @@ namespace Slicer { { } - ModelPartForDictionaryElement<T> & GetModel() override + ModelPartForDictionaryElement<T> * GetModel() override { - return *this; + return this; } + virtual bool HasValue() const override { return true; } + typename T::key_type * key; typename T::mapped_type * value; }; @@ -378,6 +393,7 @@ namespace Slicer { return new ModelPartForDictionaryElementInserter<T>(dictionary); } + virtual bool HasValue() const override { return true; } private: T & dictionary; diff --git a/slicer/slicer/slicer.h b/slicer/slicer/slicer.h index 55ccf00..0900bf9 100644 --- a/slicer/slicer/slicer.h +++ b/slicer/slicer/slicer.h @@ -14,7 +14,7 @@ namespace Slicer { IceUtil::Handle<ModelPartForClassRoot<IceInternal::Handle<Object>>> root = new ModelPartForClassRoot<IceInternal::Handle<Object>>(); SerializerPtr serializer = new Serializer(); serializer->Deserialize(path, root); - return &root->GetModel(); + return root->GetModel(); } template <typename Serializer, typename Object> diff --git a/slicer/test/initial/builtins.xml b/slicer/test/initial/builtins.xml new file mode 100644 index 0000000..650d187 --- /dev/null +++ b/slicer/test/initial/builtins.xml @@ -0,0 +1,11 @@ +<?xml version="1.0"?> +<BuiltIns> + <mbool>true</mbool> + <mbyte>4</mbyte> + <mdouble>3.14159265359</mdouble> + <mfloat>3.14</mfloat> + <mint>80</mint> + <mlong>800</mlong> + <mshort>40</mshort> + <mstring>Sample text</mstring> +</BuiltIns> diff --git a/slicer/test/initial/optionals-areset.xml b/slicer/test/initial/optionals-areset.xml new file mode 100644 index 0000000..e4cdf42 --- /dev/null +++ b/slicer/test/initial/optionals-areset.xml @@ -0,0 +1,38 @@ +<?xml version="1.0"?> +<Optionals> + <optSimple>4</optSimple> + <optClass> + <a>1</a> + <b>2</b> + </optClass> + <optStruct> + <a>1</a> + <b>2</b> + </optStruct> + <optSeq> + <element> + <a>3</a> + <b>4</b> + </element> + <element> + <a>5</a> + <b>6</b> + </element> + </optSeq> + <optDict> + <element> + <key>10</key> + <value> + <a>11</a> + <b>12</b> + </value> + </element> + <element> + <key>13</key> + <value> + <a>14</a> + <b>15</b> + </value> + </element> + </optDict> +</Optionals> diff --git a/slicer/test/initial/optionals-notset.xml b/slicer/test/initial/optionals-notset.xml new file mode 100644 index 0000000..8fbb701 --- /dev/null +++ b/slicer/test/initial/optionals-notset.xml @@ -0,0 +1,3 @@ +<?xml version="1.0"?> +<Optionals> +</Optionals> diff --git a/slicer/test/run-slicer.cpp b/slicer/test/run-slicer.cpp index 6a73736..897d9ee 100644 --- a/slicer/test/run-slicer.cpp +++ b/slicer/test/run-slicer.cpp @@ -5,10 +5,66 @@ #include <boost/filesystem/operations.hpp> #include <boost/format.hpp> #include <boost/function.hpp> +#include <boost/assert.hpp> #include <types.h> namespace fs = boost::filesystem; +template<typename T, typename Serializer> +void +verify(const fs::path & root, const fs::path & tmp, const fs::path & infile, const boost::function<void(const T &)> & check = NULL) +{ + const fs::path input = root / "initial" / infile; + const fs::path output = tmp / infile; + + fprintf(stderr, "%s : Deserialize\n", input.string().c_str()); + IceInternal::Handle<T> p = Slicer::Deserialize<Serializer, T>(input); + fprintf(stderr, "%s : Check1\n", input.string().c_str()); + if (check) check(*p); + fprintf(stderr, "%s : Serialize -> %s\n", input.string().c_str(), output.string().c_str()); + Slicer::Serialize<Serializer>(p, output); + fprintf(stderr, "%s : Check2\n", input.string().c_str()); + if (check) check(*p); + fprintf(stderr, "%s : OK\n", input.string().c_str()); +} + +void +checkOptionals_notset(const TestModule::Optionals & opts) +{ + BOOST_ASSERT(!opts.optSimple); + BOOST_ASSERT(!opts.optStruct); + BOOST_ASSERT(!opts.optClass); + BOOST_ASSERT(!opts.optSeq); + BOOST_ASSERT(!opts.optDict); +} + +void +checkOptionals_areset(const TestModule::Optionals & opts) +{ + BOOST_ASSERT(opts.optSimple); + BOOST_ASSERT(opts.optSimple == 4); + BOOST_ASSERT(opts.optStruct); + BOOST_ASSERT(opts.optStruct->a == 1); + BOOST_ASSERT(opts.optStruct->b == 2); + BOOST_ASSERT(opts.optClass); + BOOST_ASSERT((*opts.optClass)->a == 1); + BOOST_ASSERT((*opts.optClass)->b == 2); + BOOST_ASSERT(opts.optSeq->size() == 2); + BOOST_ASSERT((*opts.optSeq)[0]->a == 3); + BOOST_ASSERT((*opts.optSeq)[0]->b == 4); + BOOST_ASSERT((*opts.optSeq)[1]->a == 5); + BOOST_ASSERT((*opts.optSeq)[1]->b == 6); + BOOST_ASSERT(opts.optDict); + BOOST_ASSERT(opts.optDict->size() == 2); + BOOST_ASSERT(opts.optDict->find(1) == opts.optDict->end()); + BOOST_ASSERT(opts.optDict->find(10) != opts.optDict->end()); + BOOST_ASSERT(opts.optDict->find(10)->second->a == 11); + BOOST_ASSERT(opts.optDict->find(10)->second->b == 12); + BOOST_ASSERT(opts.optDict->find(13) != opts.optDict->end()); + BOOST_ASSERT(opts.optDict->find(13)->second->a == 14); + BOOST_ASSERT(opts.optDict->find(13)->second->b == 15); +} + int main(int, char ** argv) { @@ -26,8 +82,9 @@ main(int, char ** argv) fs::create_directory(tmp); // Execute - TestModule::BuiltInsPtr p(new TestModule::BuiltIns()); - Slicer::Serialize<Slicer::Xml>(p, tmp / "out.xml"); + verify<TestModule::BuiltIns, Slicer::Xml>(root, tmp, "builtins.xml"); + verify<TestModule::Optionals, Slicer::Xml>(root, tmp, "optionals-notset.xml", checkOptionals_notset); + verify<TestModule::Optionals, Slicer::Xml>(root, tmp, "optionals-areset.xml", checkOptionals_areset); return 0; } diff --git a/slicer/xml/serializer.cpp b/slicer/xml/serializer.cpp index 0a065d8..1ff6058 100644 --- a/slicer/xml/serializer.cpp +++ b/slicer/xml/serializer.cpp @@ -206,7 +206,7 @@ namespace Slicer { if (name[0] == '@') { mp->GetValue(new XmlAttributeValueTarget(n, name.substr(1))); } - else { + else if (mp) { auto element = n->add_child(name); mp->GetValue(new XmlContentValueTarget(element)); mp->OnEachChild(boost::bind(&Xml::ModelTreeIterate, element, _1, _2)); |