//     __ _____ _____ _____
//  __|  |   __|     |   | |  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 <azure/core/internal/json/json.hpp>

#include <exception>
#include <iostream>

struct Foo
{
  int a;
  int b;
};

namespace Azure { namespace Core { namespace Json { namespace _internal {
  template <> struct adl_serializer<Foo>
  {
    static void to_json(json& j, Foo const& f)
    {
      switch (f.b)
      {
        case 0:
          j["a"] = f.a;
          break;
        case 1:
          j[0] = f.a;
          break;
        default:
          j = "test";
      }
      if (f.a == 1)
      {
        throw std::runtime_error("b is invalid");
      }
    }
  };
}}}} // namespace Azure::Core::Json::_internal

TEST_CASE("check_for_mem_leak_on_adl_to_json-1")
{
  try
  {
    const Azure::Core::Json::_internal::json j = Foo{1, 0};
    std::cout << j.dump() << "\n";
  }
  catch (...) // NOLINT(bugprone-empty-catch)
  {
    // just ignore the exception in this POC
  }
}

TEST_CASE("check_for_mem_leak_on_adl_to_json-2")
{
  try
  {
    const Azure::Core::Json::_internal::json j = Foo{1, 1};
    std::cout << j.dump() << "\n";
  }
  catch (...) // NOLINT(bugprone-empty-catch)
  {
    // just ignore the exception in this POC
  }
}

TEST_CASE("check_for_mem_leak_on_adl_to_json-2")
{
  try
  {
    const Azure::Core::Json::_internal::json j = Foo{1, 2};
    std::cout << j.dump() << "\n";
  }
  catch (...) // NOLINT(bugprone-empty-catch)
  {
    // just ignore the exception in this POC
  }
}
