|
|
@@ -7,5 +7,77 @@
|
|
|
|
|
|
#include "xcode_gtest_helper.h"
|
|
|
|
|
|
+#include <map>
|
|
|
+#include <set>
|
|
|
+#include <vector>
|
|
|
+
|
|
|
#include <serializer/jsonizer.tpp>
|
|
|
|
|
|
+#define CONCAT2(A, B) A##B
|
|
|
+#define CONCAT(A, B) CONCAT2(A, B)
|
|
|
+
|
|
|
+#define EXPECT_ROUNDTRIP(izer, value, as_json) \
|
|
|
+ Json::Value CONCAT(json_, __LINE__) = izer.to_json(value); \
|
|
|
+ EXPECT_THAT(CONCAT(json_, __LINE__), as_json); \
|
|
|
+ EXPECT_THAT(izer.from_json<decltype(value)>(CONCAT(json_, __LINE__)), value)
|
|
|
+
|
|
|
+using std::operator""s;
|
|
|
+using std::operator""sv;
|
|
|
+using namespace magic_enum::bitwise_operators;
|
|
|
+
|
|
|
+enum class Color { RED, BLUE, GREEN };
|
|
|
+enum class Mask { LEFT = 1, RIGHT = 2 };
|
|
|
+
|
|
|
+Json::Value operator""_json(char const *str, size_t len) {
|
|
|
+ Json::Value rval;
|
|
|
+ Json::Reader reader;
|
|
|
+ if (!reader.parse(str, str + len, rval)) {
|
|
|
+ throw std::invalid_argument(reader.getFormattedErrorMessages());
|
|
|
+ }
|
|
|
+ return rval;
|
|
|
+}
|
|
|
+
|
|
|
+TEST(JsonizerTest, ParsesNumbers) {
|
|
|
+ serializer::Jsonizer izer;
|
|
|
+ EXPECT_ROUNDTRIP(izer, 1.5f, "1.5"_json);
|
|
|
+ EXPECT_ROUNDTRIP(izer, 1.5, "1.5"_json);
|
|
|
+ EXPECT_ROUNDTRIP(izer, 3, "3"_json);
|
|
|
+ EXPECT_ROUNDTRIP(izer, true, "true"_json);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(JsonizerTest, ParsesStrings) {
|
|
|
+ serializer::Jsonizer izer;
|
|
|
+ EXPECT_ROUNDTRIP(izer, "hello"s, "\"hello\""_json);
|
|
|
+ EXPECT_THAT(izer.to_json("hello"), "\"hello\""_json);
|
|
|
+ EXPECT_THAT(izer.to_json("hello"sv), "\"hello\""_json);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(JsonizerTest, ParsesEnums) {
|
|
|
+ serializer::Jsonizer izer;
|
|
|
+ EXPECT_ROUNDTRIP(izer, Color::RED, "\"RED\""_json);
|
|
|
+ EXPECT_TRUE(magic_enum::detail::is_flags_v<Mask>);
|
|
|
+ EXPECT_ROUNDTRIP(izer, Mask::LEFT | Mask::RIGHT, "\"LEFT|RIGHT\""_json);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(JsonizerTest, ParsesTuples) {
|
|
|
+ serializer::Jsonizer izer;
|
|
|
+ EXPECT_ROUNDTRIP(izer, std::make_pair(1, true), "[1, true]"_json);
|
|
|
+ EXPECT_ROUNDTRIP(izer, std::make_tuple(1, true, 1.5, "hi"s),
|
|
|
+ "[1, true, 1.5, \"hi\"]"_json);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(JsonizerTest, ParsesCollection) {
|
|
|
+ serializer::Jsonizer izer;
|
|
|
+ EXPECT_ROUNDTRIP(izer, std::vector({1, 2, 3, 1}), "[1, 2, 3, 1]"_json);
|
|
|
+ EXPECT_ROUNDTRIP(izer, std::set({1, 2, 3, 1}), "[1, 2, 3]"_json);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(JsonizerTest, ParsesAssociative) {
|
|
|
+ serializer::Jsonizer izer;
|
|
|
+ EXPECT_ROUNDTRIP(izer, (std::map<int, int>{{1, 2}, {3, 1}}),
|
|
|
+ "{\"1\":2, \"3\":1}"_json);
|
|
|
+
|
|
|
+ std::map<int, int> ex;
|
|
|
+ izer.from_json(ex, "[[1, 2], [3, 1]]"_json);
|
|
|
+ EXPECT_THAT(ex, (std::map<int, int>{{1, 2}, {3, 1}}));
|
|
|
+}
|