//     __ _____ _____ _____
//  __|  |   __|     |   | |  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

// cmake/test.cmake selects the C++ standard versions with which to build a
// unit test based on the presence of JSON_HAS_CPP_<VERSION> macros.
// When using macros that are only defined for particular versions of the standard
// (e.g., JSON_HAS_FILESYSTEM for C++17 and up), please mention the corresponding
// version macro in a comment close by, like this:
// JSON_HAS_CPP_<VERSION> (do not remove; see note at top of file)

#include "doctest_compatibility.h"

// for some reason including this after the json header leads to linker errors with VS 2017...
#include <locale>

// skip tests if JSON_DISABLE_TUPLE_REFERENCE_CONVERSION=1 (#2226)
#if defined(JSON_DISABLE_TUPLE_REFERENCE_CONVERSION) && (JSON_DISABLE_TUPLE_REFERENCE_CONVERSION == 1)
    #define SKIP_TESTS_FOR_TUPLE_REFERENCE_CONVERSION
#endif

// clang before 4 and GCC before 5 cannot create a std::tuple of basic_json
// references at all, with or without JSON_DISABLE_TUPLE_REFERENCE_CONVERSION:
// the tuple constructors make them instantiate basic_json's conversion operator
// for libstdc++'s internal tuple bases, which fails hard
#if (defined(__clang__) && __clang_major__ < 4) || (!defined(__clang__) && defined(__GNUC__) && __GNUC__ < 5)
    #define SKIP_TESTS_FOR_JSON_REFERENCE_TUPLES
#endif

#define JSON_TESTS_PRIVATE
#include <nlohmann/json.hpp>
using nlohmann::json;
using nlohmann::ordered_json;
#ifdef JSON_TEST_NO_GLOBAL_UDLS
    using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
#endif

#include <cstdio>
#include <cstdlib>
#include <list>
#include <new>
#include <tuple>
#include <type_traits>
#include <utility>

#include "test_utils.hpp"

#ifdef JSON_HAS_CPP_17
    #include <any>
    #include <variant>
#endif

#ifdef JSON_HAS_CPP_17
    #if __has_include(<optional>)
        #include <optional>
    #elif __has_include(<experimental/optional>)
        #include <experimental/optional>
    #endif

    /////////////////////////////////////////////////////////////////////
    // for #4804
    /////////////////////////////////////////////////////////////////////
    using json_4804 = nlohmann::json::with_binary_t<std::vector<std::byte>>;
#endif

#ifdef JSON_HAS_CPP_20
    #if __has_include(<span>)
        #include <span>
    #endif
#endif

/////////////////////////////////////////////////////////////////////
// for #4825 - explicitly instantiating basic_json must compile; this
// forces instantiation of binary_writer::write_bjdata_ndarray, whose
// static_cast<string_t> was ambiguous under explicit instantiation on
// C++17. Merely compiling this translation unit is the regression test.
/////////////////////////////////////////////////////////////////////
template class nlohmann::basic_json<>;

/////////////////////////////////////////////////////////////////////
// for #4440
/////////////////////////////////////////////////////////////////////
#if JSON_HAS_RANGES == 1
    #include <ranges>
#endif

// NLOHMANN_JSON_SERIALIZE_ENUM uses a static std::pair
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")

/////////////////////////////////////////////////////////////////////
// for #1021
/////////////////////////////////////////////////////////////////////

using float_json = nlohmann::json::with_float_t<float>;

#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
namespace
{
// An allocator whose allocate() can be told to fail on demand, so tests can
// check that ~basic_json() tolerates - in fact, after #5135, never even
// triggers - an allocation failure. This replaces an earlier version of
// this test that overrode the process-wide ::operator new/::operator
// delete, which affected every allocation in the whole unit-regression2
// binary rather than just the values under test.
std::size_t failing_allocator_allocations = 0;
std::size_t failing_allocator_deallocations = 0;
bool fail_next_allocation = false;

template<class T>
struct failing_allocator : std::allocator<T>
{
    using std::allocator<T>::allocator;

    failing_allocator() noexcept = default;
    template<class U>
    failing_allocator(const failing_allocator<U>& /*unused*/) noexcept {} // NOLINT(google-explicit-constructor)

    T* allocate(std::size_t n)
    {
        if (fail_next_allocation)
        {
            fail_next_allocation = false;
            throw std::bad_alloc();
        }
        ++failing_allocator_allocations;
        return std::allocator<T>::allocate(n);
    }

    void deallocate(T* p, std::size_t n)
    {
        ++failing_allocator_deallocations;
        std::allocator<T>::deallocate(p, n);
    }

    template<class U>
    struct rebind
    {
        using other = failing_allocator<U>;
    };
};

using failing_json = nlohmann::json::with_allocator_t<failing_allocator>;
using failing_ordered_json = nlohmann::ordered_json::with_allocator_t<failing_allocator>;

// builds `depth` levels of nesting around a scalar, iteratively (never
// recursing: each wrap only moves the previous, already-built value, which
// is O(1)), each level an array or an object depending on `nest_objects`
template<class BasicJsonType>
BasicJsonType make_deep_nest(std::size_t depth, bool nest_objects)
{
    BasicJsonType v = 0;
    for (std::size_t i = 0; i < depth; ++i)
    {
        if (nest_objects)
        {
            BasicJsonType wrapper = BasicJsonType::object();
            wrapper["x"] = std::move(v);
            v = std::move(wrapper);
        }
        else
        {
            BasicJsonType wrapper = BasicJsonType::array();
            wrapper.push_back(std::move(v));
            v = std::move(wrapper);
        }
    }
    return v;
}
} // namespace
#endif

