#include "doctest_compatibility.h" #include using nlohmann::json; #include // SIZE_MAX #include // numeric_limits template struct trait_test_arg { using of_type = OfType; using type = T; static constexpr bool min_in_range = MinInRange; static constexpr bool max_in_range = MaxInRange; }; TEST_CASE_TEMPLATE_DEFINE("value_in_range_of trait", T, value_in_range_of_test) { using nlohmann::detail::value_in_range_of; using of_type = typename T::of_type; using type = typename T::type; constexpr bool min_in_range = T::min_in_range; constexpr bool max_in_range = T::max_in_range; type val_min = std::numeric_limits::min(); type val_min2 = val_min + 1; type val_max = std::numeric_limits::max(); type val_max2 = val_max - 1; REQUIRE(CHAR_BIT == 8); std::string of_type_str; if (std::is_unsigned::value) { of_type_str += "u"; } of_type_str += "int"; of_type_str += std::to_string(sizeof(of_type) * 8); INFO("of_type := ", of_type_str); std::string type_str; if (std::is_unsigned::value) { type_str += "u"; } type_str += "int"; type_str += std::to_string(sizeof(type) * 8); INFO("type := ", type_str); CAPTURE(val_min); CAPTURE(min_in_range); CAPTURE(val_max); CAPTURE(max_in_range); if (min_in_range) { CHECK(value_in_range_of(val_min)); CHECK(value_in_range_of(val_min2)); } else { CHECK_FALSE(value_in_range_of(val_min)); CHECK_FALSE(value_in_range_of(val_min2)); } if (max_in_range) { CHECK(value_in_range_of(val_max)); CHECK(value_in_range_of(val_max2)); } else { CHECK_FALSE(value_in_range_of(val_max)); CHECK_FALSE(value_in_range_of(val_max2)); } } TEST_CASE("32bit") { REQUIRE(SIZE_MAX == 0xffffffff); } TEST_CASE_TEMPLATE_INVOKE(value_in_range_of_test, \ trait_test_arg, \ trait_test_arg, \ trait_test_arg, \ trait_test_arg); TEST_CASE("BJData") { SECTION("parse errors") { SECTION("array") { SECTION("optimized array: no size following type") { std::vector v = {'[', '$', 'i', 2}; json _; CHECK_THROWS_WITH_AS(_ = json::from_bjdata(v), "[json.exception.parse_error.112] parse error at byte 4: syntax error while parsing BJData size: expected '#' after type information; last byte: 0x02", json::parse_error&); } SECTION("optimized array: negative size") { std::vector vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'}; json _; CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vM), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&); } } } }