//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
// |  |  |__   |  |  | | | |  version 3.11.3
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

#include "doctest_compatibility.h"

#include <nlohmann/json.hpp>
using nlohmann::json;

// This test suite uses range for loops where values are copied. This is inefficient in usual code, but required to achieve 100% coverage.
DOCTEST_GCC_SUPPRESS_WARNING_PUSH
#if DOCTEST_GCC >= DOCTEST_COMPILER(11, 0, 0)
DOCTEST_GCC_SUPPRESS_WARNING("-Wrange-loop-construct")
#endif
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
DOCTEST_CLANG_SUPPRESS_WARNING("-Wrange-loop-construct")

TEST_CASE("iterator_wrapper")
{
    SECTION("object")
    {
        SECTION("value")
        {
            json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("reference")
        {
            json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (auto& i : json::iterator_wrapper(j))  // NOLINT(readability-qualified-auto)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));

                        // change the value
                        i.value() = json(11);
                        CHECK(i.value() == json(11));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));

                        // change the value
                        i.value() = json(22);
                        CHECK(i.value() == json(22));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);

            // check if values where changed
            CHECK(j == json({ { "A", 11 }, { "B", 22 } }));
        }

        SECTION("const value")
        {
            json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (const auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("const reference")
        {
            json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (const auto& i : json::iterator_wrapper(j))
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }
    }

    SECTION("const object")
    {
        SECTION("value")
        {
            const json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("reference")
        {
            const json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (auto& i : json::iterator_wrapper(j))  // NOLINT(readability-qualified-auto)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("const value")
        {
            const json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (const auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("const reference")
        {
            const json j = { { "A", 1 }, { "B", 2 } };
            int counter = 1;

            for (const auto& i : json::iterator_wrapper(j))
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "A");
                        CHECK(i.value() == json(1));
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "B");
                        CHECK(i.value() == json(2));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }
    }

    SECTION("array")
    {
        SECTION("value")
        {
            json j = { "A", "B" };
            int counter = 1;

            for (auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("reference")
        {
            json j = { "A", "B" };
            int counter = 1;

            for (auto& i : json::iterator_wrapper(j))  // NOLINT(readability-qualified-auto)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");

                        // change the value
                        i.value() = "AA";
                        CHECK(i.value() == "AA");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");

                        // change the value
                        i.value() = "BB";
                        CHECK(i.value() == "BB");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);

            // check if values where changed
            CHECK(j == json({ "AA", "BB" }));
        }

        SECTION("const value")
        {
            json j = { "A", "B" };
            int counter = 1;

            for (const auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("const reference")
        {
            json j = { "A", "B" };
            int counter = 1;

            for (const auto& i : json::iterator_wrapper(j))
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }
    }

    SECTION("const array")
    {
        SECTION("value")
        {
            const json j = { "A", "B" };
            int counter = 1;

            for (auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("reference")
        {
            const json j = { "A", "B" };
            int counter = 1;

            for (auto& i : json::iterator_wrapper(j))  // NOLINT(readability-qualified-auto)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("const value")
        {
            const json j = { "A", "B" };
            int counter = 1;

            for (const auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }

        SECTION("const reference")
        {
            const json j = { "A", "B" };
            int counter = 1;

            for (const auto& i : json::iterator_wrapper(j))
            {
                switch (counter++)
                {
                    case 1:
                    {
                        CHECK(i.key() == "0");
                        CHECK(i.value() == "A");
                        break;
                    }

                    case 2:
                    {
                        CHECK(i.key() == "1");
                        CHECK(i.value() == "B");
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }
            }

            CHECK(counter == 3);
        }
    }

    SECTION("primitive")
    {
        SECTION("value")
        {
            json j = 1;
            int counter = 1;

            for (auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }

        SECTION("reference")
        {
            json j = 1;
            int counter = 1;

            for (auto& i : json::iterator_wrapper(j))  // NOLINT(readability-qualified-auto)
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));

                // change value
                i.value() = json(2);
            }

            CHECK(counter == 2);

            // check if value has changed
            CHECK(j == json(2));
        }

        SECTION("const value")
        {
            json j = 1;
            int counter = 1;

            for (const auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }

        SECTION("const reference")
        {
            json j = 1;
            int counter = 1;

            for (const auto& i : json::iterator_wrapper(j))
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }
    }

    SECTION("const primitive")
    {
        SECTION("value")
        {
            const json j = 1;
            int counter = 1;

            for (auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }

        SECTION("reference")
        {
            const json j = 1;
            int counter = 1;

            for (auto& i : json::iterator_wrapper(j))  // NOLINT(readability-qualified-auto)
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }

        SECTION("const value")
        {
            const json j = 1;
            int counter = 1;

            for (const auto i : json::iterator_wrapper(j))  // NOLINT(performance-for-range-copy)
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }

        SECTION("const reference")
        {
            const json j = 1;
            int counter = 1;

            for (const auto& i : json::iterator_wrapper(j))
            {
                ++counter;
                CHECK(i.key() == "");
                CHECK(i.value() == json(1));
            }

            CHECK(counter == 2);
        }
    }
}

TEST_CASE("items()")
{
    SECTION("object"){ SECTION("value"){ json j = { { "A", 1 }, { "B", 2 } };
    int counter = 1;

    for (auto i : j.items())  // NOLINT(performance-for-range-copy)
    {
        switch (counter++)
        {
            case 1:
            {
                CHECK(i.key() == "A");
                CHECK(i.value() == json(1));
                break;
            }

            case 2:
            {
                CHECK(i.key() == "B");
                CHECK(i.value() == json(2));
                break;
            }

            default:
            {
                break;
            }
        }
    }

    CHECK(counter == 3);
}

SECTION("reference")
{
    json j = { { "A", 1 }, { "B", 2 } };
    int counter = 1;

    for (auto& i : j.items())  // NOLINT(readability-qualified-auto)
    {
        switch (counter++)
        {
            case 1:
            {
                CHECK(i.key() == "A");
                CHECK(i.value() == json(1));

                // change the value
                i.value() = json(11);
                CHECK(i.value() == json(11));
                break;
            }

            case 2:
            {
                CHECK(i.key() == "B");
                CHECK(i.value() == json(2));

                // change the value
                i.value() = json(22);
                CHECK(i.value() == json(22));
                break;
            }

            default:
            {
                break;
            }
        }
    }

    CHECK(counter == 3);

    // check if values where changed
    CHECK(j == json({ { "A", 11 }, { "B", 22 } }));
}

SECTION("const value")
{
    json j = { { "A", 1 }, { "B", 2 } };
    int counter = 1;

    for (const auto i : j.items())  // NOLINT(performance-for-range-copy)
    {
        switch (counter++)
        {
            case 1:
            {
                CHECK(i.key() == "A");
                CHECK(i.value() == json(1));
                break;
            }

            case 2:
            {
                CHECK(i.key() == "B");
                CHECK(i.value() == json(2));
                break;
            }

            default:
            {
                break;
            }
        }
    }

    CHECK(counter == 3);
}

SECTION("const reference")
{
    json j = { { "A", 1 }, { "B", 2 } };
    int counter = 1;

    for (const auto& i : j.items())
    {
        switch (counter++)
        {
            case 1:
            {
                CHECK(i.key() == "A");
                CHECK(i.value() == json(1));
                break;
            }

            case 2:
            {
                CHECK(i.key() == "B");
                CHECK(i.value() == json(2));
                break;
            }

            default:
            {
                break;
            }
        }
    }

    CHECK(counter == 3);
}

#ifdef JSON_HAS_CPP_17
SECTION("structured bindings")
{
    json j = { { "A", 1 }, { "B", 2 } };

    std::map<std::string, int> m;

    for (auto const& [key, value] : j.items())
    {
        m.emplace(key, value);
    }

    CHECK(j.get<decltype(m)>() == m);
}
#endif
}

SECTION("const object")
{
    SECTION("value")
    {
        const json j = { { "A", 1 }, { "B", 2 } };
        int counter = 1;

        for (auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "A");
                    CHECK(i.value() == json(1));
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "B");
                    CHECK(i.value() == json(2));
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("reference")
    {
        const json j = { { "A", 1 }, { "B", 2 } };
        int counter = 1;

        for (auto& i : j.items())  // NOLINT(readability-qualified-auto)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "A");
                    CHECK(i.value() == json(1));
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "B");
                    CHECK(i.value() == json(2));
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("const value")
    {
        const json j = { { "A", 1 }, { "B", 2 } };
        int counter = 1;

        for (const auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "A");
                    CHECK(i.value() == json(1));
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "B");
                    CHECK(i.value() == json(2));
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("const reference")
    {
        const json j = { { "A", 1 }, { "B", 2 } };
        int counter = 1;

        for (const auto& i : j.items())
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "A");
                    CHECK(i.value() == json(1));
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "B");
                    CHECK(i.value() == json(2));
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }
}

SECTION("array")
{
    SECTION("value")
    {
        json j = { "A", "B" };
        int counter = 1;

        for (auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("reference")
    {
        json j = { "A", "B" };
        int counter = 1;

        for (auto& i : j.items())  // NOLINT(readability-qualified-auto)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");

                    // change the value
                    i.value() = "AA";
                    CHECK(i.value() == "AA");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");

                    // change the value
                    i.value() = "BB";
                    CHECK(i.value() == "BB");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);

        // check if values where changed
        CHECK(j == json({ "AA", "BB" }));
    }

    SECTION("const value")
    {
        json j = { "A", "B" };
        int counter = 1;

        for (const auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("const reference")
    {
        json j = { "A", "B" };
        int counter = 1;

        for (const auto& i : j.items())
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }
}

SECTION("const array")
{
    SECTION("value")
    {
        const json j = { "A", "B" };
        int counter = 1;

        for (auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("reference")
    {
        const json j = { "A", "B" };
        int counter = 1;

        for (auto& i : j.items())  // NOLINT(readability-qualified-auto)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("const value")
    {
        const json j = { "A", "B" };
        int counter = 1;

        for (const auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }

    SECTION("const reference")
    {
        const json j = { "A", "B" };
        int counter = 1;

        for (const auto& i : j.items())
        {
            switch (counter++)
            {
                case 1:
                {
                    CHECK(i.key() == "0");
                    CHECK(i.value() == "A");
                    break;
                }

                case 2:
                {
                    CHECK(i.key() == "1");
                    CHECK(i.value() == "B");
                    break;
                }

                default:
                {
                    break;
                }
            }
        }

        CHECK(counter == 3);
    }
}

SECTION("primitive")
{
    SECTION("value")
    {
        json j = 1;
        int counter = 1;

        for (auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }

    SECTION("reference")
    {
        json j = 1;
        int counter = 1;

        for (auto& i : j.items())  // NOLINT(readability-qualified-auto)
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));

            // change value
            i.value() = json(2);
        }

        CHECK(counter == 2);

        // check if value has changed
        CHECK(j == json(2));
    }

    SECTION("const value")
    {
        json j = 1;
        int counter = 1;

        for (const auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }

    SECTION("const reference")
    {
        json j = 1;
        int counter = 1;

        for (const auto& i : j.items())
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }
}

SECTION("const primitive")
{
    SECTION("value")
    {
        const json j = 1;
        int counter = 1;

        for (auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }

    SECTION("reference")
    {
        const json j = 1;
        int counter = 1;

        for (auto& i : j.items())  // NOLINT(readability-qualified-auto)
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }

    SECTION("const value")
    {
        const json j = 1;
        int counter = 1;

        for (const auto i : j.items())  // NOLINT(performance-for-range-copy)
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }

    SECTION("const reference")
    {
        const json j = 1;
        int counter = 1;

        for (const auto& i : j.items())
        {
            ++counter;
            CHECK(i.key() == "");
            CHECK(i.value() == json(1));
        }

        CHECK(counter == 2);
    }
}
}

DOCTEST_GCC_SUPPRESS_WARNING_POP
DOCTEST_CLANG_SUPPRESS_WARNING_POP