/////////////////////////////////////////////////////////////////////
// for #1647
/////////////////////////////////////////////////////////////////////
namespace
{
struct NonDefaultFromJsonStruct
{};

inline bool operator==(NonDefaultFromJsonStruct const& /*unused*/, NonDefaultFromJsonStruct const& /*unused*/)
{
    return true;
}

enum class for_1647
{
    one,
    two
};

// NOLINTNEXTLINE(misc-const-correctness): this is a false positive
NLOHMANN_JSON_SERIALIZE_ENUM(for_1647,
{
    {for_1647::one, "one"},
    {for_1647::two, "two"},
})
}  // namespace

/////////////////////////////////////////////////////////////////////
// for #1299
/////////////////////////////////////////////////////////////////////

struct Data
{
    Data() = default;
    Data(std::string a_, std::string b_)
        : a(std::move(a_))
        , b(std::move(b_))
    {}
    std::string a{}; // NOLINT(readability-redundant-member-init)
    std::string b{}; // NOLINT(readability-redundant-member-init)
};

void from_json(const json& j, Data& data); // NOLINT(misc-use-internal-linkage)
void from_json(const json& j, Data& data)
{
    j["a"].get_to(data.a);
    j["b"].get_to(data.b);
}

bool operator==(Data const& lhs, Data const& rhs); // NOLINT(misc-use-internal-linkage)
bool operator==(Data const& lhs, Data const& rhs)
{
    return lhs.a == rhs.a && lhs.b == rhs.b;
}

//bool operator!=(Data const& lhs, Data const& rhs)
//{
//    return !(lhs == rhs);
//}

namespace nlohmann
{
template<>
struct adl_serializer<NonDefaultFromJsonStruct>
{
    static NonDefaultFromJsonStruct from_json(json const& /*unused*/) noexcept
    {
        return {};
    }
};
}  // namespace nlohmann

/////////////////////////////////////////////////////////////////////
// for #1805
/////////////////////////////////////////////////////////////////////

struct NotSerializableData
{
    int mydata;
    float myfloat;
};

/////////////////////////////////////////////////////////////////////
// for #2574
/////////////////////////////////////////////////////////////////////

struct NonDefaultConstructible
{
    explicit NonDefaultConstructible(int a)
        : x(a)
    {}
    int x;
};

namespace nlohmann
{
template<>
struct adl_serializer<NonDefaultConstructible>
{
    static NonDefaultConstructible from_json(json const& j)
    {
        return NonDefaultConstructible(j.get<int>());
    }
};
}  // namespace nlohmann

/////////////////////////////////////////////////////////////////////
// for #2982
/////////////////////////////////////////////////////////////////////

template<class T>
class my_allocator : public std::allocator<T>
{
  public:
    using std::allocator<T>::allocator;

    my_allocator() = default;
    template<class U> my_allocator(const my_allocator<U>& /*unused*/) { }

    template <class U>
    struct rebind
    {
        using other = my_allocator<U>;
    };
};

/////////////////////////////////////////////////////////////////////
// for #3669
/////////////////////////////////////////////////////////////////////

// mimics boost::optional's converting constructor, whose SFINAE check asks
// whether T is constructible from const U&
template<class T, class Arg>
struct issue3669_is_constructible
{
    template<class T2, class A2, class = decltype(T2(std::declval<A2>()))>
    static char test(int);
    template<class, class>
    static long test(...);
    static constexpr bool value = sizeof(test<T, Arg>(0)) == 1;
};

template<class T>
class issue3669_optional
{
  public:
    issue3669_optional() = default;
    template<class U>
    issue3669_optional(const issue3669_optional<U>& /*unused*/, // NOLINT(google-explicit-constructor,hicpp-explicit-conversions)
                       typename std::enable_if<issue3669_is_constructible<T, const U&>::value, bool>::type /*unused*/ = true) {}
};

class Issue3669Dummy
{
  public:
    explicit Issue3669Dummy(const json& /*unused*/) {}
};

class Issue3669Holder
{
    issue3669_optional<Issue3669Dummy> d{};

    // GCC < 11 (C++11/14) rejects a free to_json(json&, const Issue3669Holder&)
    // here, because ADL for Issue3669Dummy finds it and closes an instantiation
    // cycle; a hidden friend is only visible to ADL for Issue3669Holder
    friend void to_json(json& j, const Issue3669Holder& h)
    {
        static_cast<void>(h.d); // silence -Wunused-private-field
        j = "holder";
    }
};

