improve coverage

This commit is contained in:
Niels Lohmann 2021-09-12 22:21:08 +02:00
parent e6013608cc
commit cf81564797
No known key found for this signature in database
GPG Key ID: 7F3CEA63AE251B69
3 changed files with 97 additions and 2 deletions

View File

@ -2545,21 +2545,45 @@ class binary_reader
{
result.push_back(static_cast<typename string_t::value_type>(current));
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
get();
}
else if ((current & 0xF0) == 0xE0)
{
result.push_back(static_cast<typename string_t::value_type>(current));
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
get();
}
else if ((current & 0xF8) == 0xF0)
{
result.push_back(static_cast<typename string_t::value_type>(current));
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
get();
}
else if (current == 0xFF)

View File

@ -10839,21 +10839,45 @@ class binary_reader
{
result.push_back(static_cast<typename string_t::value_type>(current));
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
get();
}
else if ((current & 0xF0) == 0xE0)
{
result.push_back(static_cast<typename string_t::value_type>(current));
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
get();
}
else if ((current & 0xF8) == 0xF0)
{
result.push_back(static_cast<typename string_t::value_type>(current));
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
result.push_back(static_cast<typename string_t::value_type>(get()));
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
{
return false;
}
get();
}
else if (current == 0xFF)

View File

@ -641,6 +641,39 @@ TEST_CASE("BON8")
CHECK(result == expected);
CHECK(json::from_bon8(result) == j);
}
SECTION("multi-byte, 2 bytes")
{
json j = "\xC2\xA3";
std::vector<uint8_t> expected = {0xC2, 0xA3, 0xFF};
const auto result = json::to_bon8(j);
CHECK(result == expected);
CHECK(json::from_bon8(result) == j);
}
SECTION("multi-byte, 3 bytes")
{
json j = "\xEF\xB8\xBB";
std::vector<uint8_t> expected = {0xEF, 0xB8, 0xBB, 0xFF};
const auto result = json::to_bon8(j);
CHECK(result == expected);
CHECK(json::from_bon8(result) == j);
}
SECTION("multi-byte, 4 bytes")
{
json j = "\xF0\x9F\x80\x84";
std::vector<uint8_t> expected = {0xF0, 0x9F, 0x80, 0x84, 0xFF};
const auto result = json::to_bon8(j);
CHECK(result == expected);
CHECK(json::from_bon8(result) == j);
}
SECTION("invalid string")
{
std::vector<uint8_t> v = {0xF0, 0x9F, 0x80, 0x84};
CHECK_THROWS_WITH_AS(json::from_bon8(v), "[json.exception.parse_error.110] parse error at byte 5: syntax error while parsing BON8 string: unexpected end of input", json::parse_error);
}
}
SECTION("array")
@ -820,13 +853,20 @@ TEST_CASE("BON8")
CHECK(!json::sax_parse(v, &scp, json::input_format_t::bon8));
}
SECTION("error in array")
SECTION("error in array with size")
{
std::vector<uint8_t> v = {0x81};
SaxCountdown scp(1000);
CHECK(!json::sax_parse(v, &scp, json::input_format_t::bon8));
}
SECTION("error in array without size")
{
std::vector<uint8_t> v = {0x85};
SaxCountdown scp(1000);
CHECK(!json::sax_parse(v, &scp, json::input_format_t::bon8));
}
SECTION("start_object(len)")
{
std::vector<uint8_t> v = {0x86};
@ -841,11 +881,18 @@ TEST_CASE("BON8")
CHECK(!json::sax_parse(v, &scp, json::input_format_t::bon8));
}
SECTION("error in object")
SECTION("error in object with size")
{
std::vector<uint8_t> v = {0x87, 'f', 'o', 'o', 0xFF};
SaxCountdown scp(1000);
CHECK(!json::sax_parse(v, &scp, json::input_format_t::bon8));
}
SECTION("error in object without size")
{
std::vector<uint8_t> v = {0x8B, 'f', 'o', 'o', 0xFF};
SaxCountdown scp(1000);
CHECK(!json::sax_parse(v, &scp, json::input_format_t::bon8));
}
}
}