// Copyright 2025 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "absl/strings/internal/generic_printer.h"

#include <array>
#include <cinttypes>
#include <clocale>
#include <cmath>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <map>
#include <memory>
#include <optional>
#include <ostream>
#include <sstream>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include <variant>
#include <vector>

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "absl/base/attributes.h"
#include "absl/base/config.h"
#include "absl/cleanup/cleanup.h"
#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
#include "absl/strings/substitute.h"

namespace generic_logging_test {
struct NotStreamable {};
}  // namespace generic_logging_test

static std::ostream& operator<<(std::ostream& os,
                                const generic_logging_test::NotStreamable&) {
  return os << "This overload should NOT be found by GenericPrint.";
}

// Types to test selection logic for streamable and non-streamable types.
namespace generic_logging_test {
struct Streamable {
  int x;
  friend std::ostream& operator<<(std::ostream& os, const Streamable& l) {
    return os << "Streamable{" << l.x << "}";
  }
};
}  // namespace generic_logging_test

namespace absl {
ABSL_NAMESPACE_BEGIN
namespace strings_internal {
namespace {

using ::testing::AllOf;
using ::testing::AnyOf;
using ::testing::ContainsRegex;
using ::testing::EndsWith;
using ::testing::Eq;
using ::testing::HasSubstr;
using ::testing::MatchesRegex;

struct AbslStringifiable {
  template <typename S>
  friend void AbslStringify(S& sink, const AbslStringifiable&) {
    sink.Append("AbslStringifiable!");
  }
};

auto IsUnprintable() {
#ifdef GTEST_USES_SIMPLE_RE
  return HasSubstr("unprintable value of size");
#else
  return ContainsRegex(
      "\\[unprintable value of size [0-9]+ @(0x)?[0-9a-fA-F]+\\]");
#endif
}

auto HasExactlyNInstancesOf(int n, absl::string_view me) {
#ifdef GTEST_USES_SIMPLE_RE
  (void)n;
  return HasSubstr(me);
#else
  absl::string_view value_m_times = "(.*$0){$1}.*";

  return AllOf(MatchesRegex(absl::Substitute(value_m_times, me, n)),
               Not(MatchesRegex(absl::Substitute(value_m_times, me, n + 1))));
#endif
}

template <typename T>
std::string GenericPrintToString(const T& v) {
  std::stringstream ss;
  ss << GenericPrint(v);
  {
    std::stringstream ss2;
    ss2 << GenericPrint() << v;
    EXPECT_EQ(ss.str(), ss2.str());
  }
  return ss.str();
}

TEST(GenericPrinterTest, Bool) {
  EXPECT_EQ("true", GenericPrintToString(true));
  EXPECT_EQ("false", GenericPrintToString(false));
}

TEST(GenericPrinterTest, VectorOfBool) {
  std::vector<bool> v{true, false, true};
  const auto& cv = v;
  EXPECT_EQ("[true, false, true]", GenericPrintToString(v));
  EXPECT_EQ("true", GenericPrintToString(v[0]));
  EXPECT_EQ("true", GenericPrintToString(cv[0]));
}

TEST(GenericPrinterTest, CharLiterals) {
  EXPECT_EQ(R"(a"\b)", GenericPrintToString(R"(a"\b)"));
}

TEST(GenericPrinterTest, Builtin) {
  EXPECT_EQ("123", GenericPrintToString(123));
}

TEST(GenericPrinterTest, AbslStringifiable) {
  EXPECT_EQ("AbslStringifiable!", GenericPrintToString(AbslStringifiable{}));
}

TEST(GenericPrinterTest, Nullptr) {
  EXPECT_EQ("nullptr", GenericPrintToString(nullptr));
}

TEST(GenericPrinterTest, Chars) {
  EXPECT_EQ(R"('\x0a' (0x0a 10))", GenericPrintToString('\x0a'));
  EXPECT_EQ(R"(' ' (0x20 32))", GenericPrintToString(' '));
  EXPECT_EQ(R"('~' (0x7e 126))", GenericPrintToString('~'));
  EXPECT_EQ(R"('\'' (0x27 39))", GenericPrintToString('\''));
}

TEST(GenericPrinterTest, SignedChars) {
  EXPECT_EQ(R"('\x0a' (0x0a 10))",
            GenericPrintToString(static_cast<signed char>('\x0a')));
  EXPECT_EQ(R"(' ' (0x20 32))",
            GenericPrintToString(static_cast<signed char>(' ')));
  EXPECT_EQ(R"('~' (0x7e 126))",
            GenericPrintToString(static_cast<signed char>('~')));
  EXPECT_EQ(R"('\'' (0x27 39))",
            GenericPrintToString(static_cast<signed char>('\'')));
}

TEST(GenericPrinterTest, UnsignedChars) {
  EXPECT_EQ(R"('\x0a' (0x0a 10))",
            GenericPrintToString(static_cast<unsigned char>('\x0a')));
  EXPECT_EQ(R"(' ' (0x20 32))",
            GenericPrintToString(static_cast<unsigned char>(' ')));
  EXPECT_EQ(R"('~' (0x7e 126))",
            GenericPrintToString(static_cast<unsigned char>('~')));
  EXPECT_EQ(R"('\'' (0x27 39))",
            GenericPrintToString(static_cast<unsigned char>('\'')));
}

TEST(GenericPrinterTest, Bytes) {
  EXPECT_EQ("0x00", GenericPrintToString(static_cast<std::byte>(0)));
  EXPECT_EQ("0x7f", GenericPrintToString(static_cast<std::byte>(0x7F)));
  EXPECT_EQ("0xff", GenericPrintToString(static_cast<std::byte>(0xFF)));
}

TEST(GenericPrinterTest, Strings) {
  const std::string expected_quotes = R"("a\"\\b")";
  EXPECT_EQ(expected_quotes, GenericPrintToString(std::string(R"(a"\b)")));
  const std::string expected_nonprintable = R"("\x00\xcd\n\xab")";
  EXPECT_EQ(expected_nonprintable,
            GenericPrintToString(absl::string_view("\0\315\n\xAB", 4)));
}

TEST(GenericPrinterTest, PreciseFloat) {
  // Instead of testing exactly how the values are formatted, just check that
  // they are distinct.

  // Ensure concise output for exact values:
  EXPECT_EQ("1f", GenericPrintToString(1.f));
  EXPECT_EQ("1.1f", GenericPrintToString(1.1f));

  // Plausible real-world values:
  float f = 10.0000095f;
  EXPECT_NE(GenericPrintToString(f), GenericPrintToString(10.0000105f));
  // Smallest increment for a real-world value:
  EXPECT_NE(GenericPrintToString(f),
            GenericPrintToString(std::nextafter(f, 11)));
  // The two smallest (finite) values possible:
  EXPECT_NE(GenericPrintToString(std::numeric_limits<float>::lowest()),
            GenericPrintToString(
                std::nextafter(std::numeric_limits<float>::lowest(), 1)));
  // Ensure the value has the correct type suffix:
  EXPECT_THAT(GenericPrintToString(0.f), EndsWith("f"));
}

TEST(GenericPrinterTest, PreciseDouble) {
  EXPECT_EQ("1", GenericPrintToString(1.));
  EXPECT_EQ("1.1", GenericPrintToString(1.1));
  double d = 10.000000000000002;
  EXPECT_NE(GenericPrintToString(d), GenericPrintToString(10.000000000000004));
  EXPECT_NE(GenericPrintToString(d),
            GenericPrintToString(std::nextafter(d, 11)));
  EXPECT_NE(GenericPrintToString(std::numeric_limits<double>::lowest()),
            GenericPrintToString(
                std::nextafter(std::numeric_limits<double>::lowest(), 1)));
  EXPECT_THAT(GenericPrintToString(0.), EndsWith("0"));
}

TEST(GenericPrinterTest, PreciseLongDouble) {
  EXPECT_EQ("1L", GenericPrintToString(1.L));
  EXPECT_EQ("1.1L", GenericPrintToString(1.1L));
  long double ld = 10.0000000000000000000000000000002;
  EXPECT_NE(GenericPrintToString(ld),
            GenericPrintToString(10.0000000000000000000000000000004));
  EXPECT_NE(GenericPrintToString(ld),
            GenericPrintToString(std::nextafter(ld, 11)));
  EXPECT_NE(GenericPrintToString(std::numeric_limits<long double>::lowest()),
            GenericPrintToString(
                std::nextafter(std::numeric_limits<long double>::lowest(), 1)));
  EXPECT_THAT(GenericPrintToString(0.L), EndsWith("L"));
}

TEST(GenericPrinterTest, PreciseFPUnderCommaRadixLocale) {
  // The values are formatted with locale-independent absl::StrFormat (a '.'
  // radix), so the round-trip shortening must not depend on LC_NUMERIC. Under a
  // comma-radix locale a locale-sensitive reader stops at the '.', which used
  // to defeat the shortened output.
  const char* saved = std::setlocale(LC_NUMERIC, nullptr);
  std::string saved_locale = saved ? saved : "C";
  absl::Cleanup restore = [&] {
    std::setlocale(LC_NUMERIC, saved_locale.c_str());
  };

  bool set = false;
  for (const char* name : {"de_DE.UTF-8", "fr_FR.UTF-8", "de_DE", "fr_FR"}) {
    if (std::setlocale(LC_NUMERIC, name) != nullptr) {
      set = true;
      break;
    }
  }
  if (!set) {
    GTEST_SKIP() << "No comma-radix locale available on this system.";
  }

  EXPECT_EQ("1.1f", GenericPrintToString(1.1f));
  EXPECT_EQ("1.1", GenericPrintToString(1.1));
}

TEST(GenericPrinterTest, StreamableLvalue) {
  generic_logging_test::Streamable x{234};
  EXPECT_EQ("Streamable{234}", GenericPrintToString(x));
}

TEST(GenericPrinterTest, StreamableXvalue) {
  EXPECT_EQ("Streamable{345}",
            GenericPrintToString(generic_logging_test::Streamable{345}));
}

TEST(GenericPrinterTest, NotStreamableWithoutGenericPrint) {
  ::generic_logging_test::NotStreamable x;
  std::stringstream ss;
  ::operator<<(ss, x);
  EXPECT_EQ(ss.str(), "This overload should NOT be found by GenericPrint.");
}

TEST(GenericPrinterTest, NotStreamableLvalue) {
  generic_logging_test::NotStreamable x;
  EXPECT_THAT(GenericPrintToString(x), IsUnprintable());
}

TEST(GenericPrinterTest, NotStreamableXvalue) {
  EXPECT_THAT(GenericPrintToString(generic_logging_test::NotStreamable{}),
              IsUnprintable());
}

TEST(GenericPrinterTest, DebugString) {
  struct WithDebugString {
    std::string val;
    std::string DebugString() const {
      return absl::StrCat("WithDebugString{", val, "}");
    }
  };
  EXPECT_EQ("WithDebugString{foo}",
            GenericPrintToString(WithDebugString{"foo"}));
}

TEST(GenericPrinterTest, Vector) {
  std::vector<int> v = {4, 5, 6};
  EXPECT_THAT(GenericPrintToString(v), MatchesRegex(".*4,? 5,? 6.*"));
}

TEST(GenericPrinterTest, StreamableVector) {
  std::vector<generic_logging_test::Streamable> v = {{7}, {8}, {9}};
  EXPECT_THAT(GenericPrintToString(v),
              MatchesRegex(".*Streamable.7.,? Streamable.8.,? Streamable.9.*"));
}

TEST(GenericPrinterTest, Map) {
  absl::flat_hash_map<
      std::string, absl::flat_hash_map<std::string, std::pair<double, double>>>
      v = {{"A", {{"B", {.5, .25}}}}};

  EXPECT_THAT(GenericPrintToString(v), R"([<"A", [<"B", <0.5, 0.25>>]>])");

  std::map<std::string, std::map<std::string, std::pair<double, double>>> v2 = {
      {"A", {{"B", {.5, .25}}}}};

  EXPECT_THAT(GenericPrintToString(v2), R"([<"A", [<"B", <0.5, 0.25>>]>])");
}

TEST(GenericPrinterTest, StreamAdapter) {
  std::stringstream ss;
  static_assert(
      std::is_same<std::remove_reference_t<decltype(ss << GenericPrint())>,
                   internal_generic_printer::GenericPrintStreamAdapter::Impl<
                       std::stringstream>>::value,
      "expected ostream << GenericPrint() to yield adapter impl");

  ss << GenericPrint() << "again, " << "back-up, " << "cue, "
     << "double-u, " << "eye, "
     << "four: " << generic_logging_test::NotStreamable{};
  EXPECT_THAT(
      ss.str(),
      MatchesRegex(
          "again, back-up, cue, double-u, eye, four: .unprintable value.*"));
}

TEST(GenericPrinterTest, NotStreamableVector) {
  std::vector<generic_logging_test::NotStreamable> v = {{}, {}, {}};
#ifdef GTEST_USES_SIMPLE_RE
  EXPECT_THAT(GenericPrintToString(v), HasSubstr("unprintable"));
#else
  EXPECT_THAT(GenericPrintToString(v), MatchesRegex(".*(unprintable.*){3}.*"));
#endif
}

struct CustomContainer : public std::array<int, 4> {
  template <typename Sink>
  friend void AbslStringify(Sink& sink, const CustomContainer& c) {
    absl::Format(&sink, "%d %d", c[0], c[1]);
  }
};

// Checks that AbslStringify (go/totw/215) is respected for container-like
// types.
TEST(GenericPrinterTest, ContainerLikeCustomLogging) {
  CustomContainer c = {1, 2, 3, 4};
  EXPECT_EQ(GenericPrintToString(c), "1 2");
}

// Test helper: this function demonstrates customizable printing logic:
// 'GenericPrinter<T>' can be nominated as a default template argument.
template <typename T, typename Printer = GenericPrinter<T>>
std::string SpecializablePrint(const T& v) {
  std::stringstream ss;
  ss << Printer{v};
  return ss.str();
}

TEST(GenericPrinterTest, DefaultPrinter) {
  EXPECT_EQ("123", SpecializablePrint(123));
}

// Example of custom printing logic. This doesn't actually test anything in
// GenericPrinter, but it's a working example of customizing printing logic (as
// opposed to the comments in generic_printer.h).
struct CustomPrinter {
  explicit CustomPrinter(int) {}
  friend std::ostream& operator<<(std::ostream& os, CustomPrinter&&) {
    return os << "custom printer";
  }
};

TEST(GenericPrinterTest, CustomPrinter) {
  EXPECT_EQ("custom printer", (SpecializablePrint<int, CustomPrinter>(123)));
}

TEST(GenricPrinterTest, Nullopt) {
  EXPECT_EQ("nullopt", GenericPrintToString(std::nullopt));
}

TEST(GenericPrinterTest, Optional) {
  EXPECT_EQ("nullopt", GenericPrintToString(std::optional<int>()));
  EXPECT_EQ("nullopt", GenericPrintToString(std::optional<int>(std::nullopt)));
  EXPECT_EQ("<3>", GenericPrintToString(std::make_optional(3)));
  EXPECT_EQ("<Streamable{3}>", GenericPrintToString(std::make_optional(
                                   generic_logging_test::Streamable{3})));
}

TEST(GenericPrinterTest, Monostate) {
  EXPECT_EQ("monostate", GenericPrintToString(std::monostate{}));
}

TEST(GenericPrinterTest, Tuple) {
  EXPECT_EQ("<1, two, 3>", GenericPrintToString(std::make_tuple(1, "two", 3)));
}

TEST(GenericPrinterTest, EmptyTuple) {
  EXPECT_EQ("<>", GenericPrintToString(std::make_tuple()));
}

TEST(GenericPrinterTest, TupleWithStreamableMember) {
  EXPECT_EQ("<1, two, Streamable{3}>",
            GenericPrintToString(std::make_tuple(
                1, "two", generic_logging_test::Streamable{3})));
}

TEST(GenericPrinterTest, Variant) {
  EXPECT_EQ(R"(('(index = 0)' "cow"))",
            GenericPrintToString(std::variant<std::string, float>("cow")));

  EXPECT_EQ("('(index = 1)' 1.1f)",
            GenericPrintToString(std::variant<std::string, float>(1.1F)));
}

TEST(GenericPrinterTest, VariantMonostate) {
  EXPECT_EQ("('(index = 0)' monostate)",
            GenericPrintToString(std::variant<std::monostate, std::string>()));
}

TEST(GenericPrinterTest, VariantNonStreamable) {
  EXPECT_EQ(R"(('(index = 0)' "cow"))",
            GenericPrintToString(
                std::variant<std::string, generic_logging_test::NotStreamable>(
                    "cow")));

  EXPECT_THAT(
      GenericPrintToString(
          std::variant<std::string, generic_logging_test::NotStreamable>(
              generic_logging_test::NotStreamable{})),
      IsUnprintable());
}

TEST(GenericPrinterTest, VariantNestedVariant) {
  EXPECT_EQ(
      "('(index = 1)' ('(index = 1)' 1.1f))",
      GenericPrintToString(std::variant<std::string, std::variant<int, float>>(
          std::variant<int, float>(1.1F))));
}

TEST(GenericPrinterTest, VariantInPlace) {
  EXPECT_EQ("('(index = 0)' 17)", GenericPrintToString(std::variant<int, int>(
                                      std::in_place_index<0>, 17)));

  EXPECT_EQ("('(index = 1)' 17)", GenericPrintToString(std::variant<int, int>(
                                      std::in_place_index<1>, 17)));
}

TEST(GenericPrinterTest, StatusOrLikeOkPrintsValue) {
  EXPECT_EQ(R"(<OK: "cow">)",
            GenericPrintToString(absl::StatusOr<std::string>("cow")));

  EXPECT_EQ(R"(<OK: 1.1f>)", GenericPrintToString(absl::StatusOr<float>(1.1F)));
}

TEST(GenericPrinterTest, StatusOrLikeNonOkPrintsStatus) {
  EXPECT_THAT(
      GenericPrintToString(absl::StatusOr<float>(
          absl::InvalidArgumentError("my error message"))),
      AllOf(HasSubstr("my error message"), HasSubstr("INVALID_ARGUMENT")));

  EXPECT_THAT(GenericPrintToString(
                  absl::StatusOr<int>(absl::AbortedError("other message"))),
              AllOf(HasSubstr("other message"), HasSubstr("ABORTED")));
}

TEST(GenericPrinterTest, StatusOrLikeNonStreamableValueUnprintable) {
  EXPECT_THAT(
      GenericPrintToString(absl::StatusOr<generic_logging_test::NotStreamable>(
          generic_logging_test::NotStreamable{})),
      IsUnprintable());
}

TEST(GenericPrinterTest, StatusOrLikeNonStreamableErrorStillPrintable) {
  EXPECT_THAT(
      GenericPrintToString(absl::StatusOr<generic_logging_test::NotStreamable>(
          absl::AbortedError("other message"))),
      AllOf(HasSubstr("other message"), HasSubstr("ABORTED")));
}

TEST(GenericPrinterTest, IsSupportedPointer) {
  using internal_generic_printer::is_supported_ptr;

  EXPECT_TRUE(is_supported_ptr<std::unique_ptr<std::string>>);
  EXPECT_TRUE(is_supported_ptr<std::unique_ptr<int[]>>);
  EXPECT_TRUE((is_supported_ptr<std::unique_ptr<void, void (*)(void*)>>));

  EXPECT_FALSE(is_supported_ptr<int*>);
  EXPECT_FALSE(is_supported_ptr<std::shared_ptr<int>>);
  EXPECT_FALSE(is_supported_ptr<std::weak_ptr<int>>);
}

TEST(GenericPrinterTest, SmartPointerPrintsNullptrForAllNullptrs) {
  std::unique_ptr<std::string> up;

  EXPECT_EQ("<nullptr>", GenericPrintToString(up));
}

TEST(GenericPrinterTest, SmartPointerPrintsValueIfNonNull) {
  EXPECT_THAT(GenericPrintToString(std::make_unique<int>(5)),
              HasSubstr("pointing to 5"));
}

TEST(GenericPrinterTest, SmartPointerPrintsAddressOfPointee) {
  auto i = std::make_unique<int>(5);
  auto c = std::make_unique<char>('z');
  char memory[] = "abcdefg";
  auto cp = std::make_unique<char*>(memory);

  EXPECT_THAT(GenericPrintToString(i),
              AnyOf(Eq(absl::StrFormat("<%0*" PRIXPTR " pointing to 5>",
                                       sizeof(void*) * 2,
                                       reinterpret_cast<uintptr_t>(&*i))),
                    Eq(absl::StrFormat("<%#x pointing to 5>",
                                       reinterpret_cast<uintptr_t>(&*i)))));

  EXPECT_THAT(
      GenericPrintToString(c),
      AnyOf(HasSubstr(absl::StrFormat("<%0*" PRIXPTR " pointing to 'z'",
                                      sizeof(void*) * 2,
                                      reinterpret_cast<uintptr_t>(&*c))),
            HasSubstr(absl::StrFormat("<%#x pointing to 'z'",
                                      reinterpret_cast<uintptr_t>(&*c)))));

  EXPECT_THAT(GenericPrintToString(cp),
              AnyOf(Eq(absl::StrFormat("<%0*" PRIXPTR " pointing to abcdefg>",
                                       sizeof(void*) * 2,
                                       reinterpret_cast<uintptr_t>(&*cp))),
                    Eq(absl::StrFormat("<%#x pointing to abcdefg>",
                                       reinterpret_cast<uintptr_t>(&*cp)))));
}

TEST(GenericPrinterTest, SmartPointerToArrayOnlyPrintsAddressAndHelpText) {
  auto empty = std::make_unique<int[]>(0);
  auto nonempty = std::make_unique<int[]>(5);
  nonempty[0] = 12345;
  nonempty[4] = 54321;
  // NOTE: ArenaSafeUniquePtr is not meant to support array-type template
  // parameters, so we skip testing that here.
  // http://g/c-users/J-AEFrFHssY/UMMFzCkdBAAJ, b/265984185.

  EXPECT_THAT(
      GenericPrintToString(nonempty),
      AllOf(AnyOf(HasSubstr(absl::StrFormat(
                      "%0*" PRIXPTR, sizeof(void*) * 2,
                      reinterpret_cast<uintptr_t>(nonempty.get()))),
                  HasSubstr(absl::StrFormat(
                      "%#x", reinterpret_cast<uintptr_t>(nonempty.get())))),
            HasSubstr("array"), Not(HasSubstr("to 54321")),
            Not(HasSubstr("to 12345"))));

  EXPECT_THAT(
      GenericPrintToString(empty),
      AllOf(AnyOf(HasSubstr(absl::StrFormat(
                      "%0*" PRIXPTR, sizeof(void*) * 2,
                      reinterpret_cast<uintptr_t>(empty.get()))),
                  HasSubstr(absl::StrFormat(
                      "%#x", reinterpret_cast<uintptr_t>(empty.get())))),
            HasSubstr("array")));
}

TEST(GenericPrinterTest, SmartPointerToNonObjectType) {
  auto int_ptr_deleter = [](void* data) {
    int* p = static_cast<int*>(data);
    delete p;
  };

  std::unique_ptr<void, decltype(int_ptr_deleter)> void_ptr(new int(959),
                                                            int_ptr_deleter);

  EXPECT_THAT(GenericPrintToString(void_ptr),
              HasSubstr("pointing to a non-object type"));
}

TEST(GenericPrinterTest, PrintsCustomDeleterSmartPointer) {
  // Delete `p` (if not nullptr) only on the 4th time the deleter is used.
  auto four_deleter = [](std::string* p) {
    static int counter = 0;
    if (p == nullptr) return;  // skip calls to moved-from destructors.
    if (++counter >= 4) delete p;
  };

  // Have four `unique_ptr`s "manage" the same string-pointer, with only the
  // final (4th) call to the deleter deleting the string pointer.
  auto* unique_string = new std::string("unique string");
  std::vector<std::unique_ptr<std::string, decltype(four_deleter)>> test_ptrs;
  for (int i = 0; i < 4; ++i) {
    test_ptrs.emplace_back(unique_string, four_deleter);
  }

  EXPECT_THAT(GenericPrintToString(test_ptrs),
              HasExactlyNInstancesOf(4, "unique string"));
}

// Ensure that GenericPrint is robust to recursion when a type's operator<<
// calls into GenericPrint internally.
struct CustomRecursive {
  std::unique_ptr<CustomRecursive> next;
  int val = 0;

  friend std::ostream& operator<<(std::ostream& os, const CustomRecursive& cr) {
    return os << "custom print: next = " << GenericPrintToString(cr.next);
  }
};

TEST(GenericPrinterTest, DISABLED_CustomPrintOverloadRecursionDetected) {
  auto r1 = std::make_unique<CustomRecursive>();
  r1->val = 1;
  auto& r2 = r1->next = std::make_unique<CustomRecursive>();
  r2->val = 2;
  r2->next = std::move(r1);

  EXPECT_THAT(GenericPrintToString(*r2),
              AllOf(HasExactlyNInstancesOf(2, "custom print"),
                    HasExactlyNInstancesOf(1, "<recursive>")));

  r2->next = nullptr;  // break the cycle
}
// <end DISABLED_ test section>

enum CStyleEnum { kValue0, kValue1 };
TEST(GenericPrinterTest, Enum) {
  EXPECT_EQ("1", GenericPrintToString(kValue1));
}

enum class CppStyleEnum { kValue0, kValue1, kValue2 };
TEST(GenericPrinterTest, EnumClass) {
  EXPECT_EQ("2", GenericPrintToString(CppStyleEnum::kValue2));
}

enum class CharBasedEnum : char { kValueA = 'A', kValue1 = '\x01' };
TEST(GenericPrinterTest, CharBasedEnum) {
  EXPECT_EQ("'A' (0x41 65)", GenericPrintToString(CharBasedEnum::kValueA));
  EXPECT_EQ("'\\x01' (0x01 1)", GenericPrintToString(CharBasedEnum::kValue1));
}

enum class WideBasedEnum : uint64_t {
  kValue = std::numeric_limits<uint64_t>::max()
};
TEST(GenericPrinterTest, WideBasedEnum) {
  EXPECT_EQ(absl::StrCat(std::numeric_limits<uint64_t>::max()),
            GenericPrintToString(WideBasedEnum::kValue));
}

enum CStyleEnumWithStringify { kValueA = 0, kValueB = 2 };
template <typename Sink>
void AbslStringify(Sink& sink, CStyleEnumWithStringify e) {
  switch (e) {
    case CStyleEnumWithStringify::kValueA:
      sink.Append("A");
      return;
    case CStyleEnumWithStringify::kValueB:
      sink.Append("B");
      return;
  }
  sink.Append("??");
}
TEST(GenericPrinterTest, CStyleEnumWithStringify) {
  EXPECT_EQ("A", GenericPrintToString(CStyleEnumWithStringify::kValueA));
  EXPECT_EQ("??",
            GenericPrintToString(static_cast<CStyleEnumWithStringify>(1)));
}

enum class CppStyleEnumWithStringify { kValueA, kValueB, kValueC };
template <typename Sink>
void AbslStringify(Sink& sink, CppStyleEnumWithStringify e) {
  switch (e) {
    case CppStyleEnumWithStringify::kValueA:
      sink.Append("A");
      return;
    case CppStyleEnumWithStringify::kValueB:
      sink.Append("B");
      return;
    case CppStyleEnumWithStringify::kValueC:
      sink.Append("C");
      return;
  }
  sink.Append("??");
}
TEST(GenericPrinterTest, CppStyleEnumWithStringify) {
  EXPECT_EQ("A", GenericPrintToString(CppStyleEnumWithStringify::kValueA));
  EXPECT_EQ("??",
            GenericPrintToString(static_cast<CppStyleEnumWithStringify>(17)));
}

enum class CharBasedEnumWithStringify : char { kValueA = 'A', kValueB = 'B' };
template <typename Sink>
void AbslStringify(Sink& sink, CharBasedEnumWithStringify e) {
  switch (e) {
    case CharBasedEnumWithStringify::kValueA:
      sink.Append("charA");
      return;
    case CharBasedEnumWithStringify::kValueB:
      sink.Append("charB");
      return;
  }
  sink.Append("??");
}
TEST(GenericPrinterTest, CharBasedEnumWithStringify) {
  EXPECT_EQ("charA", GenericPrintToString(CharBasedEnumWithStringify::kValueA));
  EXPECT_EQ("??",
            GenericPrintToString(static_cast<CharBasedEnumWithStringify>('W')));
}

}  // namespace
}  // namespace strings_internal
ABSL_NAMESPACE_END
}  // namespace absl