TEST_CASE("regression tests 2")
{
    SECTION("issue #1001 - Fix memory leak during parser callback")
    {
        const auto* geojsonExample = R"(
          { "type": "FeatureCollection",
            "features": [
              { "type": "Feature",
                "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
                "properties": {"prop0": "value0"}
                },
              { "type": "Feature",
                "geometry": {
                  "type": "LineString",
                  "coordinates": [
                    [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
                    ]
                  },
                "properties": {
                  "prop0": "value0",
                  "prop1": 0.0
                  }
                },
              { "type": "Feature",
                 "geometry": {
                   "type": "Polygon",
                   "coordinates": [
                     [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
                       [100.0, 1.0], [100.0, 0.0] ]
                     ]
                 },
                 "properties": {
                   "prop0": "value0",
                   "prop1": {"this": "that"}
                   }
                 }
               ]
             })";

        const json::parser_callback_t cb = [&](int /*level*/, json::parse_event_t event, json & parsed) noexcept
        {
            // skip uninteresting events
            if (event == json::parse_event_t::value && !parsed.is_primitive())
            {
                return false;
            }

            switch (event)
            {
                case json::parse_event_t::key:
                {
                    return true;
                }
                case json::parse_event_t::value:
                {
                    return false;
                }
                case json::parse_event_t::object_start:
                {
                    return true;
                }
                case json::parse_event_t::object_end:
                {
                    return false;
                }
                case json::parse_event_t::array_start:
                {
                    return true;
                }
                case json::parse_event_t::array_end:
                {
                    return false;
                }

                default:
                {
                    return true;
                }
            }
        };

        auto j = json::parse(geojsonExample, cb, true);
        CHECK(j == json());
    }

    SECTION("issue #1021 - to/from_msgpack only works with standard typization")
    {
        float_json j = 1000.0;
        CHECK(float_json::from_cbor(float_json::to_cbor(j)) == j);
        CHECK(float_json::from_msgpack(float_json::to_msgpack(j)) == j);
        CHECK(float_json::from_ubjson(float_json::to_ubjson(j)) == j);
        CHECK(float_json::from_bon8(float_json::to_bon8(j)) == j);

        float_json j2 = {1000.0, 2000.0, 3000.0};
        CHECK(float_json::from_ubjson(float_json::to_ubjson(j2, true, true)) == j2);

        // half-precision floats of both signs are converted to the float type
        CHECK(float_json::from_cbor(std::vector<std::uint8_t> {0xF9, 0xC0, 0x00}) == -2.0f);
        CHECK(float_json::from_cbor(std::vector<std::uint8_t> {0xF9, 0x3C, 0x00}) == 1.0f);
    }

    SECTION("issue #1045 - Using STL algorithms with JSON containers with expected results?")
    {
        json diffs = nlohmann::json::array();
        json m1{{"key1", 42}};
        json m2{{"key2", 42}};
        auto p1 = m1.items();
        auto p2 = m2.items();

        using it_type = decltype(p1.begin());

        std::set_difference(
            p1.begin(),
            p1.end(),
            p2.begin(),
            p2.end(),
            std::inserter(diffs, diffs.end()),
            [&](const it_type & e1, const it_type & e2) -> bool
        {
            using comper_pair = std::pair<std::string, decltype(e1.value())>;              // Trying to avoid unneeded copy
            return comper_pair(e1.key(), e1.value()) < comper_pair(e2.key(), e2.value());  // Using pair comper
        });

        CHECK(diffs.size() == 1);  // Note the change here, was 2
    }

#ifdef JSON_HAS_CPP_17
    SECTION("issue #1292 - Serializing std::variant causes stack overflow")
    {
        static_assert(!std::is_constructible<json, std::variant<int, float>>::value, "unexpected value");
    }
#endif

    SECTION("issue #1299 - compile error in from_json converting to container "
            "with std::pair")
    {
        const json j =
        {
            {"1", {{"a", "testa_1"}, {"b", "testb_1"}}},
            {"2", {{"a", "testa_2"}, {"b", "testb_2"}}},
            {"3", {{"a", "testa_3"}, {"b", "testb_3"}}},
        };

        const std::map<std::string, Data> expected
        {
            {"1", {"testa_1", "testb_1"}},
            {"2", {"testa_2", "testb_2"}},
            {"3", {"testa_3", "testb_3"}},
        };
        const auto data = j.get<decltype(expected)>();
        CHECK(expected == data);
    }

    SECTION("issue #1445 - buffer overflow in dumping invalid utf-8 strings")
    {
        SECTION("a bunch of -1, ensure_ascii=true")
        {
            const auto length = 300;

            json dump_test;
            dump_test["1"] = std::string(length, static_cast<std::string::value_type>(-1));

            std::string expected = R"({"1":")";
            for (int i = 0; i < length; ++i)
            {
                expected += "\\ufffd";
            }
            expected += "\"}";

            auto s = dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace);
            CHECK(s == expected);
        }
        SECTION("a bunch of -2, ensure_ascii=false")
        {
            const auto length = 500;

            json dump_test;
            dump_test["1"] = std::string(length, static_cast<std::string::value_type>(-2));

            std::string expected = R"({"1":")";
            for (int i = 0; i < length; ++i)
            {
                expected += "\xEF\xBF\xBD";
            }
            expected += "\"}";

            auto s = dump_test.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace);
            CHECK(s == expected);
        }
        SECTION("test case in issue #1445")
        {
            nlohmann::json dump_test;
            const std::array<int, 108> data =
            {
                {109, 108, 103, 125, -122, -53, 115, 18, 3, 0, 102, 19, 1, 15, -110, 13, -3, -1, -81, 32, 2, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, 2, 0, 0, 96, -118, 46, -116, 46, 109, -84, -87, 108, 14, 109, -24, -83, 13, -18, -51, -83, -52, -115, 14, 6, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 35, -74, -73, 55, 57, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, -96, -54, -28, -26}
            };
            std::string s;
            for (const int i : data)
            {
                s += static_cast<char>(i);
            }
            dump_test["1"] = s;
            // dump() is nodiscard; this only checks that dumping does not throw/crash
            utils::ignore_return_value(dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace));
        }
    }

    SECTION("issue #1447 - Integer Overflow (OSS-Fuzz 12506)")
    {
        const json j = json::parse("[-9223372036854775808]");
        CHECK(j.dump() == "[-9223372036854775808]");
    }

    SECTION("issue #1708 - minimum value of int64_t can be outputted")
    {
        constexpr auto smallest = (std::numeric_limits<int64_t>::min)();
        const json j = smallest;
        CHECK(j.dump() == std::to_string(smallest));
    }

    SECTION("issue #1727 - Contains with non-const lvalue json_pointer picks the wrong overload")
    {
        const json j = {{"root", {{"settings", {{"logging", true}}}}}};

        auto jptr1 = "/root/settings/logging"_json_pointer;
        auto jptr2 = json::json_pointer{"/root/settings/logging"};

        CHECK(j.contains(jptr1));
        CHECK(j.contains(jptr2));
    }

    SECTION("issue #1647 - compile error when deserializing enum if both non-default from_json and non-member operator== exists for other type")
    {
        // does not compile on ICPC when targeting C++20
#if !(defined(__INTEL_COMPILER) && __cplusplus >= 202000)
        {
            const json j;
            const NonDefaultFromJsonStruct x(j);
            NonDefaultFromJsonStruct y;
            CHECK(x == y);
        }
#endif

        auto val = nlohmann::json("one").get<for_1647>();
        CHECK(val == for_1647::one);
        const json j = val;
    }

    SECTION("issue #1715 - json::from_cbor does not respect allow_exceptions = false when input is string literal")
    {
        SECTION("string literal")
        {
            const json cbor = json::from_cbor("B", true, false);
            CHECK(cbor.is_discarded());
        }

        SECTION("string array")
        {
            const std::array<char, 2> input = {{'B', 0x00}};
            const json cbor = json::from_cbor(input, true, false);
            CHECK(cbor.is_discarded());
        }

        SECTION("std::string")
        {
            const json cbor = json::from_cbor(std::string("B"), true, false);
            CHECK(cbor.is_discarded());
        }
    }

    SECTION("issue #1805 - A pair<T1, T2> is json constructible only if T1 and T2 are json constructible")
    {
        static_assert(!std::is_constructible<json, std::pair<std::string, NotSerializableData>>::value, "unexpected result");
        static_assert(!std::is_constructible<json, std::pair<NotSerializableData, std::string>>::value, "unexpected result");
        static_assert(std::is_constructible<json, std::pair<int, std::string>>::value, "unexpected result");
    }
    SECTION("issue #1825 - A tuple<Args..> is json constructible only if all T in Args are json constructible")
    {
        static_assert(!std::is_constructible<json, std::tuple<std::string, NotSerializableData>>::value, "unexpected result");
        static_assert(!std::is_constructible<json, std::tuple<NotSerializableData, std::string>>::value, "unexpected result");
        static_assert(std::is_constructible<json, std::tuple<int, std::string>>::value, "unexpected result");
    }

    SECTION("issue #1983 - JSON patch diff for op=add formation is not as per standard (RFC 6902)")
    {
        const auto source = R"({ "foo": [ "1", "2" ] })"_json;
        const auto target = R"({"foo": [ "1", "2", "3" ]})"_json;
        const auto result = json::diff(source, target);
        CHECK(result.dump() == R"([{"op":"add","path":"/foo/-","value":"3"}])");
    }

    SECTION("issue #2067 - cannot serialize binary data to text JSON")
    {
        const std::array<unsigned char, 23> data = {{0x81, 0xA4, 0x64, 0x61, 0x74, 0x61, 0xC4, 0x0F, 0x33, 0x30, 0x30, 0x32, 0x33, 0x34, 0x30, 0x31, 0x30, 0x37, 0x30, 0x35, 0x30, 0x31, 0x30}};
        const json j = json::from_msgpack(data.begin(), data.end());
        // dump() is nodiscard; this only checks that dumping does not throw
        CHECK_NOTHROW(
            utils::ignore_return_value(
                j.dump(4,                             // Indent
                       ' ',                           // Indent char
                       false,                         // Ensure ascii
                       json::error_handler_t::strict  // Error
                      )));
    }

