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

#include <iomanip>
#include <sstream>

TEST_CASE("serialization")
{
    SECTION("operator<<")
    {
        SECTION("no given width")
        {
            std::stringstream ss;
            const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
            ss << j;
            CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
        }

        SECTION("given width")
        {
            std::stringstream ss;
            const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
            ss << std::setw(4) << j;
            CHECK(ss.str() == "[\n    \"foo\",\n    1,\n    2,\n    3,\n    false,\n    {\n        \"one\": 1\n    }\n]");
        }

        SECTION("given fill")
        {
            std::stringstream ss;
            const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
            ss << std::setw(1) << std::setfill('\t') << j;
            CHECK(ss.str() == "[\n\t\"foo\",\n\t1,\n\t2,\n\t3,\n\tfalse,\n\t{\n\t\t\"one\": 1\n\t}\n]");
        }
    }

    SECTION("operator>>")
    {
        SECTION("no given width")
        {
            std::stringstream ss;
            const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
            j >> ss;
            CHECK(ss.str() == "[\"foo\",1,2,3,false,{\"one\":1}]");
        }

        SECTION("given width")
        {
            std::stringstream ss;
            const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
            ss.width(4);
            j >> ss;
            CHECK(ss.str() == "[\n    \"foo\",\n    1,\n    2,\n    3,\n    false,\n    {\n        \"one\": 1\n    }\n]");
        }

        SECTION("given fill")
        {
            std::stringstream ss;
            const json j = {"foo", 1, 2, 3, false, {{"one", 1}}};
            ss.width(1);
            ss.fill('\t');
            j >> ss;
            CHECK(ss.str() == "[\n\t\"foo\",\n\t1,\n\t2,\n\t3,\n\tfalse,\n\t{\n\t\t\"one\": 1\n\t}\n]");
        }
    }

    SECTION("dump")
    {
        SECTION("invalid character")
        {
            const json j = "ä\xA9ü";

            CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9", json::type_error&);
            CHECK_THROWS_WITH_AS(j.dump(1, ' ', false, json::error_handler_t::strict),
                                 "[json.exception.type_error.316] invalid UTF-8 byte at index 2: 0xA9",
                                 json::type_error&);
            CHECK(j.dump(-1, ' ', false, json::error_handler_t::ignore) == "\"äü\"");
            CHECK(j.dump(-1, ' ', false, json::error_handler_t::replace) == "\"ä\xEF\xBF\xBDü\"");
            CHECK(j.dump(-1, ' ', true, json::error_handler_t::replace) == "\"\\u00e4\\ufffd\\u00fc\"");
        }

        SECTION("ending with incomplete character")
        {
            const json j = "123\xC2";

            CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] incomplete UTF-8 string; last byte: 0xC2", json::type_error&);
            CHECK_THROWS_AS(j.dump(1, ' ', false, json::error_handler_t::strict), json::type_error&);
            CHECK(j.dump(-1, ' ', false, json::error_handler_t::ignore) == "\"123\"");
            CHECK(j.dump(-1, ' ', false, json::error_handler_t::replace) == "\"123\xEF\xBF\xBD\"");
            CHECK(j.dump(-1, ' ', true, json::error_handler_t::replace) == "\"123\\ufffd\"");
        }

        SECTION("unexpected character")
        {
            const json j = "123\xF1\xB0\x34\x35\x36";

            CHECK_THROWS_WITH_AS(j.dump(), "[json.exception.type_error.316] invalid UTF-8 byte at index 5: 0x34", json::type_error&);
            CHECK_THROWS_AS(j.dump(1, ' ', false, json::error_handler_t::strict), json::type_error&);
            CHECK(j.dump(-1, ' ', false, json::error_handler_t::ignore) == "\"123456\"");
            CHECK(j.dump(-1, ' ', false, json::error_handler_t::replace) == "\"123\xEF\xBF\xBD\x34\x35\x36\"");
            CHECK(j.dump(-1, ' ', true, json::error_handler_t::replace) == "\"123\\ufffd456\"");
        }

        SECTION("U+FFFD Substitution of Maximal Subparts")
        {
            // Some tests (mostly) from
            // https://www.unicode.org/versions/Unicode11.0.0/ch03.pdf
            // Section 3.9 -- U+FFFD Substitution of Maximal Subparts

            auto test = [&](std::string const& input, std::string const& expected) {
                const json j = input;
                CHECK(j.dump(-1, ' ', true, json::error_handler_t::replace) == "\"" + expected + "\"");
            };

            test("\xC2", "\\ufffd");
            test("\xC2\x41\x42",
                 "\\ufffd"
                 "\x41"
                 "\x42");
            test("\xC2\xF4",
                 "\\ufffd"
                 "\\ufffd");

            test("\xF0\x80\x80\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");
            test("\xF1\x80\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF2\x80\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF3\x80\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF4\x80\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF5\x80\x80\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");

            test("\xF0\x90\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF1\x90\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF2\x90\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF3\x90\x80\x41",
                 "\\ufffd"
                 "\x41");
            test("\xF4\x90\x80\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");
            test("\xF5\x90\x80\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");

            test("\xC0\xAF\xE0\x80\xBF\xF0\x81\x82\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");
            test("\xED\xA0\x80\xED\xBF\xBF\xED\xAF\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");
            test("\xF4\x91\x92\x93\xFF\x41\x80\xBF\x42",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41"
                 "\\ufffd"
                 "\\ufffd"
                 "\x42");
            test("\xE1\x80\xE2\xF0\x91\x92\xF1\xBF\x41",
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\\ufffd"
                 "\x41");
        }
    }

    SECTION("to_string")
    {
        auto test = [&](std::string const& input, std::string const& expected) {
            using std::to_string;
            const json j = input;
            CHECK(to_string(j) == "\"" + expected + "\"");
        };

        test(R"({"x":5,"y":6})", R"({\"x\":5,\"y\":6})");
        test("{\"x\":[10,null,null,null]}", R"({\"x\":[10,null,null,null]})");
        test("test", "test");
        test("[3,\"false\",false]", R"([3,\"false\",false])");
    }
}

