summaryrefslogtreecommitdiff
path: root/test/test-persistence.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-05-01 17:28:44 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2021-11-07 16:41:37 +0000
commitfc8c9a6c7bec176299915c6adab120e1bf2ea4e9 (patch)
tree837426e53f3ec0cd06a6b7c9244c57a7c4229953 /test/test-persistence.cpp
parentFix the fact I've been spelling persistence wrong this whole time (diff)
downloadilt-fc8c9a6c7bec176299915c6adab120e1bf2ea4e9.tar.bz2
ilt-fc8c9a6c7bec176299915c6adab120e1bf2ea4e9.tar.xz
ilt-fc8c9a6c7bec176299915c6adab120e1bf2ea4e9.zip
Lots of test cases, few minor fixes
Diffstat (limited to 'test/test-persistence.cpp')
-rw-r--r--test/test-persistence.cpp62
1 files changed, 57 insertions, 5 deletions
diff --git a/test/test-persistence.cpp b/test/test-persistence.cpp
index d5910e9..6dcb94d 100644
--- a/test/test-persistence.cpp
+++ b/test/test-persistence.cpp
@@ -1,5 +1,6 @@
#define BOOST_TEST_MODULE test_persistence
+#include <boost/test/data/test_case.hpp>
#include <boost/test/unit_test.hpp>
#include <glm/glm.hpp>
@@ -63,7 +64,7 @@ struct TestObject : public Persistence::Persistable {
struct JPP : public Persistence::JsonParsePersistence {
template<typename T>
T
- load_json(const char * path)
+ load_json(const std::filesystem::path & path)
{
BOOST_TEST_CONTEXT(path) {
std::ifstream ss {path};
@@ -147,14 +148,16 @@ BOOST_FIXTURE_TEST_CASE(load_empty_object, JPP)
BOOST_CHECK_EQUAL(to->str, "after");
}
-BOOST_FIXTURE_TEST_CASE(fail_implicit_abs_object, JPP)
+static std::vector<std::filesystem::path>
+fixtures_in(const std::filesystem::path & root)
{
- BOOST_CHECK_THROW(load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/implicit_abs.json"), std::runtime_error);
+ return {std::filesystem::directory_iterator {root}, {}};
}
-BOOST_FIXTURE_TEST_CASE(fail_empty_abs_object, JPP)
+BOOST_DATA_TEST_CASE_F(JPP, various_parse_failures, fixtures_in(FIXTURESDIR "json/bad"), path)
{
- BOOST_CHECK_THROW(load_json<std::unique_ptr<TestObject>>(FIXTURESDIR "json/empty_abs.json"), std::runtime_error);
+ std::ifstream ss {path};
+ BOOST_CHECK_THROW(loadState<std::unique_ptr<TestObject>>(ss), std::runtime_error);
}
BOOST_FIXTURE_TEST_CASE(load_abs_object, JPP)
@@ -211,3 +214,52 @@ BOOST_FIXTURE_TEST_CASE(load_shared_object2, JPP)
BOOST_CHECK_EQUAL(to->sptr.use_count(), 2);
BOOST_CHECK_EQUAL(to->ssptr.use_count(), 2);
}
+
+BOOST_FIXTURE_TEST_CASE(load_shared_object_null, JPP)
+{
+ auto to = load_json<std::unique_ptr<SharedTestObject>>(FIXTURESDIR "json/shared_ptr_null.json");
+ BOOST_CHECK(to->sptr);
+ BOOST_CHECK(!to->ssptr);
+}
+
+using svs = std::tuple<const char * const, std::string_view>;
+BOOST_DATA_TEST_CASE_F(JPP, load_strings,
+ boost::unit_test::data::make<svs>({
+ {R"J("")J", ""},
+ {R"J("non empty")J", "non empty"},
+ {R"J("new\nline")J", "new\nline"},
+ {R"J("quote\"mark")J", "quote\"mark"},
+ {R"J("tab\t")J", "tab\t"},
+ {R"J("back\bspace?")J", "back\bspace?"},
+ {R"J("form\ffeed?")J", "form\ffeed?"},
+ {R"J("forward\/slash")J", "forward/slash"},
+ {R"J("\u00a5 yen")J", "¥ yen"},
+ {R"J("gbp \u00a3")J", "gbp £"},
+ {R"J("\u007E tilde")J", "~ tilde"},
+ {R"J("\u056b ARMENIAN SMALL LETTER INI")J", "ի ARMENIAN SMALL LETTER INI"},
+ {R"J("\u0833 SAMARITAN PUNCTUATION BAU")J", "࠳ SAMARITAN PUNCTUATION BAU"},
+ }),
+ in, exp)
+{
+ std::stringstream str {in};
+ BOOST_CHECK_EQUAL(loadState<std::string>(str), exp);
+}
+
+using cpstr = std::tuple<unsigned long, std::string_view>;
+BOOST_DATA_TEST_CASE(utf8_decode,
+ boost::unit_test::data::make<cpstr>({
+ {9, "\t"},
+ {0x00010000, "𐀀"},
+ }),
+ cp, str)
+{
+ std::string out;
+ BOOST_CHECK_NO_THROW(json::jsonParser::appendEscape(cp, out));
+ BOOST_CHECK_EQUAL(out, str);
+}
+
+BOOST_DATA_TEST_CASE(utf8_decode_bad, boost::unit_test::data::make<unsigned long>({0xd800, 0xdfff, 0x110000}), cp)
+{
+ std::string out;
+ BOOST_CHECK_THROW(json::jsonParser::appendEscape(cp, out), std::runtime_error);
+}