#ifndef SKIP_TESTS_FOR_TUPLE_REFERENCE_CONVERSION
    SECTION("issue #2226 - std::tuple dangling reference - implicit conversion")
    {
        // by default, a one-element tuple holding a json reference converts to
        // a one-element array; JSON_DISABLE_TUPLE_REFERENCE_CONVERSION removes
        // this conversion (see unit-disable-tuple-reference-conversion.cpp)
        const json j = true;
        CHECK(std::is_constructible<json, std::tuple<const json&>>::value);
#ifndef SKIP_TESTS_FOR_JSON_REFERENCE_TUPLES
        CHECK(json(std::forward_as_tuple(j)) == json::array({true}));
#endif
    }
#endif

    SECTION("PR #2181 - regression bug with lvalue")
    {
        // see https://github.com/nlohmann/json/pull/2181#issuecomment-653326060
        const json j{{"x", "test"}};
        const std::string defval = "default value";
        auto val = j.value("x", defval); // NOLINT(bugprone-unused-local-non-trivial-variable)
        auto val2 = j.value("y", defval); // NOLINT(bugprone-unused-local-non-trivial-variable)
    }

    SECTION("issue #2293 - eof doesn't cause parsing to stop")
    {
        const std::vector<uint8_t> data =
        {
            0x7B,
            0x6F,
            0x62,
            0x6A,
            0x65,
            0x63,
            0x74,
            0x20,
            0x4F,
            0x42
        };
        const json result = json::from_cbor(data, true, false);
        CHECK(result.is_discarded());
    }

    SECTION("issue #2315 - json.update and vector<pair>does not work with ordered_json")
    {
        nlohmann::ordered_json jsonAnimals = {{"animal", "dog"}};
        const nlohmann::ordered_json jsonCat = {{"animal", "cat"}};
        jsonAnimals.update(jsonCat);
        CHECK(jsonAnimals["animal"] == "cat");

        auto jsonAnimals_parsed = nlohmann::ordered_json::parse(jsonAnimals.dump());
        CHECK(jsonAnimals == jsonAnimals_parsed);

        const std::vector<std::pair<std::string, int64_t>> intData = {std::make_pair("aaaa", 11),
                                                                      std::make_pair("bbb", 222)
                                                                     };
        nlohmann::ordered_json jsonObj;
        for (const auto& data : intData)
        {
            jsonObj[data.first] = data.second;
        }
        CHECK(jsonObj["aaaa"] == 11);
        CHECK(jsonObj["bbb"] == 222);
    }

    SECTION("issue #2330 - ignore_comment=true fails on multiple consecutive lines starting with comments")
    {
        const std::string ss = "//\n//\n{\n}\n";
        const json j = json::parse(ss, nullptr, true, true);
        CHECK(j.dump() == "{}");
    }

