#include #include "../c++/json.hpp" #include namespace { namespace schema { using namespace saw::schema; using TestTuple = Tuple< String, Int32 >; using TestArray = Array< String, 1 >; using TestMultiArray = Array< String, 3 >; using TestStruct = Struct< Member, Member >; using TestArrayStruct = Array; using TestStructArrayStruct = Struct< Member >; } SAW_TEST("UInt8 write"){ using namespace saw; data native_int; data json_int; native_int.set(121); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "121"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("UInt16 write"){ using namespace saw; data native_int; data json_int; native_int.set(24413); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "24413"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("UInt32 write"){ using namespace saw; data native_int; data json_int; native_int.set(44123); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "44123"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("UInt64 write"){ using namespace saw; data native_int; data json_int; native_int.set(243345543); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "243345543"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("Int8 write"){ using namespace saw; data native_int; data json_int; native_int.set(-121); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "-121"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("Int16 write"){ using namespace saw; data native_int; data json_int; native_int.set(-24413); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "-24413"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("Int32 write"){ using namespace saw; data native_int; data json_int; native_int.set(44123); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "44123"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("Int64 write"){ using namespace saw; data native_int; data json_int; native_int.set(243345543); codec json_codec; error_or eov = json_codec.encode(native_int, json_int); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_v = "243345543"; std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT( enc_val == str_v, std::string{"Value is not being encoded correctly. Encoded: "} + enc_val ); } SAW_TEST("String write and read"){ using namespace saw; data nat_str; data json_str; nat_str.set("foo"); codec codec; error_or eov = codec.encode(nat_str, json_str); SAW_EXPECT(eov.is_value(), "Encoding error"); /** * Currently doing this manually. Technically I should convert to std::string for tests */ std::string_view str_view = "\"foo\""; std::string encoded_value = convert_to_string(json_str.get_buffer()); SAW_EXPECT(encoded_value == str_view, "String not encoded correctly"); nat_str = {}; eov = codec.decode(json_str, nat_str); SAW_EXPECT(eov.is_value(), "Decoding error"); SAW_EXPECT(nat_str == "foo", "Incorrect value decoded"); } SAW_TEST("Tuple read and write"){ using namespace saw; data native_tup; data json_tup; auto& nat_zero = native_tup.template get<0>(); auto& nat_one = native_tup.template get<1>(); nat_zero.set("bar"); nat_one.set(34); codec json_codec; error_or eov = json_codec.encode(native_tup, json_tup); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "[\"bar\",34]"; std::string enc_val = convert_to_string(json_tup.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Tuple not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native_tup = {}; eov = json_codec.decode(json_tup, native_tup); SAW_EXPECT(eov.is_value(), "Decoding error"); SAW_EXPECT(native_tup.template get<0>() == "bar", "Invalid Value 0"); SAW_EXPECT(native_tup.template get<1>().get() == 34, "Invalid Value 1"); } SAW_TEST("Array write"){ using namespace saw; data native{3u}; data json; native.at(0).set("foo"); native.at(1).set("bar"); native.at(2).set("baz"); codec json_codec; error_or eov = json_codec.encode(native, json); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "[\"foo\",\"bar\",\"baz\"]"; std::string enc_val = convert_to_string(json.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Array not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); } SAW_TEST("Three Dim Array write and read"){ using namespace saw; data native{2,1,2}; data json; native.at(0,0,0).set("multi"); native.at(0,0,1).set("baz"); native.at(1,0,0).set("foo"); native.at(1,0,1).set("bar"); codec codec; error_or eov = codec.encode(native, json); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "[[[\"multi\",\"baz\"]],[[\"foo\",\"bar\"]]]"; std::string enc_val = convert_to_string(json.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Array not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native = {}; eov = codec.decode(json, native); SAW_EXPECT(eov.is_value(), "Decoding error"); SAW_EXPECT(native.at(0,0,0) == "multi", "Invalid Value at 0,0,0"); SAW_EXPECT(native.at(0,0,1) == "baz", "Invalid Value at 0,0,1"); SAW_EXPECT(native.at(1,0,0) == "foo", "Invalid Value at 1,0,0"); SAW_EXPECT(native.at(1,0,1) == "bar", "Invalid Value at 1,0,1"); } SAW_TEST("Struct read and write"){ using namespace saw; data native; data json; native.get<"foo">().set(5); native.get<"bar">().set("baz"); codec json_codec; error_or eov = json_codec.encode(native, json); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "{\"foo\":5,\"bar\":\"baz\"}"; std::string enc_val = convert_to_string(json.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Struct not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native = {}; eov = json_codec.decode(json, native); SAW_EXPECT(eov.is_value(), "Decoding error"); SAW_EXPECT(native.get<"foo">().get() == 5, "Invalid value for foo"); SAW_EXPECT(native.get<"bar">() == "baz", "Invalid value for bar"); } SAW_TEST("Array Struct Empty read and write"){ using namespace saw; data native{0u}; data json; codec json_codec; error_or eov = json_codec.encode(native, json); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "[]"; std::string enc_val = convert_to_string(json.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Struct not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native = {}; eov = json_codec.decode(json, native); SAW_EXPECT(eov.is_value(), "Decoding error"); } SAW_TEST("Array Struct read and write"){ using namespace saw; data native{4u}; data json; native.at(0).get<"foo">().set(5); native.at(0).get<"bar">().set("baz"); native.at(1).get<"foo">().set(6); native.at(1).get<"bar">().set("baz1"); native.at(2).get<"foo">().set(326); native.at(2).get<"bar">().set("baz12"); codec json_codec; error_or eov = json_codec.encode(native, json); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "[{\"foo\":5,\"bar\":\"baz\"},{\"foo\":6,\"bar\":\"baz1\"},{\"foo\":326,\"bar\":\"baz12\"},{\"foo\":0,\"bar\":\"\"}]"; std::string enc_val = convert_to_string(json.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Struct not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native = {}; eov = json_codec.decode(json, native); SAW_EXPECT(eov.is_value(), "Decoding error"); } SAW_TEST("Struct Array Struct read and write"){ using namespace saw; data native; native.template get<"banana">() = {4u}; data json; native.template get<"banana">().at(0).get<"foo">().set(5); native.template get<"banana">().at(0).get<"bar">().set("baz"); native.template get<"banana">().at(1).get<"foo">().set(6); native.template get<"banana">().at(1).get<"bar">().set("baz1"); native.template get<"banana">().at(2).get<"foo">().set(326); native.template get<"banana">().at(2).get<"bar">().set("baz12"); codec json_codec; error_or eov = json_codec.encode(native, json); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "{\"banana\":[{\"foo\":5,\"bar\":\"baz\"},{\"foo\":6,\"bar\":\"baz1\"},{\"foo\":326,\"bar\":\"baz12\"},{\"foo\":0,\"bar\":\"\"}]}"; std::string enc_val = convert_to_string(json.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Struct not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native = {}; eov = json_codec.decode(json, native); SAW_EXPECT(eov.is_value(), "Decoding error"); } SAW_TEST("Int8 read"){ using namespace saw; data native_int; data json_int{"43"}; codec json_codec; error_or eov = json_codec.decode(json_int, native_int); std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT(eov.is_value(), std::string{"Encoding error: "} + enc_val); /** * Currently doing this manually. Technically I should convert to std::string for tests */ typename native_data_type::type dec_val = 43; SAW_EXPECT( dec_val == native_int.get(), std::string{"Value is not being encoded correctly. Encoded: "} + std::to_string(static_cast(native_int.get()))); } SAW_TEST("Int64 read"){ using namespace saw; data native_int; data json_int{"-453"}; codec json_codec; error_or eov = json_codec.decode(json_int, native_int); std::string enc_val = convert_to_string(json_int.get_buffer()); SAW_EXPECT(eov.is_value(), std::string{"Encoding error: "} + enc_val); /** * Currently doing this manually. Technically I should convert to std::string for tests */ typename native_data_type::type dec_val = -453; SAW_EXPECT( dec_val == native_int.get(), std::string{"Value is not being encoded correctly. Encoded: "} + std::to_string(static_cast(native_int.get()))); } SAW_TEST("Tuple Pretty Encode and Decode"){ using namespace saw; data native_tup; data json_tup; auto& nat_zero = native_tup.template get<0>(); auto& nat_one = native_tup.template get<1>(); nat_zero.set("bar"); nat_one.set(34); codec_config json_config; json_config.pretty = true; codec json_codec{json_config}; error_or eov = json_codec.encode(native_tup, json_tup); SAW_EXPECT(eov.is_value(), "Encoding error"); std::string_view str_v = "[\n\t\"bar\",\n\t34\n]"; std::string enc_val = convert_to_string(json_tup.get_buffer()); SAW_EXPECT(enc_val == str_v, std::string{"Tuple not encoded correctly. Encoded: "} + enc_val + std::string{" Expected: "} + std::string{str_v}); native_tup = {}; eov = json_codec.decode(json_tup, native_tup); SAW_EXPECT(eov.is_value(), "Decoding error"); SAW_EXPECT(native_tup.template get<0>() == "bar", "Invalid Value 0"); SAW_EXPECT(native_tup.template get<1>().get() == 34, "Invalid Value 1"); } }