From 734297ff45bcc1474cfdc8e02ea1222f41d40890 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 23 Apr 2017 20:32:05 +0200 Subject: [PATCH] :hammer: cleanup --- README.md | 2 +- test/src/unit-unicode.cpp | 360 +++++++++----------------------------- 2 files changed, 82 insertions(+), 280 deletions(-) diff --git a/README.md b/README.md index 265ec06f..fbae1a79 100644 --- a/README.md +++ b/README.md @@ -897,7 +897,7 @@ $ make json_unit -Ctest $ ./test/json_unit "*" =============================================================================== -All tests passed (11203022 assertions in 48 test cases) +All tests passed (13391115 assertions in 49 test cases) ``` Alternatively, you can use [CMake](https://cmake.org) and run diff --git a/test/src/unit-unicode.cpp b/test/src/unit-unicode.cpp index 93df6808..7b94db67 100644 --- a/test/src/unit-unicode.cpp +++ b/test/src/unit-unicode.cpp @@ -34,23 +34,44 @@ using nlohmann::json; #include -std::string create_string(int byte1, int byte2 = -1, int byte3 = -1, int byte4 = -1) +// create and check a JSON string with up to four UTF-8 bytes +void check_utf8string(bool success_expected, int byte1, int byte2 = -1, int byte3 = -1, int byte4 = -1) { - std::string result = "\"" + std::string(1, static_cast(byte1)); + std::string json_string = "\""; + + CAPTURE(byte1); + json_string += std::string(1, static_cast(byte1)); + if (byte2 != -1) { - result += std::string(1, static_cast(byte2)); + CAPTURE(byte2); + json_string += std::string(1, static_cast(byte2)); } + if (byte3 != -1) { - result += std::string(1, static_cast(byte3)); + CAPTURE(byte3); + json_string += std::string(1, static_cast(byte3)); } + if (byte4 != -1) { - result += std::string(1, static_cast(byte4)); + CAPTURE(byte4); + json_string += std::string(1, static_cast(byte4)); + } + + json_string += "\""; + + CAPTURE(json_string); + + if (success_expected) + { + CHECK_NOTHROW(json::parse(json_string)); + } + else + { + CHECK_THROWS_AS(json::parse(json_string), json::parse_error); } - result += "\""; - return result; } TEST_CASE("RFC 3629", "[hide]") @@ -79,18 +100,12 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0x80; byte1 <= 0xC1; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } for (int byte1 = 0xF5; byte1 <= 0xFF; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -100,33 +115,29 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0x00; byte1 <= 0x7F; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - // unescaped control characters are parse errors in JSON if (0x00 <= byte1 and byte1 <= 0x1F) { - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); continue; } // a single quote is a parse error in JSON if (byte1 == 0x22) { - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); continue; } // a single backslash is a parse error in JSON if (byte1 == 0x5C) { - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); continue; } // all other characters are OK - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1); } } } @@ -139,11 +150,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x80; byte2 <= 0xBF; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2); } } } @@ -152,10 +159,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xC2; byte1 <= 0xDF; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -171,11 +175,7 @@ TEST_CASE("RFC 3629", "[hide]") continue; } - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -191,12 +191,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3); } } } @@ -206,10 +201,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xE0; byte1 <= 0xE0; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -219,11 +211,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0xA0; byte2 <= 0xBF; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -242,12 +230,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -267,12 +250,7 @@ TEST_CASE("RFC 3629", "[hide]") continue; } - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -289,12 +267,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3); } } } @@ -304,10 +277,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xE1; byte1 <= 0xEC; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -317,11 +287,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x80; byte2 <= 0xBF; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -340,12 +306,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -365,12 +326,7 @@ TEST_CASE("RFC 3629", "[hide]") continue; } - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -387,12 +343,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3); } } } @@ -402,10 +353,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xED; byte1 <= 0xED; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -415,11 +363,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x80; byte2 <= 0x9F; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -438,12 +382,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -463,12 +402,7 @@ TEST_CASE("RFC 3629", "[hide]") continue; } - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -485,12 +419,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3); } } } @@ -500,10 +429,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xEE; byte1 <= 0xEF; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -513,11 +439,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x80; byte2 <= 0xBF; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -536,12 +458,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -561,12 +478,7 @@ TEST_CASE("RFC 3629", "[hide]") continue; } - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -585,13 +497,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3, byte4); } } } @@ -602,10 +508,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xF0; byte1 <= 0xF0; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -615,11 +518,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x90; byte2 <= 0xBF; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -632,12 +531,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -659,13 +553,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -688,13 +576,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -709,24 +591,16 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - { for (int byte4 = 0x00; byte4 <= 0xFF; ++byte4) { - // skip correct second byte + // skip fourth second byte if (0x80 <= byte3 and byte3 <= 0xBF) { continue; } - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } - } } } } @@ -745,13 +619,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3, byte4); } } } @@ -762,10 +630,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xF1; byte1 <= 0xF3; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -775,11 +640,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x80; byte2 <= 0xBF; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -792,12 +653,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -819,13 +675,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -848,13 +698,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -871,19 +715,13 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x00; byte4 <= 0xFF; ++byte4) { - // skip correct second byte + // skip correct fourth byte if (0x80 <= byte3 and byte3 <= 0xBF) { continue; } - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -903,13 +741,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_NOTHROW(json::parse(json_string)); + check_utf8string(true, byte1, byte2, byte3, byte4); } } } @@ -920,10 +752,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte1 = 0xF4; byte1 <= 0xF4; ++byte1) { - const auto json_string = create_string(byte1); - CAPTURE(byte1); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1); } } @@ -933,11 +762,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte2 = 0x80; byte2 <= 0x8F; ++byte2) { - const auto json_string = create_string(byte1, byte2); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2); } } } @@ -950,12 +775,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte3 = 0x80; byte3 <= 0xBF; ++byte3) { - const auto json_string = create_string(byte1, byte2, byte3); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3); } } } @@ -977,13 +797,7 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -1006,13 +820,7 @@ TEST_CASE("RFC 3629", "[hide]") for (int byte4 = 0x80; byte4 <= 0xBF; ++byte4) { - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } } @@ -1029,19 +837,13 @@ TEST_CASE("RFC 3629", "[hide]") { for (int byte4 = 0x00; byte4 <= 0xFF; ++byte4) { - // skip correct second byte + // skip correct fourth byte if (0x80 <= byte3 and byte3 <= 0xBF) { continue; } - const auto json_string = create_string(byte1, byte2, byte3, byte4); - CAPTURE(byte1); - CAPTURE(byte2); - CAPTURE(byte3); - CAPTURE(byte4); - CAPTURE(json_string); - CHECK_THROWS_AS(json::parse(json_string), json::parse_error); + check_utf8string(false, byte1, byte2, byte3, byte4); } } }