#ifdef JSON_HAS_CPP_20
#ifndef _LIBCPP_VERSION // see https://github.com/nlohmann/json/issues/4490
    // classic Intel ICC reports <span> as includable but cannot actually compile
    // std::span/std::as_bytes usage below
#if __has_include(<span>) && !defined(__ICC) && !defined(__INTEL_COMPILER)
    SECTION("issue #2546 - parsing containers of std::byte")
    {
        const char DATA[] = R"("Hello, world!")"; // NOLINT(misc-const-correctness,cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
        // exclude the trailing '\0' that string-literal initialization adds to
        // DATA: std::span(DATA) would span the full array extent (including
        // that NUL), which is only silently accepted as end-of-input by default
        // and would fail under JSON_STRICT_NUL_HANDLING
        const auto s = std::as_bytes(std::span(DATA, sizeof(DATA) - 1));
        const json j = json::parse(s);
        CHECK(j.dump() == "\"Hello, world!\"");
    }
#endif
#endif
#endif

    SECTION("issue #2574 - Deserialization to std::array, std::pair, and std::tuple with non-default constructable types fails")
    {
        SECTION("std::array")
        {
            {
                const json j = {7, 4};
                auto arr = j.get<std::array<NonDefaultConstructible, 2>>();
                CHECK(arr[0].x == 7);
                CHECK(arr[1].x == 4);
            }

            {
                const json j = 7;
                CHECK_THROWS_AS((j.get<std::array<NonDefaultConstructible, 1>>()), json::type_error);
            }
        }

        SECTION("std::pair")
        {
            {
                const json j = {3, 8};
                auto p = j.get<std::pair<NonDefaultConstructible, NonDefaultConstructible>>();
                CHECK(p.first.x == 3);
                CHECK(p.second.x == 8);
            }

            {
                const json j = {4, 1};
                auto p = j.get<std::pair<int, NonDefaultConstructible>>();
                CHECK(p.first == 4);
                CHECK(p.second.x == 1);
            }

            {
                const json j = {6, 7};
                auto p = j.get<std::pair<NonDefaultConstructible, int>>();
                CHECK(p.first.x == 6);
                CHECK(p.second == 7);
            }

            {
                const json j = 7;
                CHECK_THROWS_AS((j.get<std::pair<NonDefaultConstructible, int>>()), json::type_error);
            }
        }

        SECTION("std::tuple")
        {
            {
                const json j = {9};
                auto t = j.get<std::tuple<NonDefaultConstructible>>();
                CHECK(std::get<0>(t).x == 9);
            }

            {
                const json j = {9, 8, 7};
                auto t = j.get<std::tuple<NonDefaultConstructible, int, NonDefaultConstructible>>();
                CHECK(std::get<0>(t).x == 9);
                CHECK(std::get<1>(t) == 8);
                CHECK(std::get<2>(t).x == 7);
            }

            {
                const json j = 7;
                CHECK_THROWS_AS((j.get<std::tuple<NonDefaultConstructible>>()), json::type_error);
            }
        }
    }

    SECTION("issue #4530 - Serialization of empty tuple")
    {
        const auto source_tuple = std::tuple<>();
        const nlohmann::json j = source_tuple;

        CHECK(j.get<decltype(source_tuple)>() == source_tuple);
        CHECK("[]" == j.dump());
    }

    SECTION("issue #2865 - ASAN detects memory leaks")
    {
        // the code below is expected to not leak memory
        {
            nlohmann::json o;
            const std::string s = "bar";

            nlohmann::to_json(o["foo"], s);

            nlohmann::json p = o;

            // call to_json with a non-null JSON value
            nlohmann::to_json(p["foo"], s);
        }

        {
            nlohmann::json o;
            const std::string s = "bar";

            nlohmann::to_json(o["foo"], s);

            // call to_json with a non-null JSON value
            nlohmann::to_json(o["foo"], s);
        }
    }

    SECTION("issue #2825 - Properly constrain the basic_json conversion operator")
    {
        static_assert(std::is_copy_assignable<nlohmann::ordered_json>::value, "ordered_json must be copy assignable");
    }

    SECTION("issue #2958 - Inserting in unordered json using a pointer retains the leading slash")
    {
        const std::string p = "/root";

        json test1;
        test1[json::json_pointer(p)] = json::object();
        CHECK(test1.dump() == "{\"root\":{}}");

        ordered_json test2;
        test2[ordered_json::json_pointer(p)] = json::object();
        CHECK(test2.dump() == "{\"root\":{}}");

        // json::json_pointer and ordered_json::json_pointer are the same type; behave as above
        ordered_json test3;
        test3[json::json_pointer(p)] = json::object();
        CHECK(std::is_same<json::json_pointer::string_t, ordered_json::json_pointer::string_t>::value);
        CHECK(test3.dump() == "{\"root\":{}}");
    }

    SECTION("issue #2982 - to_{binary format} does not provide a mechanism for specifying a custom allocator for the returned type")
    {
        std::vector<std::uint8_t, my_allocator<std::uint8_t>> my_vector;
        const json j = {1, 2, 3, 4};
        json::to_cbor(j, my_vector);
        json k = json::from_cbor(my_vector);
        CHECK(j == k);
    }

    SECTION("issue #4552 - UTF-8 invalid characters are not always ignored when dumping with error_handler_t::ignore")
    {
        json node;
        node["test"] = "test\334\005";
        CHECK(node.dump(-1, ' ', false, json::error_handler_t::ignore) == "{\"test\":\"test\\u0005\"}");
        CHECK(node.dump(-1, ' ', false, json::error_handler_t::keep) == "{\"test\":\"test\334\\u0005\"}");
        CHECK(node.dump(-1, ' ', true, json::error_handler_t::keep) == "{\"test\":\"test\334\\u0005\"}");
    }

