summaryrefslogtreecommitdiff
path: root/test/test-persistence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/test-persistence.cpp')
-rw-r--r--test/test-persistence.cpp213
1 files changed, 213 insertions, 0 deletions
diff --git a/test/test-persistence.cpp b/test/test-persistence.cpp
new file mode 100644
index 0000000..d5910e9
--- /dev/null
+++ b/test/test-persistence.cpp
@@ -0,0 +1,213 @@
+#define BOOST_TEST_MODULE test_persistence
+
+#include <boost/test/unit_test.hpp>
+
+#include <glm/glm.hpp>
+#include <iosfwd>
+#include <jsonParse-persistence.h>
+#include <memory>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+struct AbsObject : public Persistence::Persistable {
+ std::string base;
+
+ bool
+ persist(Persistence::PersistenceStore & store) override
+ {
+ return STORE_TYPE && STORE_MEMBER(base);
+ }
+
+ virtual void dummy() const = 0;
+};
+
+struct SubObject : public AbsObject {
+ std::string sub;
+
+ bool
+ persist(Persistence::PersistenceStore & store) override
+ {
+ return AbsObject::persist(store) && STORE_TYPE && STORE_MEMBER(sub);
+ }
+
+ void
+ dummy() const override
+ {
+ }
+};
+
+struct TestObject : public Persistence::Persistable {
+ TestObject() = default;
+
+ float flt {};
+ std::string str {};
+ bool bl {};
+ glm::vec3 pos {};
+ std::vector<float> flts;
+ 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;
+
+ bool
+ persist(Persistence::PersistenceStore & store) override
+ {
+ return STORE_TYPE && 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(aptr) && STORE_MEMBER(vptr);
+ }
+};
+
+struct JPP : public Persistence::JsonParsePersistence {
+ template<typename T>
+ T
+ load_json(const char * path)
+ {
+ BOOST_TEST_CONTEXT(path) {
+ std::ifstream ss {path};
+ auto to = loadState<T>(ss);
+ Persistence::sharedObjects.clear();
+ 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);
+ BOOST_CHECK_CLOSE(to->pos[0], 3.14, 0.01);
+ BOOST_CHECK_CLOSE(to->pos[1], 6.28, 0.01);
+ BOOST_CHECK_CLOSE(to->pos[2], 1.57, 0.01);
+ BOOST_REQUIRE_EQUAL(to->flts.size(), 6);
+ BOOST_CHECK_CLOSE(to->flts[0], 3.14, 0.01);
+ BOOST_CHECK_CLOSE(to->flts[1], 6.28, 0.01);
+ BOOST_CHECK_CLOSE(to->flts[2], 1.57, 0.01);
+ BOOST_CHECK_CLOSE(to->flts[3], 0, 0.01);
+ BOOST_CHECK_CLOSE(to->flts[4], -1, 0.01);
+ BOOST_CHECK_CLOSE(to->flts[5], -3.14, 0.01);
+ BOOST_REQUIRE_EQUAL(to->poss.size(), 2);
+ BOOST_CHECK_CLOSE(to->poss[0][0], 3.14, 0.01);
+ BOOST_CHECK_CLOSE(to->poss[0][1], 6.28, 0.01);
+ BOOST_CHECK_CLOSE(to->poss[0][2], 1.57, 0.01);
+ BOOST_CHECK_CLOSE(to->poss[1][0], 0, 0.01);
+ BOOST_CHECK_CLOSE(to->poss[1][1], -1, 0.01);
+ BOOST_CHECK_CLOSE(to->poss[1][2], -3.14, 0.01);
+ BOOST_REQUIRE_EQUAL(to->nest.size(), 3);
+ BOOST_REQUIRE_EQUAL(to->nest.at(0).size(), 2);
+ BOOST_REQUIRE_EQUAL(to->nest.at(0).at(0).size(), 2);
+ BOOST_REQUIRE_EQUAL(to->nest.at(0).at(1).size(), 3);
+ BOOST_REQUIRE_EQUAL(to->nest.at(1).size(), 1);
+ BOOST_REQUIRE_EQUAL(to->nest.at(1).at(0).size(), 1);
+ BOOST_REQUIRE_EQUAL(to->nest.at(2).size(), 0);
+ BOOST_REQUIRE(to->ptr);
+ 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());
+}
+
+struct SharedTestObject : public Persistence::Persistable {
+ SharedTestObject() = default;
+
+ std::shared_ptr<AbsObject> sptr;
+ std::shared_ptr<SubObject> ssptr;
+
+ bool
+ persist(Persistence::PersistenceStore & store) override
+ {
+ return STORE_TYPE && STORE_MEMBER(sptr) && STORE_MEMBER(ssptr);
+ }
+};
+
+BOOST_FIXTURE_TEST_CASE(load_shared_object1, JPP)
+{
+ auto to = load_json<std::unique_ptr<SharedTestObject>>(FIXTURESDIR "json/shared_ptr1.json");
+ BOOST_CHECK(to->sptr);
+ BOOST_CHECK(to->ssptr);
+ BOOST_CHECK_NE(to->sptr, to->ssptr);
+ BOOST_CHECK_EQUAL(to->sptr.use_count(), 1);
+ BOOST_CHECK_EQUAL(to->ssptr.use_count(), 1);
+}
+
+BOOST_FIXTURE_TEST_CASE(load_shared_object2, JPP)
+{
+ auto to = load_json<std::unique_ptr<SharedTestObject>>(FIXTURESDIR "json/shared_ptr2.json");
+ BOOST_CHECK(to->sptr);
+ BOOST_CHECK(to->ssptr);
+ BOOST_CHECK_EQUAL(to->sptr, to->ssptr);
+ BOOST_CHECK_EQUAL(to->sptr.use_count(), 2);
+ BOOST_CHECK_EQUAL(to->ssptr.use_count(), 2);
+}