TEST_CASE_TEMPLATE("serialization for extreme integer values", T, int32_t, uint32_t, int64_t, uint64_t)
{
    SECTION("minimum")
    {
        constexpr auto minimum = (std::numeric_limits<T>::min)();
        const json j = minimum;
        CHECK(j.dump() == std::to_string(minimum));
    }

    SECTION("maximum")
    {
        constexpr auto maximum = (std::numeric_limits<T>::max)();
        const json j = maximum;
        CHECK(j.dump() == std::to_string(maximum));
    }
}

TEST_CASE("dump with binary values")
{
    auto binary = json::binary({1, 2, 3, 4});
    auto binary_empty = json::binary({});
    auto binary_with_subtype = json::binary({1, 2, 3, 4}, 128);
    auto binary_empty_with_subtype = json::binary({}, 128);

    const json object = {{"key", binary}};
    const json object_empty = {{"key", binary_empty}};
    const json object_with_subtype = {{"key", binary_with_subtype}};
    const json object_empty_with_subtype = {{"key", binary_empty_with_subtype}};

    const json array = {"value", 1, binary};
    const json array_empty = {"value", 1, binary_empty};
    const json array_with_subtype = {"value", 1, binary_with_subtype};
    const json array_empty_with_subtype = {"value", 1, binary_empty_with_subtype};

    SECTION("normal")
    {
        CHECK(binary.dump() == "{\"bytes\":[1,2,3,4],\"subtype\":null}");
        CHECK(binary_empty.dump() == "{\"bytes\":[],\"subtype\":null}");
        CHECK(binary_with_subtype.dump() == "{\"bytes\":[1,2,3,4],\"subtype\":128}");
        CHECK(binary_empty_with_subtype.dump() == "{\"bytes\":[],\"subtype\":128}");

        CHECK(object.dump() == "{\"key\":{\"bytes\":[1,2,3,4],\"subtype\":null}}");
        CHECK(object_empty.dump() == "{\"key\":{\"bytes\":[],\"subtype\":null}}");
        CHECK(object_with_subtype.dump() == "{\"key\":{\"bytes\":[1,2,3,4],\"subtype\":128}}");
        CHECK(object_empty_with_subtype.dump() == "{\"key\":{\"bytes\":[],\"subtype\":128}}");

        CHECK(array.dump() == "[\"value\",1,{\"bytes\":[1,2,3,4],\"subtype\":null}]");
        CHECK(array_empty.dump() == "[\"value\",1,{\"bytes\":[],\"subtype\":null}]");
        CHECK(array_with_subtype.dump() == "[\"value\",1,{\"bytes\":[1,2,3,4],\"subtype\":128}]");
        CHECK(array_empty_with_subtype.dump() == "[\"value\",1,{\"bytes\":[],\"subtype\":128}]");
    }

    SECTION("pretty-printed")
    {
        CHECK(binary.dump(4) == "{\n"
                                "    \"bytes\": [1, 2, 3, 4],\n"
                                "    \"subtype\": null\n"
                                "}");
        CHECK(binary_empty.dump(4) == "{\n"
                                      "    \"bytes\": [],\n"
                                      "    \"subtype\": null\n"
                                      "}");
        CHECK(binary_with_subtype.dump(4) == "{\n"
                                             "    \"bytes\": [1, 2, 3, 4],\n"
                                             "    \"subtype\": 128\n"
                                             "}");
        CHECK(binary_empty_with_subtype.dump(4) == "{\n"
                                                   "    \"bytes\": [],\n"
                                                   "    \"subtype\": 128\n"
                                                   "}");

        CHECK(object.dump(4) == "{\n"
                                "    \"key\": {\n"
                                "        \"bytes\": [1, 2, 3, 4],\n"
                                "        \"subtype\": null\n"
                                "    }\n"
                                "}");
        CHECK(object_empty.dump(4) == "{\n"
                                      "    \"key\": {\n"
                                      "        \"bytes\": [],\n"
                                      "        \"subtype\": null\n"
                                      "    }\n"
                                      "}");
        CHECK(object_with_subtype.dump(4) == "{\n"
                                             "    \"key\": {\n"
                                             "        \"bytes\": [1, 2, 3, 4],\n"
                                             "        \"subtype\": 128\n"
                                             "    }\n"
                                             "}");
        CHECK(object_empty_with_subtype.dump(4) == "{\n"
                                                   "    \"key\": {\n"
                                                   "        \"bytes\": [],\n"
                                                   "        \"subtype\": 128\n"
                                                   "    }\n"
                                                   "}");

        CHECK(array.dump(4) == "[\n"
                               "    \"value\",\n"
                               "    1,\n"
                               "    {\n"
                               "        \"bytes\": [1, 2, 3, 4],\n"
                               "        \"subtype\": null\n"
                               "    }\n"
                               "]");
        CHECK(array_empty.dump(4) == "[\n"
                                     "    \"value\",\n"
                                     "    1,\n"
                                     "    {\n"
                                     "        \"bytes\": [],\n"
                                     "        \"subtype\": null\n"
                                     "    }\n"
                                     "]");
        CHECK(array_with_subtype.dump(4) == "[\n"
                                            "    \"value\",\n"
                                            "    1,\n"
                                            "    {\n"
                                            "        \"bytes\": [1, 2, 3, 4],\n"
                                            "        \"subtype\": 128\n"
                                            "    }\n"
                                            "]");
        CHECK(array_empty_with_subtype.dump(4) == "[\n"
                                                  "    \"value\",\n"
                                                  "    1,\n"
                                                  "    {\n"
                                                  "        \"bytes\": [],\n"
                                                  "        \"subtype\": 128\n"
                                                  "    }\n"
                                                  "]");
    }
}