#ifdef JSON_HAS_CPP_17
    SECTION("issue #5066 - MSVC converts json to std::variant<json> via the conversion operator")
    {
        // std::variant<json> must not be retrievable via get<>(), because otherwise the
        // implicit conversion operator becomes a candidate that MSVC picks over the variant's
        // converting constructor, routing a number through the string from_json overload
        static_assert(!nlohmann::detail::is_detected<nlohmann::detail::get_template_function, const json&, std::variant<json>>::value,
                      "std::variant<json> must not be retrievable via get<>()");

        // clang before 7 cannot instantiate libstdc++'s std::variant<json>
#if !(defined(__clang__) && __clang_major__ < 7)
        // push_back, not emplace_back: #5066 needs the implicit conversion
        // from json to the vector's value type
        std::vector<std::variant<json>> v;
        v.push_back(json(1)); // NOLINT(hicpp-use-emplace,modernize-use-emplace)
        CHECK(std::get<0>(v[0]) == 1);
#endif
    }
#endif

    SECTION("issue #3669 - invalid use of incomplete type with optional member and to_json")
    {
        const Issue3669Holder h{};
        const Issue3669Holder h2(h); // NOLINT(performance-unnecessary-copy-initialization)
        const json j = h2;
        CHECK(j == "holder");
    }

}

