summaryrefslogtreecommitdiff
path: root/test/test-persistance.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-04-25 19:19:28 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2021-11-07 16:41:37 +0000
commitabd7f486a0fb34320e3afae6780677cfd4ff85cc (patch)
treef2633cc76e78e35300a7dafdf3bce1bd8bcf2b7b /test/test-persistance.cpp
parentRemove spare semi colons (diff)
downloadilt-abd7f486a0fb34320e3afae6780677cfd4ff85cc.tar.bz2
ilt-abd7f486a0fb34320e3afae6780677cfd4ff85cc.tar.xz
ilt-abd7f486a0fb34320e3afae6780677cfd4ff85cc.zip
Erring toward complete JSON loader
Diffstat (limited to 'test/test-persistance.cpp')
-rw-r--r--test/test-persistance.cpp144
1 files changed, 122 insertions, 22 deletions
diff --git a/test/test-persistance.cpp b/test/test-persistance.cpp
index 101c2d2..fb90de2 100644
--- a/test/test-persistance.cpp
+++ b/test/test-persistance.cpp
@@ -6,9 +6,38 @@
#include <iosfwd>
#include <jsonParse-persistance.h>
#include <memory>
+#include <stdexcept>
#include <string>
#include <vector>
+struct AbsObject : public Persistanace::Persistable {
+ std::string base;
+
+ void
+ persist(Persistanace::PersistanceStore & store) override
+ {
+ STORE_MEMBER(base);
+ }
+
+ virtual void dummy() const = 0;
+};
+
+struct SubObject : public AbsObject {
+ std::string sub;
+
+ void
+ persist(Persistanace::PersistanceStore & store) override
+ {
+ AbsObject::persist(store);
+ STORE_MEMBER(sub);
+ }
+
+ void
+ dummy() const override
+ {
+ }
+};
+
struct TestObject : public Persistanace::Persistable {
TestObject() = default;
@@ -20,39 +49,44 @@ struct TestObject : public Persistanace::Persistable {
std::vector<glm::vec3> poss;
std::vector<std::vector<std::vector<std::string>>> nest;
std::unique_ptr<TestObject> ptr;
+ std::unique_ptr<AbsObject> aptr;
+ std::vector<std::unique_ptr<TestObject>> vptr;
void
persist(Persistanace::PersistanceStore & store) override
{
STORE_MEMBER(flt) && STORE_MEMBER(str) && STORE_MEMBER(bl) && STORE_MEMBER(pos) && STORE_MEMBER(flts)
- && STORE_MEMBER(poss) && STORE_MEMBER(nest) && STORE_MEMBER(ptr);
+ && STORE_MEMBER(poss) && STORE_MEMBER(nest) && STORE_MEMBER(ptr) && STORE_MEMBER(aptr)
+ && STORE_MEMBER(vptr);
}
};
-const std::string input(R"J({
- "@typeid": "TestObject",
- "flt": 3.14,
- "str": "Lovely string",
- "bl": true,
- "pos": [3.14, 6.28, 1.57],
- "flts": [3.14, 6.28, 1.57, 0, -1, -3.14],
- "poss": [[3.14, 6.28, 1.57], [0, -1, -3.14]],
- "nest": [[["a","b"],["c","d","e"]],[["f"]],[]],
- "ptr": {
- "@typeid": "TestObject",
- "flt": 3.14,
- "str": "Lovely string",
- },
-})J");
-
-BOOST_AUTO_TEST_CASE(load_object)
+BOOST_AUTO_TEST_CASE(setup)
{
Persistanace::Persistable::addFactory("TestObject", std::make_unique<TestObject>);
- std::stringstream ss {input};
- Persistanace::JsonParsePersistance jlps {ss};
- std::unique_ptr<TestObject> to;
- jlps.loadState(to);
+ Persistanace::Persistable::addFactory("SubObject", std::make_unique<SubObject>);
+}
+
+struct JPP : public Persistanace::JsonParsePersistance {
+ template<typename T>
+ T
+ load_json(const char * path)
+ {
+ BOOST_TEST_CONTEXT(path) {
+ std::ifstream ss {path};
+ auto to = loadState<T>(ss);
+ BOOST_CHECK(stk.empty());
+ BOOST_REQUIRE(to);
+ return to;
+ }
+ // Presumably BOOST_TEST_CONTEXT is implemented as an if (...) { }
+ throw std::logic_error("We shouldn't ever get here, but apparently we can!");
+ }
+};
+BOOST_FIXTURE_TEST_CASE(load_object, JPP)
+{
+ auto to = load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/load_object.json");
BOOST_CHECK_CLOSE(to->flt, 3.14, 0.01);
BOOST_CHECK_EQUAL(to->str, "Lovely string");
BOOST_CHECK_EQUAL(to->bl, true);
@@ -84,3 +118,69 @@ BOOST_AUTO_TEST_CASE(load_object)
BOOST_CHECK_CLOSE(to->ptr->flt, 3.14, 0.01);
BOOST_CHECK_EQUAL(to->ptr->str, "Lovely string");
}
+
+BOOST_FIXTURE_TEST_CASE(load_nested_object, JPP)
+{
+ auto to = load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/nested.json");
+ BOOST_CHECK_EQUAL(to->flt, 1.F);
+ BOOST_CHECK_EQUAL(to->str, "one");
+ BOOST_REQUIRE(to->ptr);
+ BOOST_CHECK_EQUAL(to->ptr->flt, 2.F);
+ BOOST_CHECK_EQUAL(to->ptr->str, "two");
+ BOOST_REQUIRE(to->ptr->ptr);
+ BOOST_CHECK_EQUAL(to->ptr->ptr->flt, 3.F);
+ BOOST_CHECK_EQUAL(to->ptr->ptr->str, "three");
+ BOOST_REQUIRE(to->ptr->ptr->ptr);
+ BOOST_CHECK_EQUAL(to->ptr->ptr->ptr->flt, 4.F);
+ BOOST_CHECK_EQUAL(to->ptr->ptr->ptr->str, "four");
+ BOOST_REQUIRE(!to->ptr->ptr->ptr->ptr);
+}
+
+BOOST_FIXTURE_TEST_CASE(load_implicit_object, JPP)
+{
+ auto to = load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/implicit.json");
+ BOOST_CHECK(to->ptr);
+ BOOST_CHECK_EQUAL(to->flt, 1.F);
+ BOOST_CHECK_EQUAL(to->ptr->str, "trigger");
+ BOOST_CHECK_EQUAL(to->str, "after");
+}
+
+BOOST_FIXTURE_TEST_CASE(load_empty_object, JPP)
+{
+ auto to = load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/empty.json");
+ BOOST_CHECK_EQUAL(to->flt, 1.F);
+ BOOST_CHECK(to->ptr);
+ BOOST_CHECK_EQUAL(to->str, "after");
+}
+
+BOOST_FIXTURE_TEST_CASE(fail_implicit_abs_object, JPP)
+{
+ BOOST_CHECK_THROW(load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/implicit_abs.json"), std::runtime_error);
+}
+
+BOOST_FIXTURE_TEST_CASE(fail_empty_abs_object, JPP)
+{
+ BOOST_CHECK_THROW(load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/empty_abs.json"), std::runtime_error);
+}
+
+BOOST_FIXTURE_TEST_CASE(load_abs_object, JPP)
+{
+ auto to = load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/abs.json");
+ BOOST_REQUIRE(to->aptr);
+ BOOST_CHECK_NO_THROW(to->aptr->dummy());
+ BOOST_CHECK_EQUAL(to->aptr->base, "set base");
+ auto s = dynamic_cast<SubObject *>(to->aptr.get());
+ BOOST_REQUIRE(s);
+ BOOST_CHECK_EQUAL(s->sub, "set sub");
+}
+
+BOOST_FIXTURE_TEST_CASE(load_vector_ptr, JPP)
+{
+ auto to = load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/vector_ptr.json");
+ BOOST_CHECK(to->str.empty());
+ BOOST_CHECK_EQUAL(to->vptr.size(), 4);
+ BOOST_CHECK_EQUAL(to->vptr.at(0)->str, "type");
+ BOOST_CHECK_CLOSE(to->vptr.at(1)->flt, 3.14, .01);
+ BOOST_CHECK(!to->vptr.at(2));
+ BOOST_CHECK(to->vptr.at(3)->str.empty());
+}