jsonizer_test.cxx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // jsonizer_test.cxx
  3. // serializer-test
  4. //
  5. // Created by Sam Jaffe on 3/16/23.
  6. //
  7. #include "xcode_gtest_helper.h"
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <serializer/jsonizer.tpp>
  12. #define CONCAT2(A, B) A##B
  13. #define CONCAT(A, B) CONCAT2(A, B)
  14. #define EXPECT_ROUNDTRIP(izer, value, as_json) \
  15. Json::Value CONCAT(json_, __LINE__) = izer.to_json(value); \
  16. EXPECT_THAT(CONCAT(json_, __LINE__), as_json); \
  17. EXPECT_THAT(izer.from_json<decltype(value)>(CONCAT(json_, __LINE__)), value)
  18. using std::operator""s;
  19. using std::operator""sv;
  20. using namespace magic_enum::bitwise_operators;
  21. enum class Color { RED, BLUE, GREEN };
  22. enum class Mask { LEFT = 1, RIGHT = 2 };
  23. Json::Value operator""_json(char const * str, size_t len) {
  24. Json::Value rval;
  25. Json::Reader reader;
  26. if (!reader.parse(str, str + len, rval)) {
  27. throw std::invalid_argument(reader.getFormattedErrorMessages());
  28. }
  29. return rval;
  30. }
  31. TEST(JsonizerTest, ParsesNumbers) {
  32. serializer::Jsonizer izer;
  33. EXPECT_ROUNDTRIP(izer, 1.5f, "1.5"_json);
  34. EXPECT_ROUNDTRIP(izer, 1.5, "1.5"_json);
  35. EXPECT_ROUNDTRIP(izer, 3, "3"_json);
  36. EXPECT_ROUNDTRIP(izer, true, "true"_json);
  37. }
  38. TEST(JsonizerTest, ParsesStrings) {
  39. serializer::Jsonizer izer;
  40. EXPECT_ROUNDTRIP(izer, "hello"s, "\"hello\""_json);
  41. EXPECT_THAT(izer.to_json("hello"), "\"hello\""_json);
  42. EXPECT_THAT(izer.to_json("hello"sv), "\"hello\""_json);
  43. }
  44. TEST(JsonizerTest, ParsesEnums) {
  45. serializer::Jsonizer izer;
  46. EXPECT_ROUNDTRIP(izer, Color::RED, "\"RED\""_json);
  47. EXPECT_TRUE(magic_enum::detail::is_flags_v<Mask>);
  48. EXPECT_ROUNDTRIP(izer, Mask::LEFT | Mask::RIGHT, "\"LEFT|RIGHT\""_json);
  49. }
  50. TEST(JsonizerTest, ParsesTuples) {
  51. serializer::Jsonizer izer;
  52. EXPECT_ROUNDTRIP(izer, std::make_pair(1, true), "[1, true]"_json);
  53. EXPECT_ROUNDTRIP(izer, std::make_tuple(1, true, 1.5, "hi"s),
  54. "[1, true, 1.5, \"hi\"]"_json);
  55. }
  56. TEST(JsonizerTest, ParsesCollection) {
  57. serializer::Jsonizer izer;
  58. EXPECT_ROUNDTRIP(izer, std::vector({1, 2, 3, 1}), "[1, 2, 3, 1]"_json);
  59. EXPECT_ROUNDTRIP(izer, std::set({1, 2, 3, 1}), "[1, 2, 3]"_json);
  60. }
  61. TEST(JsonizerTest, ParsesAssociative) {
  62. serializer::Jsonizer izer;
  63. EXPECT_ROUNDTRIP(izer, (std::map<int, int>{{1, 2}, {3, 1}}),
  64. "{\"1\":2, \"3\":1}"_json);
  65. std::map<int, int> ex;
  66. izer.from_json(ex, "[[1, 2], [3, 1]]"_json);
  67. EXPECT_THAT(ex, (std::map<int, int>{{1, 2}, {3, 1}}));
  68. }