TEST_CASE("regression test - parser callback must not lose a duplicate key's prior value")
{
    // a callback that rejects only the scalar value 2
    const json::parser_callback_t drop_value_2 = [](int /*depth*/, json::parse_event_t ev, json & v) noexcept
    {
        return !(ev == json::parse_event_t::value && v == 2);
    };

    SECTION("duplicate key, second (scalar) value rejected - prior value is restored")
    {
        const json j = json::parse(R"({"a":1,"a":2})", drop_value_2);
        CHECK(j.dump() == "{\"a\":1}");
    }

    SECTION("duplicate key, second value is an object rejected at object_end - prior value is restored")
    {
        const json j = json::parse(R"({"a":1,"a":{"x":2}})",
                                   [](int depth, json::parse_event_t ev, json& /*parsed*/) noexcept
        {
            return !(ev == json::parse_event_t::object_end && depth == 1);
        });
        CHECK(j.dump() == "{\"a\":1}");
    }

    SECTION("duplicate key, second value is an array rejected at array_end - prior value is restored")
    {
        const json j = json::parse(R"({"a":1,"a":[9,9]})",
                                   [](int depth, json::parse_event_t ev, json& /*parsed*/) noexcept
        {
            return !(ev == json::parse_event_t::array_end && depth == 1);
        });
        CHECK(j.dump() == "{\"a\":1}");
    }

    SECTION("duplicate key, second value accepted (scalar) - last value wins")
    {
        const json j = json::parse(R"({"a":1,"a":2})", [](int, json::parse_event_t, json&) noexcept
        {
            return true;
        });
        CHECK(j.dump() == "{\"a\":2}");
    }

    SECTION("duplicate key, second value accepted (object) - last value wins")
    {
        const json j = json::parse(R"({"a":1,"a":{"x":2}})", [](int, json::parse_event_t, json&) noexcept
        {
            return true;
        });
        CHECK(j.dump() == "{\"a\":{\"x\":2}}");
    }

    SECTION("brand new (non-duplicate) key, value rejected - member is fully absent")
    {
        const json j = json::parse(R"({"a":1,"b":2})", drop_value_2);
        CHECK(j.dump() == "{\"a\":1}");
    }

    SECTION("duplicate key nested two levels deep")
    {
        const json j = json::parse(R"({"outer":{"a":1,"a":2}})", drop_value_2);
        CHECK(j.dump() == "{\"outer\":{\"a\":1}}");
    }

    SECTION("three occurrences of the same key - middle rejected, last accepted")
    {
        const json j = json::parse(R"({"k":1,"k":2,"k":3})", drop_value_2);
        CHECK(j.dump() == "{\"k\":3}");
    }
}

