From abd7f486a0fb34320e3afae6780677cfd4ff85cc Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 25 Apr 2021 19:19:28 +0100 Subject: Erring toward complete JSON loader --- test/test-persistance.cpp | 144 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 122 insertions(+), 22 deletions(-) (limited to 'test/test-persistance.cpp') 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 #include #include +#include #include #include +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 poss; std::vector>> nest; std::unique_ptr ptr; + std::unique_ptr aptr; + std::vector> 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); - std::stringstream ss {input}; - Persistanace::JsonParsePersistance jlps {ss}; - std::unique_ptr to; - jlps.loadState(to); + Persistanace::Persistable::addFactory("SubObject", std::make_unique); +} + +struct JPP : public Persistanace::JsonParsePersistance { + template + T + load_json(const char * path) + { + BOOST_TEST_CONTEXT(path) { + std::ifstream ss {path}; + auto to = loadState(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>(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>(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>(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>(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>(FIXTURESDIR "json/implicit_abs.json"), std::runtime_error); +} + +BOOST_FIXTURE_TEST_CASE(fail_empty_abs_object, JPP) +{ + BOOST_CHECK_THROW(load_json>(FIXTURESDIR "json/empty_abs.json"), std::runtime_error); +} + +BOOST_FIXTURE_TEST_CASE(load_abs_object, JPP) +{ + auto to = load_json>(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(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>(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()); +} -- cgit v1.2.3