summaryrefslogtreecommitdiff
path: root/json4cpp/tests/src/unit-32bit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'json4cpp/tests/src/unit-32bit.cpp')
-rw-r--r--json4cpp/tests/src/unit-32bit.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/json4cpp/tests/src/unit-32bit.cpp b/json4cpp/tests/src/unit-32bit.cpp
new file mode 100644
index 0000000000..e160304e88
--- /dev/null
+++ b/json4cpp/tests/src/unit-32bit.cpp
@@ -0,0 +1,134 @@
+// __ _____ _____ _____
+// __| | __| | | | JSON for Modern C++ (supporting code)
+// | | |__ | | | | | | version 3.12.0
+// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+//
+// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+// SPDX-License-Identifier: MIT
+
+#include "doctest_compatibility.h"
+
+#include <nlohmann/json.hpp>
+using nlohmann::json;
+
+#include <climits> // SIZE_MAX
+#include <limits> // numeric_limits
+
+template <typename OfType, typename T, bool MinInRange, bool MaxInRange>
+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) // NOLINT(readability-math-missing-parentheses)
+{
+ 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 const val_min = std::numeric_limits<type>::min();
+ type const val_min2 = val_min + 1;
+ type const val_max = std::numeric_limits<type>::max();
+ type const val_max2 = val_max - 1;
+
+ REQUIRE(CHAR_BIT == 8);
+
+ std::string of_type_str;
+ if (std::is_unsigned<of_type>::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<type>::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<of_type>(val_min));
+ CHECK(value_in_range_of<of_type>(val_min2));
+ }
+ else
+ {
+ CHECK_FALSE(value_in_range_of<of_type>(val_min));
+ CHECK_FALSE(value_in_range_of<of_type>(val_min2));
+ }
+
+ if (max_in_range)
+ {
+ CHECK(value_in_range_of<of_type>(val_max));
+ CHECK(value_in_range_of<of_type>(val_max2));
+ }
+ else
+ {
+ CHECK_FALSE(value_in_range_of<of_type>(val_max));
+ CHECK_FALSE(value_in_range_of<of_type>(val_max2));
+ }
+}
+
+TEST_CASE("32bit")
+{
+ REQUIRE(SIZE_MAX == 0xffffffff);
+}
+
+TEST_CASE_TEMPLATE_INVOKE(value_in_range_of_test, \
+ trait_test_arg<std::size_t, std::int32_t, false, true>, \
+ trait_test_arg<std::size_t, std::uint32_t, true, true>, \
+ trait_test_arg<std::size_t, std::int64_t, false, false>, \
+ trait_test_arg<std::size_t, std::uint64_t, true, false>);
+
+TEST_CASE("BJData")
+{
+ SECTION("parse errors")
+ {
+ SECTION("array")
+ {
+ SECTION("optimized array: negative size")
+ {
+ std::vector<uint8_t> const vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'};
+ std::vector<uint8_t> const vMX = {'[', '$', 'U', '#', '[', 'M', 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 'U', 0x01, ']'};
+
+ 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&);
+ CHECK(json::from_bjdata(vM, true, false).is_discarded());
+
+ CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vMX), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&);
+ CHECK(json::from_bjdata(vMX, true, false).is_discarded());
+ }
+
+ SECTION("optimized array: integer value overflow")
+ {
+ std::vector<uint8_t> const vL = {'[', '#', 'L', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F};
+ std::vector<uint8_t> const vM = {'[', '$', 'M', '#', '[', 'I', 0x00, 0x20, 'M', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, ']'};
+
+ json _;
+ CHECK_THROWS_WITH_AS(_ = json::from_bjdata(vL), "[json.exception.out_of_range.408] syntax error while parsing BJData size: integer value overflow", json::out_of_range&);
+ CHECK(json::from_bjdata(vL, true, false).is_discarded());
+
+ 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&);
+ CHECK(json::from_bjdata(vM, true, false).is_discarded());
+ }
+ }
+ }
+}