add more tests to cover the new bjdata types

This commit is contained in:
Qianqian Fang 2022-02-17 23:49:24 -05:00
parent 4985323bb7
commit 55682ffb5a
3 changed files with 166 additions and 58 deletions

View File

@ -1890,17 +1890,17 @@ class binary_reader
{
case 'u':
{
uint16_t len;
uint16_t len{};
return get_number(input_format, len) && get_string(input_format, len, result);
}
case 'm':
{
uint32_t len;
uint32_t len{};
return get_number(input_format, len) && get_string(input_format, len, result);
}
case 'M':
{
uint64_t len;
uint64_t len{};
return get_number(input_format, len) && get_string(input_format, len, result);
}
}
@ -1918,7 +1918,7 @@ class binary_reader
bool get_ubjson_ndarray_size(std::vector<size_t>& dim)
{
std::pair<std::size_t, char_int_type> size_and_type;
size_t dimlen;
size_t dimlen = 0;
bool is_optimized = get_ubjson_size_type(size_and_type);
@ -1934,10 +1934,7 @@ class binary_reader
{
return false;
}
else
{
dim.push_back(dimlen);
}
dim.push_back(dimlen);
}
}
}
@ -1949,10 +1946,7 @@ class binary_reader
{
return false;
}
else
{
dim.push_back(dimlen);
}
dim.push_back(dimlen);
}
}
}
@ -1964,10 +1958,7 @@ class binary_reader
{
return false;
}
else
{
dim.push_back(dimlen);
}
dim.push_back(dimlen);
get_ignore_noop();
}
}
@ -1978,7 +1969,7 @@ class binary_reader
@param[out] result determined size
@return whether size determination completed
*/
bool get_ubjson_size_value(std::size_t& result, int prefix = 0)
bool get_ubjson_size_value(std::size_t& result, char_int_type prefix = 0)
{
if (prefix == 0)
{
@ -2050,7 +2041,7 @@ class binary_reader
{
case 'u':
{
uint16_t number;
uint16_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
{
return false;
@ -2060,7 +2051,7 @@ class binary_reader
}
case 'm':
{
uint32_t number;
uint32_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
{
return false;
@ -2070,7 +2061,7 @@ class binary_reader
}
case 'M':
{
uint64_t number;
uint64_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
{
return false;
@ -2085,13 +2076,10 @@ class binary_reader
{
return false;
}
else
result = 1;
for (auto i : dim)
{
result = 1;
for (std::size_t i = 0; i < dim.size(); ++i)
{
result *= dim.at(i);
}
result *= i;
}
return true;
}
@ -2256,17 +2244,17 @@ class binary_reader
case 'u':
{
uint16_t number;
return get_number(input_format, number) && sax->number_integer(number);
return get_number(input_format, number) && sax->number_unsigned(number);
}
case 'm':
{
uint32_t number;
return get_number(input_format, number) && sax->number_integer(number);
return get_number(input_format, number) && sax->number_unsigned(number);
}
case 'M':
{
uint64_t number;
return get_number(input_format, number) && sax->number_integer(number);
return get_number(input_format, number) && sax->number_unsigned(number);
}
case 'h':
{

View File

@ -10266,17 +10266,17 @@ class binary_reader
{
case 'u':
{
uint16_t len;
uint16_t len{};
return get_number(input_format, len) && get_string(input_format, len, result);
}
case 'm':
{
uint32_t len;
uint32_t len{};
return get_number(input_format, len) && get_string(input_format, len, result);
}
case 'M':
{
uint64_t len;
uint64_t len{};
return get_number(input_format, len) && get_string(input_format, len, result);
}
}
@ -10294,7 +10294,7 @@ class binary_reader
bool get_ubjson_ndarray_size(std::vector<size_t>& dim)
{
std::pair<std::size_t, char_int_type> size_and_type;
size_t dimlen;
size_t dimlen = 0;
bool is_optimized = get_ubjson_size_type(size_and_type);
@ -10310,10 +10310,7 @@ class binary_reader
{
return false;
}
else
{
dim.push_back(dimlen);
}
dim.push_back(dimlen);
}
}
}
@ -10325,10 +10322,7 @@ class binary_reader
{
return false;
}
else
{
dim.push_back(dimlen);
}
dim.push_back(dimlen);
}
}
}
@ -10340,10 +10334,7 @@ class binary_reader
{
return false;
}
else
{
dim.push_back(dimlen);
}
dim.push_back(dimlen);
get_ignore_noop();
}
}
@ -10354,7 +10345,7 @@ class binary_reader
@param[out] result determined size
@return whether size determination completed
*/
bool get_ubjson_size_value(std::size_t& result, int prefix = 0)
bool get_ubjson_size_value(std::size_t& result, char_int_type prefix = 0)
{
if (prefix == 0)
{
@ -10426,7 +10417,7 @@ class binary_reader
{
case 'u':
{
uint16_t number;
uint16_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
{
return false;
@ -10436,7 +10427,7 @@ class binary_reader
}
case 'm':
{
uint32_t number;
uint32_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
{
return false;
@ -10446,7 +10437,7 @@ class binary_reader
}
case 'M':
{
uint64_t number;
uint64_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
{
return false;
@ -10461,13 +10452,10 @@ class binary_reader
{
return false;
}
else
result = 1;
for (auto i : dim)
{
result = 1;
for (std::size_t i = 0; i < dim.size(); ++i)
{
result *= dim.at(i);
}
result *= i;
}
return true;
}
@ -10632,17 +10620,17 @@ class binary_reader
case 'u':
{
uint16_t number;
return get_number(input_format, number) && sax->number_integer(number);
return get_number(input_format, number) && sax->number_unsigned(number);
}
case 'm':
{
uint32_t number;
return get_number(input_format, number) && sax->number_integer(number);
return get_number(input_format, number) && sax->number_unsigned(number);
}
case 'M':
{
uint64_t number;
return get_number(input_format, number) && sax->number_integer(number);
return get_number(input_format, number) && sax->number_unsigned(number);
}
case 'h':
{

View File

@ -636,6 +636,54 @@ TEST_CASE("BJData")
CHECK(json::from_bjdata(result, true, false) == j);
}
}
SECTION("9223372036854775808..18446744073709551615 (uint64)")
{
std::vector<uint64_t> v = {9223372036854775808ull, 18446744073709551615ull};
for (uint64_t i : v)
{
CAPTURE(i)
// create JSON value with integer number
json j = i;
// check type
CHECK(j.is_number_unsigned());
// create expected byte vector
std::vector<uint8_t> expected;
expected.push_back('M');
expected.push_back(static_cast<uint8_t>(i & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
// compare result + size
const auto result = json::to_bjdata(j);
CHECK(result == expected);
CHECK(result.size() == 9);
// check individual bytes
CHECK(result[0] == 'M');
uint64_t restored = (static_cast<uint64_t>(result[8]) << 070) +
(static_cast<uint64_t>(result[7]) << 060) +
(static_cast<uint64_t>(result[6]) << 050) +
(static_cast<uint64_t>(result[5]) << 040) +
(static_cast<uint64_t>(result[4]) << 030) +
(static_cast<uint64_t>(result[3]) << 020) +
(static_cast<uint64_t>(result[2]) << 010) +
static_cast<uint64_t>(result[1]);
CHECK(restored == i);
// roundtrip
CHECK(json::from_bjdata(result) == j);
CHECK(json::from_bjdata(result, true, false) == j);
}
}
}
SECTION("unsigned")
@ -2046,22 +2094,31 @@ TEST_CASE("BJData")
std::vector<uint8_t> s_i = {'S', 'i', 1, 'a'};
std::vector<uint8_t> s_U = {'S', 'U', 1, 'a'};
std::vector<uint8_t> s_I = {'S', 'I', 1, 0, 'a'};
std::vector<uint8_t> s_u = {'S', 'u', 1, 0, 'a'};
std::vector<uint8_t> s_l = {'S', 'l', 1, 0, 0, 0, 'a'};
std::vector<uint8_t> s_m = {'S', 'm', 1, 0, 0, 0, 'a'};
std::vector<uint8_t> s_L = {'S', 'L', 1, 0, 0, 0, 0, 0, 0, 0, 'a'};
std::vector<uint8_t> s_M = {'S', 'M', 1, 0, 0, 0, 0, 0, 0, 0, 'a'};
// check if string is parsed correctly to "a"
CHECK(json::from_bjdata(s_i) == "a");
CHECK(json::from_bjdata(s_U) == "a");
CHECK(json::from_bjdata(s_I) == "a");
CHECK(json::from_bjdata(s_u) == "a");
CHECK(json::from_bjdata(s_l) == "a");
CHECK(json::from_bjdata(s_m) == "a");
CHECK(json::from_bjdata(s_L) == "a");
CHECK(json::from_bjdata(s_M) == "a");
// roundtrip: output should be optimized
CHECK(json::to_bjdata(json::from_bjdata(s_i)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_U)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_I)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_u)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_l)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_m)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_L)) == s_i);
CHECK(json::to_bjdata(json::from_bjdata(s_M)) == s_i);
}
SECTION("number")
@ -2093,8 +2150,11 @@ TEST_CASE("BJData")
std::vector<uint8_t> v_i = {'[', '#', 'i', 2, 'i', 0x7F, 'i', 0x7F};
std::vector<uint8_t> v_U = {'[', '#', 'i', 2, 'U', 0xFF, 'U', 0xFF};
std::vector<uint8_t> v_I = {'[', '#', 'i', 2, 'I', 0xFF, 0x7F, 'I', 0xFF, 0x7F};
std::vector<uint8_t> v_u = {'[', '#', 'i', 2, 'u', 0x0F, 0xA7, 'u', 0x0F, 0xA7};
std::vector<uint8_t> v_l = {'[', '#', 'i', 2, 'l', 0xFF, 0xFF, 0xFF, 0x7F, 'l', 0xFF, 0xFF, 0xFF, 0x7F};
std::vector<uint8_t> v_m = {'[', '#', 'i', 2, 'm', 0xFF, 0xC9, 0x9A, 0xBB, 'm', 0xFF, 0xC9, 0x9A, 0xBB};
std::vector<uint8_t> v_L = {'[', '#', 'i', 2, 'L', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 'L', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F};
std::vector<uint8_t> v_M = {'[', '#', 'i', 2, 'M', 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 'M', 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D};
std::vector<uint8_t> v_D = {'[', '#', 'i', 2, 'D', 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40, 'D', 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40};
std::vector<uint8_t> v_S = {'[', '#', 'i', 2, 'S', 'i', 1, 'a', 'S', 'i', 1, 'a'};
std::vector<uint8_t> v_C = {'[', '#', 'i', 2, 'C', 'a', 'C', 'a'};
@ -2107,8 +2167,11 @@ TEST_CASE("BJData")
CHECK(json::from_bjdata(v_i) == json({127, 127}));
CHECK(json::from_bjdata(v_U) == json({255, 255}));
CHECK(json::from_bjdata(v_I) == json({32767, 32767}));
CHECK(json::from_bjdata(v_u) == json({42767, 42767}));
CHECK(json::from_bjdata(v_l) == json({2147483647, 2147483647}));
CHECK(json::from_bjdata(v_m) == json({3147483647, 3147483647}));
CHECK(json::from_bjdata(v_L) == json({9223372036854775807, 9223372036854775807}));
CHECK(json::from_bjdata(v_M) == json({10223372036854775807ull, 10223372036854775807ull}));
CHECK(json::from_bjdata(v_D) == json({3.1415926, 3.1415926}));
CHECK(json::from_bjdata(v_S) == json({"a", "a"}));
CHECK(json::from_bjdata(v_C) == json({"a", "a"}));
@ -2120,8 +2183,11 @@ TEST_CASE("BJData")
CHECK(json::to_bjdata(json::from_bjdata(v_i), true) == v_i);
CHECK(json::to_bjdata(json::from_bjdata(v_U), true) == v_U);
CHECK(json::to_bjdata(json::from_bjdata(v_I), true) == v_I);
CHECK(json::to_bjdata(json::from_bjdata(v_u), true) == v_u);
CHECK(json::to_bjdata(json::from_bjdata(v_l), true) == v_l);
CHECK(json::to_bjdata(json::from_bjdata(v_m), true) == v_m);
CHECK(json::to_bjdata(json::from_bjdata(v_L), true) == v_L);
CHECK(json::to_bjdata(json::from_bjdata(v_M), true) == v_M);
CHECK(json::to_bjdata(json::from_bjdata(v_D), true) == v_D);
CHECK(json::to_bjdata(json::from_bjdata(v_S), true) == v_S);
CHECK(json::to_bjdata(json::from_bjdata(v_C), true) == v_S); // char is serialized to string
@ -2137,8 +2203,11 @@ TEST_CASE("BJData")
std::vector<uint8_t> v_i = {'[', '$', 'i', '#', 'i', 2, 0x7F, 0x7F};
std::vector<uint8_t> v_U = {'[', '$', 'U', '#', 'i', 2, 0xFF, 0xFF};
std::vector<uint8_t> v_I = {'[', '$', 'I', '#', 'i', 2, 0xFF, 0x7F, 0xFF, 0x7F};
std::vector<uint8_t> v_u = {'[', '$', 'u', '#', 'i', 2, 0x0F, 0xA7, 0x0F, 0xA7};
std::vector<uint8_t> v_l = {'[', '$', 'l', '#', 'i', 2, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F};
std::vector<uint8_t> v_m = {'[', '$', 'm', '#', 'i', 2, 0xFF, 0xC9, 0x9A, 0xBB, 0xFF, 0xC9, 0x9A, 0xBB};
std::vector<uint8_t> v_L = {'[', '$', 'L', '#', 'i', 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F};
std::vector<uint8_t> v_M = {'[', '$', 'M', '#', 'i', 2, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D};
std::vector<uint8_t> v_D = {'[', '$', 'D', '#', 'i', 2, 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40, 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40};
std::vector<uint8_t> v_S = {'[', '$', 'S', '#', 'i', 2, 'i', 1, 'a', 'i', 1, 'a'};
std::vector<uint8_t> v_C = {'[', '$', 'C', '#', 'i', 2, 'a', 'a'};
@ -2151,8 +2220,11 @@ TEST_CASE("BJData")
CHECK(json::from_bjdata(v_i) == json({127, 127}));
CHECK(json::from_bjdata(v_U) == json({255, 255}));
CHECK(json::from_bjdata(v_I) == json({32767, 32767}));
CHECK(json::from_bjdata(v_u) == json({42767, 42767}));
CHECK(json::from_bjdata(v_l) == json({2147483647, 2147483647}));
CHECK(json::from_bjdata(v_m) == json({3147483647, 3147483647}));
CHECK(json::from_bjdata(v_L) == json({9223372036854775807, 9223372036854775807}));
CHECK(json::from_bjdata(v_M) == json({10223372036854775807ull, 10223372036854775807ull}));
CHECK(json::from_bjdata(v_D) == json({3.1415926, 3.1415926}));
CHECK(json::from_bjdata(v_S) == json({"a", "a"}));
CHECK(json::from_bjdata(v_C) == json({"a", "a"}));
@ -2166,8 +2238,11 @@ TEST_CASE("BJData")
CHECK(json::to_bjdata(json::from_bjdata(v_i), true, true) == v_i);
CHECK(json::to_bjdata(json::from_bjdata(v_U), true, true) == v_U);
CHECK(json::to_bjdata(json::from_bjdata(v_I), true, true) == v_I);
CHECK(json::to_bjdata(json::from_bjdata(v_u), true, true) == v_u);
CHECK(json::to_bjdata(json::from_bjdata(v_l), true, true) == v_l);
CHECK(json::to_bjdata(json::from_bjdata(v_m), true, true) == v_m);
CHECK(json::to_bjdata(json::from_bjdata(v_L), true, true) == v_L);
CHECK(json::to_bjdata(json::from_bjdata(v_M), true, true) == v_M);
CHECK(json::to_bjdata(json::from_bjdata(v_D), true, true) == v_D);
CHECK(json::to_bjdata(json::from_bjdata(v_S), true, true) == v_S);
CHECK(json::to_bjdata(json::from_bjdata(v_C), true, true) == v_S); // char is serialized to string
@ -2183,8 +2258,11 @@ TEST_CASE("BJData")
std::vector<uint8_t> v_i = {'[', '$', 'i', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0x7F, 0x7F};
std::vector<uint8_t> v_U = {'[', '$', 'U', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xFF};
std::vector<uint8_t> v_I = {'[', '$', 'I', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0x7F, 0xFF, 0x7F};
std::vector<uint8_t> v_u = {'[', '$', 'u', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0x0F, 0xA7, 0x0F, 0xA7};
std::vector<uint8_t> v_l = {'[', '$', 'l', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F};
std::vector<uint8_t> v_m = {'[', '$', 'm', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xC9, 0x9A, 0xBB, 0xFF, 0xC9, 0x9A, 0xBB};
std::vector<uint8_t> v_L = {'[', '$', 'L', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F};
std::vector<uint8_t> v_M = {'[', '$', 'M', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D};
std::vector<uint8_t> v_D = {'[', '$', 'D', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40, 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40};
std::vector<uint8_t> v_S = {'[', '$', 'S', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 'i', 1, 'a', 'i', 1, 'a'};
std::vector<uint8_t> v_C = {'[', '$', 'C', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 'a', 'a'};
@ -2197,8 +2275,11 @@ TEST_CASE("BJData")
CHECK(json::from_bjdata(v_i) == json({127, 127}));
CHECK(json::from_bjdata(v_U) == json({255, 255}));
CHECK(json::from_bjdata(v_I) == json({32767, 32767}));
CHECK(json::from_bjdata(v_u) == json({42767, 42767}));
CHECK(json::from_bjdata(v_l) == json({2147483647, 2147483647}));
CHECK(json::from_bjdata(v_m) == json({3147483647, 3147483647}));
CHECK(json::from_bjdata(v_L) == json({9223372036854775807, 9223372036854775807}));
CHECK(json::from_bjdata(v_M) == json({10223372036854775807ull, 10223372036854775807ull}));
CHECK(json::from_bjdata(v_D) == json({3.1415926, 3.1415926}));
CHECK(json::from_bjdata(v_S) == json({"a", "a"}));
CHECK(json::from_bjdata(v_C) == json({"a", "a"}));
@ -2213,8 +2294,11 @@ TEST_CASE("BJData")
CHECK(json::to_bjdata(json::from_bjdata(v_i), true, true) == v_i);
CHECK(json::to_bjdata(json::from_bjdata(v_U), true, true) == v_U);
CHECK(json::to_bjdata(json::from_bjdata(v_I), true, true) == v_I);
CHECK(json::to_bjdata(json::from_bjdata(v_u), true, true) == v_u);
CHECK(json::to_bjdata(json::from_bjdata(v_l), true, true) == v_l);
CHECK(json::to_bjdata(json::from_bjdata(v_m), true, true) == v_m);
CHECK(json::to_bjdata(json::from_bjdata(v_L), true, true) == v_L);
CHECK(json::to_bjdata(json::from_bjdata(v_M), true, true) == v_M);
CHECK(json::to_bjdata(json::from_bjdata(v_D), true, true) == v_D);
CHECK(json::to_bjdata(json::from_bjdata(v_S), true, true) == v_S);
CHECK(json::to_bjdata(json::from_bjdata(v_C), true, true) == v_S); // char is serialized to string
@ -2320,16 +2404,31 @@ TEST_CASE("BJData")
CHECK_THROWS_WITH(_ = json::from_bjdata(vI), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing BJData number: unexpected end of input");
CHECK(json::from_bjdata(vI, true, false).is_discarded());
std::vector<uint8_t> vu = {'[', '#', 'u'};
CHECK_THROWS_AS(_ = json::from_bjdata(vu), json::parse_error&);
CHECK_THROWS_WITH(_ = json::from_bjdata(vu), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing BJData number: unexpected end of input");
CHECK(json::from_bjdata(vu, true, false).is_discarded());
std::vector<uint8_t> vl = {'[', '#', 'l'};
CHECK_THROWS_AS(_ = json::from_bjdata(vl), json::parse_error&);
CHECK_THROWS_WITH(_ = json::from_bjdata(vl), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing BJData number: unexpected end of input");
CHECK(json::from_bjdata(vl, true, false).is_discarded());
std::vector<uint8_t> vm = {'[', '#', 'm'};
CHECK_THROWS_AS(_ = json::from_bjdata(vm), json::parse_error&);
CHECK_THROWS_WITH(_ = json::from_bjdata(vm), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing BJData number: unexpected end of input");
CHECK(json::from_bjdata(vm, true, false).is_discarded());
std::vector<uint8_t> vL = {'[', '#', 'L'};
CHECK_THROWS_AS(_ = json::from_bjdata(vL), json::parse_error&);
CHECK_THROWS_WITH(_ = json::from_bjdata(vL), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing BJData number: unexpected end of input");
CHECK(json::from_bjdata(vL, true, false).is_discarded());
std::vector<uint8_t> vM = {'[', '#', 'M'};
CHECK_THROWS_AS(_ = json::from_bjdata(vM), json::parse_error&);
CHECK_THROWS_WITH(_ = json::from_bjdata(vM), "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing BJData number: unexpected end of input");
CHECK(json::from_bjdata(vM, true, false).is_discarded());
std::vector<uint8_t> v0 = {'[', '#', 'T', ']'};
CHECK_THROWS_AS(_ = json::from_bjdata(v0), json::parse_error&);
CHECK_THROWS_WITH(_ = json::from_bjdata(v0), "[json.exception.parse_error.113] parse error at byte 3: syntax error while parsing BJData size: expected length type specification (U, i, I, l, L) after '#'; last byte: 0x54");
@ -2488,6 +2587,15 @@ TEST_CASE("BJData")
CHECK(json::to_bjdata(j, true) == expected_size);
}
SECTION("array of u")
{
json j = {50000u, 50001u};
std::vector<uint8_t> expected = {'[', '$', 'u', '#', 'i', 2, 0x50, 0xC3, 0x51, 0xC3};
std::vector<uint8_t> expected_size = {'[', '#', 'i', 2, 'u', 0x50, 0xC3, 'u', 0x51, 0xC3};
CHECK(json::to_bjdata(j, true, true) == expected);
CHECK(json::to_bjdata(j, true) == expected_size);
}
SECTION("array of l")
{
json j = {70000u, 70001u};
@ -2497,6 +2605,15 @@ TEST_CASE("BJData")
CHECK(json::to_bjdata(j, true) == expected_size);
}
SECTION("array of m")
{
json j = {3147483647, 3147483648};
std::vector<uint8_t> expected = {'[', '$', 'm', '#', 'i', 2, 0xFF, 0xC9, 0x9A, 0xBB, 0x00, 0xCA, 0x9A, 0xBB};
std::vector<uint8_t> expected_size = {'[', '#', 'i', 2, 'm', 0xFF, 0xC9, 0x9A, 0xBB, 'm', 0x00, 0xCA, 0x9A, 0xBB};
CHECK(json::to_bjdata(j, true, true) == expected);
CHECK(json::to_bjdata(j, true) == expected_size);
}
SECTION("array of L")
{
json j = {5000000000u, 5000000001u};
@ -2505,6 +2622,15 @@ TEST_CASE("BJData")
CHECK(json::to_bjdata(j, true, true) == expected);
CHECK(json::to_bjdata(j, true) == expected_size);
}
SECTION("array of M")
{
json j = {10223372036854775807ull, 10223372036854775808ull};
std::vector<uint8_t> expected = {'[', '$', 'M', '#', 'i', 2, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 0x00, 0x00, 0x64, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D};
std::vector<uint8_t> expected_size = {'[', '#', 'i', 2, 'M', 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 'M', 0x00, 0x00, 0x64, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D};
CHECK(json::to_bjdata(j, true, true) == expected);
CHECK(json::to_bjdata(j, true) == expected_size);
}
}
SECTION("discarded")
@ -2559,8 +2685,11 @@ TEST_CASE("Universal Binary JSON Specification Examples 1")
{"int8", 16},
{"uint8", 255},
{"int16", 32767},
{"uint16", 42767},
{"int32", 2147483647},
{"uint32", 3147483647},
{"int64", 9223372036854775807},
{"uint64", 10223372036854775807ull},
{"float64", 113243.7863123}
};
std::vector<uint8_t> v = {'{',
@ -2569,6 +2698,9 @@ TEST_CASE("Universal Binary JSON Specification Examples 1")
'i', 5, 'i', 'n', 't', '3', '2', 'l', 0xff, 0xff, 0xff, 0x7f,
'i', 5, 'i', 'n', 't', '6', '4', 'L', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
'i', 4, 'i', 'n', 't', '8', 'i', 16,
'i', 6, 'u', 'i', 'n', 't', '1', '6', 'u', 0x0F, 0xA7,
'i', 6, 'u', 'i', 'n', 't', '3', '2', 'm', 0xFF, 0xC9, 0x9A, 0xBB,
'i', 6, 'u', 'i', 'n', 't', '6', '4', 'M', 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D,
'i', 5, 'u', 'i', 'n', 't', '8', 'U', 0xff,
'}'
};