#include "framework.test.h" #include #include #include #include #include "wire/traits.h" #include "wire/json/base.h" #include "wire/json/read.h" #include "wire/json/write.h" #include "wire/vector.h" #include "wire/wrapper/array.h" #include "wire/wrappers_impl.h" #include "wire/base.test.h" namespace { constexpr const char basic_string[] = u8"my_string_data"; constexpr const char basic_json[] = u8"{\"utf8\":\"my_string_data\",\"vec\":[0,127],\"data\":\"00ff2211\",\"choice\":true}"; template struct basic_object { std::string utf8; std::vector vec; lws_test::small_blob data; bool choice; }; template void basic_object_map(F& format, T& self) { using max_vec = wire::max_element_count<100>; wire::object(format, WIRE_FIELD(utf8), WIRE_FIELD_ARRAY(vec, max_vec), WIRE_FIELD(data), WIRE_FIELD(choice)); } template void read_bytes(wire::json_reader& source, basic_object& dest) { basic_object_map(source, dest); } template void write_bytes(wire::json_writer& dest, const basic_object& source) { basic_object_map(dest, source); } template void test_basic_reading(lest::env& lest_env) { SETUP("Basic values with " + boost::core::demangle(typeid(T).name()) + " integers") { basic_object result{}; EXPECT(!wire::json::from_bytes(std::string{basic_json}, result)); EXPECT(result.utf8 == basic_string); { const std::vector expected{0, 127}; EXPECT(result.vec == expected); } EXPECT(result.data == lws_test::blob_test1); EXPECT(result.choice); } } template void test_basic_writing(lest::env& lest_env) { SETUP("Basic values with " + boost::core::demangle(typeid(T).name()) + " integers") { const basic_object val{basic_string, std::vector{0, 127}, lws_test::blob_test1, true}; epee::byte_slice result{}; EXPECT(!wire::json::to_bytes(result, val)); EXPECT(boost::range::equal(result, std::string{basic_json})); } } } LWS_CASE("wire::json_reader") { using i64_limit = std::numeric_limits; static constexpr const char negative_number[] = "-1"; test_basic_reading(lest_env); test_basic_reading(lest_env); test_basic_reading(lest_env); test_basic_reading(lest_env); test_basic_reading(lest_env); test_basic_reading(lest_env); test_basic_reading(lest_env); test_basic_reading(lest_env); static_assert(0 < i64_limit::max(), "expected 0 < int64_t::max"); static_assert( i64_limit::max() <= std::numeric_limits::max(), "expected int64_t::max <= uintmax_t::max" ); std::uint64_t one = 0; std::int64_t two = 0; std::string big_number = std::to_string(std::uintmax_t(i64_limit::max()) + 1); EXPECT(wire::json::from_bytes(negative_number, one) == wire::error::schema::larger_integer); EXPECT(wire::json::from_bytes(std::move(big_number), two) == wire::error::schema::smaller_integer); } LWS_CASE("wire::json_writer") { test_basic_writing(lest_env); test_basic_writing(lest_env); test_basic_writing(lest_env); test_basic_writing(lest_env); test_basic_writing(lest_env); test_basic_writing(lest_env); test_basic_writing(lest_env); test_basic_writing(lest_env); }