TEST_CASE("regression test - excessive binary container size honors allow_exceptions=false")
{
    // CBOR array with declared length 2^63
    const std::vector<std::uint8_t> cbor = {0x9b, 0x80, 0, 0, 0, 0, 0, 0, 0};
    // CBOR map with declared length 2^63
    const std::vector<std::uint8_t> cbor_m = {0xbb, 0x80, 0, 0, 0, 0, 0, 0, 0};
    // UBJSON array with declared length 2^63-1
    const std::vector<std::uint8_t> ubj = {'[', '#', 'L', 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
    // BJData array with declared length 2^63-1 (little endian)
    const std::vector<std::uint8_t> bjd = {'[', '#', 'L', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};

    // allow_exceptions=false must report failure instead of throwing/aborting
    CHECK(json::from_cbor(cbor, true, false).is_discarded());
    CHECK(json::from_cbor(cbor_m, true, false).is_discarded());
    CHECK(json::from_ubjson(ubj, true, false).is_discarded());
    CHECK(json::from_bjdata(bjd, true, false).is_discarded());

    // allow_exceptions=true (the default) must still throw exactly as before.
    // The exact message text is not checked here: on platforms where
    // std::size_t is 32-bit, the CBOR reader's own length-narrowing check
    // (get_container_size(), unrelated to this fix) intercepts a
    // declared length of 2^63 before it ever reaches the check this test
    // targets, with different (but equally valid, and already correct)
    // wording -- see unit-cbor.cpp for coverage of that message.
    json _;
    CHECK_THROWS_AS(_ = json::from_cbor(cbor), json::out_of_range);

    // regression guard: a genuinely truncated CBOR input must remain discarded
    CHECK(json::from_cbor(std::vector<std::uint8_t> {0x9b, 0, 0, 0, 0, 0, 0, 0, 0x02}, true, false).is_discarded());
}

#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
TEST_CASE("regression test #5135 - destructor never allocates, even under memory pressure")
{
    // Before the fix, ~basic_json() flattened a nested array/object into a
    // heap-allocated std::vector to avoid recursing; that allocation could
    // itself throw bad_alloc, which escapes a noexcept destructor and
    // terminates the program. destroy() no longer allocates anything, so
    // none of the sections below ever observe fail_next_allocation being
    // consumed: CHECK(fail_next_allocation) confirms it was never touched.

    SECTION("the original report: a small, mixed array/object nest")
    {
        failing_allocator_allocations = 0;
        failing_allocator_deallocations = 0;
        {
            const failing_json j = failing_json::array(
            {
                failing_json::array({1, 2}),
                failing_json::object({{"key", failing_json::array({3})}})
            });
            fail_next_allocation = true;
        } // j is destroyed here, with every further allocation set to fail

        CHECK(fail_next_allocation);
        fail_next_allocation = false;
        CHECK(failing_allocator_deallocations > 0);
    }

    SECTION("100000-deep nested array")
    {
        std::size_t allocations_before = 0;
        {
            const auto j = make_deep_nest<failing_json>(100000, false);
            allocations_before = failing_allocator_allocations;
            fail_next_allocation = true;
        }

        CHECK(fail_next_allocation);
        fail_next_allocation = false;
        CHECK(failing_allocator_allocations == allocations_before);
    }

    SECTION("100000-deep nested object")
    {
        std::size_t allocations_before = 0;
        {
            const auto j = make_deep_nest<failing_json>(100000, true);
            allocations_before = failing_allocator_allocations;
            fail_next_allocation = true;
        }

        CHECK(fail_next_allocation);
        fail_next_allocation = false;
        CHECK(failing_allocator_allocations == allocations_before);
    }

    SECTION("100000-deep nested ordered_json")
    {
        std::size_t allocations_before = 0;
        {
            const auto j = make_deep_nest<failing_ordered_json>(100000, true);
            allocations_before = failing_allocator_allocations;
            fail_next_allocation = true;
        }

        CHECK(fail_next_allocation);
        fail_next_allocation = false;
        CHECK(failing_allocator_allocations == allocations_before);
    }

    SECTION("wide and deep: 1000 arrays of 1000 elements, each a small nested object")
    {
        std::size_t allocations_before = 0;
        {
            failing_json wide = failing_json::array();
            for (std::size_t i = 0; i < 1000; ++i)
            {
                failing_json inner = failing_json::array();
                for (std::size_t k = 0; k < 1000; ++k)
                {
                    inner.push_back(failing_json::object({{"a", 1}, {"b", failing_json::array({1, 2, 3})}}));
                }
                wide.push_back(std::move(inner));
            }

            allocations_before = failing_allocator_allocations;
            fail_next_allocation = true;
        }

        CHECK(fail_next_allocation);
        fail_next_allocation = false;
        CHECK(failing_allocator_allocations == allocations_before);
    }
}
#endif

namespace
{
// a single-element chain of `depth` arrays, built iteratively (never
// recursing: each wrap only moves the previous, already-built value)
template<class BasicJsonType>
BasicJsonType make_single_chain(std::size_t depth)
{
    BasicJsonType v = 1;
    for (std::size_t i = 0; i < depth; ++i)
    {
        BasicJsonType wrapper = BasicJsonType::array();
        wrapper.push_back(std::move(v));
        v = std::move(wrapper);
    }
    return v;
}

// copies value first, to make sure nothing was corrupted by building it,
// then lets both the copy and the original destruct via normal scope exit
template<class BasicJsonType>
void check_destroy_edge_case(const BasicJsonType& value)
{
    const BasicJsonType copy = value; // NOLINT(performance-unnecessary-copy-initialization): the copy is the point
    CHECK(copy == value);
}
} // namespace

TEST_CASE_TEMPLATE("regression test #5135 - destroy() edge cases", BasicJsonType, json, ordered_json)
{
    using binary_t = typename BasicJsonType::binary_t;

    SECTION("mix of empty objects, empty arrays, non-empty containers, and scalars")
    {
        BasicJsonType root = BasicJsonType::array();
        root.push_back(BasicJsonType::object());
        root.push_back(BasicJsonType::array());
        root.push_back(BasicJsonType::object({{"k", 1}}));
        root.push_back(BasicJsonType::array({1, 2, 3}));
        root.push_back(nullptr);
        root.push_back(true);
        root.push_back(42);
        root.push_back(3.14);
        root.push_back("a string");
        root.push_back(BasicJsonType(binary_t({1, 2, 3})));
        check_destroy_edge_case(root);
    }

    SECTION("container child in first position only")
    {
        BasicJsonType root = BasicJsonType::array({BasicJsonType::array({1, 2}), 3, 4, 5});
        check_destroy_edge_case(root);
    }

    SECTION("container child in last position only")
    {
        BasicJsonType root = BasicJsonType::array({1, 2, 3, BasicJsonType::array({4, 5})});
        check_destroy_edge_case(root);
    }

    SECTION("container children in first and last position")
    {
        BasicJsonType root = BasicJsonType::array({BasicJsonType::array({1}), 2, 3, BasicJsonType::array({4})});
        check_destroy_edge_case(root);
    }

    SECTION("single-element chain, 1000 levels deep")
    {
        auto root = make_single_chain<BasicJsonType>(1000);
        check_destroy_edge_case(root);
    }

    SECTION("top-level empty array")
    {
        BasicJsonType root = BasicJsonType::array();
        check_destroy_edge_case(root);
    }

    SECTION("top-level empty object")
    {
        BasicJsonType root = BasicJsonType::object();
        check_destroy_edge_case(root);
    }

    SECTION("object whose last child is a non-empty array whose last child is an empty object")
    {
        BasicJsonType inner_array = BasicJsonType::array({1, 2, BasicJsonType::object()});
        BasicJsonType root = BasicJsonType::object({{"a", 1}, {"b", inner_array}});
        check_destroy_edge_case(root);
    }

    SECTION("destruction via erase() on a deeply nested child")
    {
        BasicJsonType root = BasicJsonType::array();
        root.push_back(make_single_chain<BasicJsonType>(500));
        root.push_back(BasicJsonType::object({{"k", BasicJsonType::array({1, 2, 3})}}));
        // erase() must destroy the removed subtree without recursing or
        // allocating beyond what erase() itself needs
        root.erase(0);
        CAPTURE(root.size())
        CHECK(root.size() == 1);
    }

    SECTION("destruction via assignment on a deep tree")
    {
        auto root = make_single_chain<BasicJsonType>(2000);
        // assigning a new value destroys the old one in place
        root = nullptr;
        CHECK(root.is_null());
    }
}

DOCTEST_CLANG_SUPPRESS_WARNING_POP
