From 55682ffb5aec68029063e6ba4cc64ff4adb2698f Mon Sep 17 00:00:00 2001 From: Qianqian Fang Date: Thu, 17 Feb 2022 23:49:24 -0500 Subject: [PATCH] add more tests to cover the new bjdata types --- .../nlohmann/detail/input/binary_reader.hpp | 46 +++--- single_include/nlohmann/json.hpp | 46 +++--- test/src/unit-bjdata.cpp | 132 ++++++++++++++++++ 3 files changed, 166 insertions(+), 58 deletions(-) diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 8cf5987be..25bdb95fd 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -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& dim) { std::pair 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': { diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index aec991d66..cd7e83f9e 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -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& dim) { std::pair 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': { diff --git a/test/src/unit-bjdata.cpp b/test/src/unit-bjdata.cpp index da6983318..a5b80a2e1 100644 --- a/test/src/unit-bjdata.cpp +++ b/test/src/unit-bjdata.cpp @@ -636,6 +636,54 @@ TEST_CASE("BJData") CHECK(json::from_bjdata(result, true, false) == j); } } + + SECTION("9223372036854775808..18446744073709551615 (uint64)") + { + std::vector 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 expected; + expected.push_back('M'); + expected.push_back(static_cast(i & 0xff)); + expected.push_back(static_cast((i >> 010) & 0xff)); + expected.push_back(static_cast((i >> 020) & 0xff)); + expected.push_back(static_cast((i >> 030) & 0xff)); + expected.push_back(static_cast((i >> 040) & 0xff)); + expected.push_back(static_cast((i >> 050) & 0xff)); + expected.push_back(static_cast((i >> 060) & 0xff)); + expected.push_back(static_cast((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(result[8]) << 070) + + (static_cast(result[7]) << 060) + + (static_cast(result[6]) << 050) + + (static_cast(result[5]) << 040) + + (static_cast(result[4]) << 030) + + (static_cast(result[3]) << 020) + + (static_cast(result[2]) << 010) + + static_cast(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 s_i = {'S', 'i', 1, 'a'}; std::vector s_U = {'S', 'U', 1, 'a'}; std::vector s_I = {'S', 'I', 1, 0, 'a'}; + std::vector s_u = {'S', 'u', 1, 0, 'a'}; std::vector s_l = {'S', 'l', 1, 0, 0, 0, 'a'}; + std::vector s_m = {'S', 'm', 1, 0, 0, 0, 'a'}; std::vector s_L = {'S', 'L', 1, 0, 0, 0, 0, 0, 0, 0, 'a'}; + std::vector 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 v_i = {'[', '#', 'i', 2, 'i', 0x7F, 'i', 0x7F}; std::vector v_U = {'[', '#', 'i', 2, 'U', 0xFF, 'U', 0xFF}; std::vector v_I = {'[', '#', 'i', 2, 'I', 0xFF, 0x7F, 'I', 0xFF, 0x7F}; + std::vector v_u = {'[', '#', 'i', 2, 'u', 0x0F, 0xA7, 'u', 0x0F, 0xA7}; std::vector v_l = {'[', '#', 'i', 2, 'l', 0xFF, 0xFF, 0xFF, 0x7F, 'l', 0xFF, 0xFF, 0xFF, 0x7F}; + std::vector v_m = {'[', '#', 'i', 2, 'm', 0xFF, 0xC9, 0x9A, 0xBB, 'm', 0xFF, 0xC9, 0x9A, 0xBB}; std::vector v_L = {'[', '#', 'i', 2, 'L', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 'L', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}; + std::vector v_M = {'[', '#', 'i', 2, 'M', 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 'M', 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D}; std::vector v_D = {'[', '#', 'i', 2, 'D', 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40, 'D', 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40}; std::vector v_S = {'[', '#', 'i', 2, 'S', 'i', 1, 'a', 'S', 'i', 1, 'a'}; std::vector 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 v_i = {'[', '$', 'i', '#', 'i', 2, 0x7F, 0x7F}; std::vector v_U = {'[', '$', 'U', '#', 'i', 2, 0xFF, 0xFF}; std::vector v_I = {'[', '$', 'I', '#', 'i', 2, 0xFF, 0x7F, 0xFF, 0x7F}; + std::vector v_u = {'[', '$', 'u', '#', 'i', 2, 0x0F, 0xA7, 0x0F, 0xA7}; std::vector v_l = {'[', '$', 'l', '#', 'i', 2, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F}; + std::vector v_m = {'[', '$', 'm', '#', 'i', 2, 0xFF, 0xC9, 0x9A, 0xBB, 0xFF, 0xC9, 0x9A, 0xBB}; std::vector v_L = {'[', '$', 'L', '#', 'i', 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}; + std::vector v_M = {'[', '$', 'M', '#', 'i', 2, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D}; std::vector v_D = {'[', '$', 'D', '#', 'i', 2, 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40, 0x4a, 0xd8, 0x12, 0x4d, 0xfb, 0x21, 0x09, 0x40}; std::vector v_S = {'[', '$', 'S', '#', 'i', 2, 'i', 1, 'a', 'i', 1, 'a'}; std::vector 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 v_i = {'[', '$', 'i', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0x7F, 0x7F}; std::vector v_U = {'[', '$', 'U', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xFF}; std::vector v_I = {'[', '$', 'I', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0x7F, 0xFF, 0x7F}; + std::vector v_u = {'[', '$', 'u', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0x0F, 0xA7, 0x0F, 0xA7}; std::vector v_l = {'[', '$', 'l', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F}; + std::vector v_m = {'[', '$', 'm', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 0xFF, 0xC9, 0x9A, 0xBB, 0xFF, 0xC9, 0x9A, 0xBB}; std::vector 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 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 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 v_S = {'[', '$', 'S', '#', '[', '$', 'i', '#', 'i', 2, 1, 2, 'i', 1, 'a', 'i', 1, 'a'}; std::vector 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 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 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 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 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 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 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 expected = {'[', '$', 'u', '#', 'i', 2, 0x50, 0xC3, 0x51, 0xC3}; + std::vector 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 expected = {'[', '$', 'm', '#', 'i', 2, 0xFF, 0xC9, 0x9A, 0xBB, 0x00, 0xCA, 0x9A, 0xBB}; + std::vector 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 expected = {'[', '$', 'M', '#', 'i', 2, 0xFF, 0xFF, 0x63, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D, 0x00, 0x00, 0x64, 0xA7, 0xB3, 0xB6, 0xE0, 0x8D}; + std::vector 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 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, '}' };