From 99ecca55c459973432e560159260d51f9f6eb950 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Tue, 20 Mar 2018 18:49:10 +0100 Subject: [PATCH] :white_check_mark: improved test coverage --- Makefile | 2 +- .../nlohmann/detail/input/binary_reader.hpp | 8 +- single_include/nlohmann/json.hpp | 9 +- test/src/unit-cbor.cpp | 13 ++ test/src/unit-msgpack.cpp | 70 +++++++ test/src/unit-ubjson.cpp | 172 ++++++++++++++++++ 6 files changed, 269 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index ed0a7a5c..1e121788 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ coverage: mkdir build_coverage cd build_coverage ; CXX=g++-5 cmake .. -GNinja -DJSON_Coverage=ON -DJSON_MultipleHeaders=ON cd build_coverage ; ninja - cd build_coverage ; ctest -j10 + cd build_coverage ; ctest -E '.*_default' -j10 cd build_coverage ; ninja lcov_html open build_coverage/test/html/index.html diff --git a/include/nlohmann/detail/input/binary_reader.hpp b/include/nlohmann/detail/input/binary_reader.hpp index 429502ea..d3c09bc9 100644 --- a/include/nlohmann/detail/input/binary_reader.hpp +++ b/include/nlohmann/detail/input/binary_reader.hpp @@ -1359,8 +1359,8 @@ class binary_reader default: { - result = std::size_t(-1); - return true; + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after '#' must denote a number type; last byte: 0x" + last_token)); } } } @@ -1393,6 +1393,10 @@ class binary_reader get_ignore_noop(); if (JSON_UNLIKELY(current != '#')) { + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + last_token)); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index ea4f1995..57eba455 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -5699,6 +5699,7 @@ class binary_reader using json_sax_t = json_sax; public: + /// the supported binary input formats enum class binary_format_t { cbor, msgpack, ubjson }; /*! @@ -7016,8 +7017,8 @@ class binary_reader default: { - result = std::size_t(-1); - return true; + auto last_token = get_token_string(); + return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, "byte after '#' must denote a number type; last byte: 0x" + last_token)); } } } @@ -7050,6 +7051,10 @@ class binary_reader get_ignore_noop(); if (JSON_UNLIKELY(current != '#')) { + if (JSON_UNLIKELY(not unexpect_eof())) + { + return false; + } auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + last_token)); } diff --git a/test/src/unit-cbor.cpp b/test/src/unit-cbor.cpp index e8b8c6f4..b0efe6bc 100644 --- a/test/src/unit-cbor.cpp +++ b/test/src/unit-cbor.cpp @@ -1292,6 +1292,10 @@ TEST_CASE("CBOR") CHECK_THROWS_AS(json::from_cbor(std::vector({0x62, 0x60})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x7F})), json::parse_error&); CHECK_THROWS_AS(json::from_cbor(std::vector({0x7F, 0x60})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x82, 0x01})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0x9F, 0x01})), json::parse_error&); + CHECK_THROWS_AS(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5})), json::parse_error&); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x18})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); @@ -1331,6 +1335,12 @@ TEST_CASE("CBOR") "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); CHECK_THROWS_WITH(json::from_cbor(std::vector({0x7F, 0x60})), "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x82, 0x01})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0x9F, 0x01})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK_THROWS_WITH(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5})), + "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); CHECK(json::from_cbor(std::vector({0x18}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x19}), true, false).is_discarded()); @@ -1351,6 +1361,9 @@ TEST_CASE("CBOR") CHECK(json::from_cbor(std::vector({0x62, 0x60}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x7F}), true, false).is_discarded()); CHECK(json::from_cbor(std::vector({0x7F, 0x60}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x82, 0x01}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0x9F, 0x01}), true, false).is_discarded()); + CHECK(json::from_cbor(std::vector({0xBF, 0x61, 0x61, 0xF5}), true, false).is_discarded()); } SECTION("unsupported bytes") diff --git a/test/src/unit-msgpack.cpp b/test/src/unit-msgpack.cpp index d8bdb08b..9cb3d18b 100644 --- a/test/src/unit-msgpack.cpp +++ b/test/src/unit-msgpack.cpp @@ -54,6 +54,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("boolean") @@ -67,6 +68,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("false") @@ -78,6 +80,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -111,6 +114,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -141,6 +145,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -174,6 +179,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -208,6 +214,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -250,6 +257,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -300,6 +308,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -331,6 +340,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -347,6 +357,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("-32768..-129 (int 16)") @@ -379,6 +390,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -423,6 +435,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -472,6 +485,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -504,6 +518,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -536,6 +551,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -569,6 +585,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -610,6 +627,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -659,6 +677,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -679,6 +698,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); CHECK(json::from_msgpack(result) == v); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -727,6 +747,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -758,6 +779,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -790,6 +812,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -824,6 +847,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -839,6 +863,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("[null]") @@ -850,6 +875,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("[1,2,3,4,5]") @@ -861,6 +887,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("[[[[]]]]") @@ -872,6 +899,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("array 16") @@ -886,6 +914,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("array 32") @@ -909,6 +938,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } @@ -923,6 +953,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("{\"\":null}") @@ -934,6 +965,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("{\"a\": {\"b\": {\"c\": {}}}}") @@ -948,6 +980,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("map 16") @@ -971,6 +1004,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } SECTION("map 32") @@ -1001,6 +1035,7 @@ TEST_CASE("MessagePack") // roundtrip CHECK(json::from_msgpack(result) == j); + CHECK(json::from_msgpack(result, true, false) == j); } } } @@ -1019,10 +1054,12 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector()), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector()), "[json.exception.parse_error.110] parse error at 1: unexpected end of input"); + CHECK(json::from_msgpack(std::vector(), true, false).is_discarded()); } SECTION("too short byte vector") { + CHECK_THROWS_AS(json::from_msgpack(std::vector({0x87})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcc})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcd})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcd, 0x00})), json::parse_error&); @@ -1038,7 +1075,11 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); CHECK_THROWS_AS(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), json::parse_error&); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0xa5, 0x68, 0x65})), json::parse_error&); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0x92, 0x01})), json::parse_error&); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x87})), + "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xcc})), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xcd})), @@ -1069,6 +1110,29 @@ TEST_CASE("MessagePack") "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})), "[json.exception.parse_error.110] parse error at 9: unexpected end of input"); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xa5, 0x68, 0x65})), + "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x92, 0x01})), + "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + + CHECK(json::from_msgpack(std::vector({0x87}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcc}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcd}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcd, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xce, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0xa5, 0x68, 0x65}), true, false).is_discarded()); + CHECK(json::from_msgpack(std::vector({0x92, 0x01}), true, false).is_discarded()); } SECTION("unsupported bytes") @@ -1078,9 +1142,12 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0xc1})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xc1})), "[json.exception.parse_error.112] parse error at 1: error reading MessagePack; last byte: 0xC1"); + CHECK(json::from_msgpack(std::vector({0xc6}), true, false).is_discarded()); + CHECK_THROWS_AS(json::from_msgpack(std::vector({0xc6})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0xc6})), "[json.exception.parse_error.112] parse error at 1: error reading MessagePack; last byte: 0xC6"); + CHECK(json::from_msgpack(std::vector({0xc6}), true, false).is_discarded()); } SECTION("all unsupported bytes") @@ -1098,6 +1165,7 @@ TEST_CASE("MessagePack") }) { CHECK_THROWS_AS(json::from_msgpack(std::vector({static_cast(byte)})), json::parse_error&); + CHECK(json::from_msgpack(std::vector({static_cast(byte)}), true, false).is_discarded()); } } } @@ -1107,6 +1175,7 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(std::vector({0x81, 0xff, 0x01})), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(std::vector({0x81, 0xff, 0x01})), "[json.exception.parse_error.113] parse error at 2: expected a MessagePack string; last byte: 0xFF"); + CHECK(json::from_msgpack(std::vector({0x81, 0xff, 0x01}), true, false).is_discarded()); } SECTION("strict mode") @@ -1123,6 +1192,7 @@ TEST_CASE("MessagePack") CHECK_THROWS_AS(json::from_msgpack(vec), json::parse_error&); CHECK_THROWS_WITH(json::from_msgpack(vec), "[json.exception.parse_error.110] parse error at 2: expected end of input"); + CHECK(json::from_msgpack(vec, true, false).is_discarded()); } } } diff --git a/test/src/unit-ubjson.cpp b/test/src/unit-ubjson.cpp index 1d7c1046..11774268 100644 --- a/test/src/unit-ubjson.cpp +++ b/test/src/unit-ubjson.cpp @@ -54,6 +54,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("boolean") @@ -67,6 +68,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("false") @@ -78,6 +80,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -140,6 +143,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -186,6 +190,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -219,6 +224,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -239,6 +245,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("-128..-1 (int8)") @@ -269,6 +276,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -301,6 +309,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -333,6 +342,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -367,6 +377,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -409,6 +420,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -457,6 +469,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -492,6 +505,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -524,6 +538,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -557,6 +572,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -598,6 +614,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -645,6 +662,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -665,6 +683,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); CHECK(json::from_ubjson(result) == v); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -703,6 +722,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -735,6 +755,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -768,6 +789,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -803,6 +825,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -820,6 +843,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -831,6 +855,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -842,6 +867,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -856,6 +882,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -867,6 +894,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -878,6 +906,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -892,6 +921,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -903,6 +933,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -914,6 +945,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -928,6 +960,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -939,6 +972,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -950,6 +984,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -966,6 +1001,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -982,6 +1018,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -993,6 +1030,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -1009,6 +1047,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1027,6 +1066,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1038,6 +1078,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -1055,6 +1096,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1066,6 +1108,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1077,6 +1120,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -1091,6 +1135,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1102,6 +1147,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1113,6 +1159,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } @@ -1130,6 +1177,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=false") @@ -1144,6 +1192,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } SECTION("size=true type=true") @@ -1158,6 +1207,7 @@ TEST_CASE("UBJSON") // roundtrip CHECK(json::from_ubjson(result) == j); + CHECK(json::from_ubjson(result, true, false) == j); } } } @@ -1239,6 +1289,7 @@ TEST_CASE("UBJSON") SECTION("optimized version (length only)") { // create vector with two elements of the same type + std::vector v_TU = {'[', '#', 'U', 2, 'T', 'T'}; std::vector v_T = {'[', '#', 'i', 2, 'T', 'T'}; std::vector v_F = {'[', '#', 'i', 2, 'F', 'F'}; std::vector v_Z = {'[', '#', 'i', 2, 'Z', 'Z'}; @@ -1252,6 +1303,7 @@ TEST_CASE("UBJSON") std::vector v_C = {'[', '#', 'i', 2, 'C', 'a', 'C', 'a'}; // check if vector is parsed correctly + CHECK(json::from_ubjson(v_TU) == json({true, true})); CHECK(json::from_ubjson(v_T) == json({true, true})); CHECK(json::from_ubjson(v_F) == json({false, false})); CHECK(json::from_ubjson(v_Z) == json({nullptr, nullptr})); @@ -1378,6 +1430,126 @@ TEST_CASE("UBJSON") CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.112] parse error at 4: expected '#' after UBJSON type information; last byte: 0x02"); } } + + SECTION("strings") + { + std::vector vS = {'S'}; + CHECK_THROWS_AS(json::from_ubjson(vS), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vS), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK(json::from_ubjson(vS, true, false).is_discarded()); + + std::vector v = {'S', 'i', '2', 'a'}; + CHECK_THROWS_AS(json::from_ubjson(v), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); + CHECK(json::from_ubjson(v, true, false).is_discarded()); + + std::vector vC = {'C'}; + CHECK_THROWS_AS(json::from_ubjson(vC), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vC), "[json.exception.parse_error.110] parse error at 2: unexpected end of input"); + CHECK(json::from_ubjson(vC, true, false).is_discarded()); + } + + SECTION("sizes") + { + std::vector vU = {'[', '#', 'U'}; + CHECK_THROWS_AS(json::from_ubjson(vU), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vU), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vU, true, false).is_discarded()); + + std::vector vi = {'[', '#', 'i'}; + CHECK_THROWS_AS(json::from_ubjson(vi), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vi), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vi, true, false).is_discarded()); + + std::vector vI = {'[', '#', 'I'}; + CHECK_THROWS_AS(json::from_ubjson(vI), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vI), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vI, true, false).is_discarded()); + + std::vector vl = {'[', '#', 'l'}; + CHECK_THROWS_AS(json::from_ubjson(vl), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vl), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vl, true, false).is_discarded()); + + std::vector vL = {'[', '#', 'L'}; + CHECK_THROWS_AS(json::from_ubjson(vL), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vL), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vL, true, false).is_discarded()); + + std::vector v0 = {'[', '#', 'T', ']'}; + CHECK_THROWS_AS(json::from_ubjson(v0), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v0), "[json.exception.parse_error.113] parse error at 3: byte after '#' must denote a number type; last byte: 0x54"); + CHECK(json::from_ubjson(v0, true, false).is_discarded()); + } + + SECTION("types") + { + std::vector v0 = {'[', '$'}; + CHECK_THROWS_AS(json::from_ubjson(v0), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v0), "[json.exception.parse_error.110] parse error at 3: unexpected end of input"); + CHECK(json::from_ubjson(v0, true, false).is_discarded()); + + std::vector vi = {'[', '$', '#'}; + CHECK_THROWS_AS(json::from_ubjson(vi), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vi), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vi, true, false).is_discarded()); + + std::vector vT = {'[', '$', 'T'}; + CHECK_THROWS_AS(json::from_ubjson(vT), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vT), "[json.exception.parse_error.110] parse error at 4: unexpected end of input"); + CHECK(json::from_ubjson(vT, true, false).is_discarded()); + } + + SECTION("arrays") + { + std::vector vST = {'[', '$', 'i', '#', 'i', 2, 1}; + CHECK_THROWS_AS(json::from_ubjson(vST), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vST), "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); + CHECK(json::from_ubjson(vST, true, false).is_discarded()); + + std::vector vS = {'[', '#', 'i', 2, 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(vS), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vS), "[json.exception.parse_error.110] parse error at 7: unexpected end of input"); + CHECK(json::from_ubjson(vS, true, false).is_discarded()); + + std::vector v = {'[', 'i', 2, 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(v), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.110] parse error at 6: unexpected end of input"); + CHECK(json::from_ubjson(v, true, false).is_discarded()); + } + + SECTION("objects") + { + std::vector vST = {'{', '$', 'i', '#', 'i', 2, 'i', 1, 'a', 1}; + CHECK_THROWS_AS(json::from_ubjson(vST), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vST), "[json.exception.parse_error.110] parse error at 11: unexpected end of input"); + CHECK(json::from_ubjson(vST, true, false).is_discarded()); + + std::vector vT = {'{', '$', 'i', 'i', 1, 'a', 1}; + CHECK_THROWS_AS(json::from_ubjson(vT), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vT), "[json.exception.parse_error.112] parse error at 4: expected '#' after UBJSON type information; last byte: 0x69"); + CHECK(json::from_ubjson(vT, true, false).is_discarded()); + + std::vector vS = {'{', '#', 'i', 2, 'i', 1, 'a', 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(vS), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(vS), "[json.exception.parse_error.110] parse error at 10: unexpected end of input"); + CHECK(json::from_ubjson(vS, true, false).is_discarded()); + + std::vector v = {'{', 'i', 1, 'a', 'i', 1}; + CHECK_THROWS_AS(json::from_ubjson(v), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v), "[json.exception.parse_error.110] parse error at 7: unexpected end of input"); + CHECK(json::from_ubjson(v, true, false).is_discarded()); + + std::vector v2 = {'{', 'i', 1, 'a', 'i', 1, 'i'}; + CHECK_THROWS_AS(json::from_ubjson(v2), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v2), "[json.exception.parse_error.110] parse error at 8: unexpected end of input"); + CHECK(json::from_ubjson(v2, true, false).is_discarded()); + + std::vector v3 = {'{', 'i', 1, 'a'}; + CHECK_THROWS_AS(json::from_ubjson(v3), json::parse_error&); + CHECK_THROWS_WITH(json::from_ubjson(v3), "[json.exception.parse_error.110] parse error at 5: unexpected end of input"); + CHECK(json::from_ubjson(v3, true, false).is_discarded()); + } } SECTION("writing optimized values")