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

#include "doctest_compatibility.h"

// disable -Wnoexcept as exceptions are switched off for this test suite
DOCTEST_GCC_SUPPRESS_WARNING_PUSH
DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept")

#include <azure/core/internal/json/json.hpp>
using Azure::Core::Json::_internal::json;

/////////////////////////////////////////////////////////////////////
// for #2824
/////////////////////////////////////////////////////////////////////

class sax_no_exception : public Azure::Core::Json::_internal::detail::json_sax_dom_parser<json> {
public:
  explicit sax_no_exception(json& j)
      : Azure::Core::Json::_internal::detail::json_sax_dom_parser<json>(j, false)
  {
  }

  static bool parse_error(
      std::size_t /*position*/,
      const std::string& /*last_token*/,
      const json::exception& ex)
  {
    error_string = new std::string(ex.what()); // NOLINT(cppcoreguidelines-owning-memory)
    return false;
  }

  static std::string* error_string;
};

std::string* sax_no_exception::error_string = nullptr;

TEST_CASE("Tests with disabled exceptions")
{
  SECTION("issue #2824 - encoding of json::exception::what()")
  {
    json j;
    sax_no_exception sax(j);

    CHECK(!json::sax_parse("xyz", &sax));
    CHECK(
        *sax_no_exception::error_string
        == "[json.exception.parse_error.101] parse error at line 1, column 1: syntax error while "
           "parsing value - invalid literal; last read: 'x'");
    delete sax_no_exception::error_string; // NOLINT(cppcoreguidelines-owning-memory)
  }
}

DOCTEST_GCC_SUPPRESS_WARNING_POP
