#include "parselink/msgpack/core/reader.h" #include #include namespace { using namespace boost::ut; namespace format = msgpack::format; template constexpr std::array make_bytes(Bytes&&... bytes) { return {std::byte(std::forward(bytes))...}; } template struct oversized_array { std::array data; std::size_t size; }; constexpr auto to_bytes_array_oversized(auto const& container) { oversized_array arr; std::copy(std::begin(container), std::end(container), std::begin(arr.data)); arr.size = std::distance(std::begin(container), std::end(container)); return arr; } consteval auto generate_bytes(auto callable) { constexpr auto oversized = to_bytes_array_oversized(callable()); std::array out; std::copy(std::begin(oversized.data), std::next(std::begin(oversized.data), oversized.size), std::begin(out)); return out; } template consteval auto cat( std::array const& a, std::array const& b) { std::array out; std::copy(std::begin(a), std::next(std::begin(a), std::size(a)), std::begin(out)); std::copy(std::begin(b), std::next(std::begin(b), std::size(b)), std::next(std::begin(out), std::size(a))); return out; } template constexpr auto zip(T val, Itr begin, Itr end) { std::vector output; for (auto itr = begin; itr != end; ++itr) { output.emplace_back(val); output.emplace_back(*itr); } return output; } template constexpr auto zip(T val, Iterable const& itr) { return zip(val, std::begin(itr), std::end(itr)); } using relaxed_reader = msgpack::reader; } // namespace suite relaxed = [] { "empty span"_test = [] { using error = msgpack::error; std::span bytes; relaxed_reader reader(bytes); auto v = reader.read(); expect(v.error() == error::end_of_message); }; //////////////////////////////////////////////////////////////////////////////// // Unsigned integers //////////////////////////////////////////////////////////////////////////////// "reader::read"_test = [] { using fmt = format::uint8; using error = msgpack::error; /** * All bytes 0x00->0x79 are effectively literal uint8s. */ { constexpr auto payload = make_bytes(0x52, 0xcc, 0x84); relaxed_reader reader(payload); { auto result = reader.read(); expect(result == std::uint8_t(0x52)); } { auto result = reader.read(); expect(result == std::uint8_t(0x84)); } auto result = reader.read(); expect(result == tl::make_unexpected(error::end_of_message)); } }; "reader::read"_test = [] { using fmt = msgpack::format::uint16; using error = msgpack::error; /** * All bytes 0x00->0x79 are effectively literal uint8s. */ { constexpr auto payload = make_bytes(0x52, 0xcc, 0x84, 0xcd, 0xaa, 0xcc); relaxed_reader reader(payload); { auto result = reader.read(); expect(result == std::uint16_t(0x52)); } { auto result = reader.read(); expect(result == std::uint16_t(0x84)); } { auto result = reader.read(); expect(result == std::uint16_t(0xaacc)); } auto result = reader.read(); expect(result == tl::make_unexpected(error::end_of_message)); } }; };