Add better support for printing of absl::[u]int128. PiperOrigin-RevId: 551588215
diff --git a/fuzztest/BUILD b/fuzztest/BUILD index a59a361..f4d42ca 100644 --- a/fuzztest/BUILD +++ b/fuzztest/BUILD
@@ -471,6 +471,7 @@ ":absl_helpers", ":meta", "@com_google_absl//absl/debugging:symbolize", + "@com_google_absl//absl/numeric:int128", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", "@com_google_absl//absl/time", @@ -484,6 +485,7 @@ ":domain", ":test_protobuf_cc_proto", ":type_support", + "@com_google_absl//absl/numeric:int128", "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", "@com_google_absl//absl/time",
diff --git a/fuzztest/internal/type_support.cc b/fuzztest/internal/type_support.cc index 120ce06..602b7d9 100644 --- a/fuzztest/internal/type_support.cc +++ b/fuzztest/internal/type_support.cc
@@ -21,6 +21,7 @@ #include <limits> #include <string> +#include "absl/numeric/int128.h" #include "absl/strings/match.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h" @@ -52,11 +53,13 @@ absl::Format(out, "%s", v ? "true" : "false"); } -void IntegralPrinter::PrintUserValue(uint64_t v, RawSink out, PrintMode) const { +void IntegralPrinter::PrintUserValue(absl::uint128 v, RawSink out, + PrintMode) const { absl::Format(out, "%d", v); } -void IntegralPrinter::PrintUserValue(int64_t v, RawSink out, PrintMode) const { +void IntegralPrinter::PrintUserValue(absl::int128 v, RawSink out, + PrintMode) const { absl::Format(out, "%d", v); }
diff --git a/fuzztest/internal/type_support.h b/fuzztest/internal/type_support.h index 4602006..d48fd51 100644 --- a/fuzztest/internal/type_support.h +++ b/fuzztest/internal/type_support.h
@@ -25,6 +25,7 @@ #include <utility> #include "absl/debugging/symbolize.h" +#include "absl/numeric/int128.h" #include "absl/strings/escaping.h" #include "absl/strings/match.h" #include "absl/strings/str_format.h" @@ -143,16 +144,17 @@ break; } } else if constexpr (std::is_signed_v<T>) { - PrintUserValue(static_cast<int64_t>(v), out, mode); + // Cast to [u]int128 to cover all integral types. + PrintUserValue(static_cast<absl::int128>(v), out, mode); } else { - PrintUserValue(static_cast<uint64_t>(v), out, mode); + PrintUserValue(static_cast<absl::uint128>(v), out, mode); } } void PrintUserValue(bool v, RawSink out, PrintMode mode) const; void PrintUserValue(char v, RawSink out, PrintMode mode) const; - void PrintUserValue(uint64_t v, RawSink out, PrintMode mode) const; - void PrintUserValue(int64_t v, RawSink out, PrintMode mode) const; + void PrintUserValue(absl::uint128 v, RawSink out, PrintMode mode) const; + void PrintUserValue(absl::int128 v, RawSink out, PrintMode mode) const; }; struct FloatingPrinter {
diff --git a/fuzztest/internal/type_support_test.cc b/fuzztest/internal/type_support_test.cc index 72625cb..9a119ba 100644 --- a/fuzztest/internal/type_support_test.cc +++ b/fuzztest/internal/type_support_test.cc
@@ -35,6 +35,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/numeric/int128.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/strip.h" @@ -88,21 +89,30 @@ template <typename T> class IntegralTest : public testing::Test {}; -using IntegralTypes = testing::Types<signed char, unsigned char, // - short, unsigned short, // - int, unsigned int, // - long, unsigned long, // - long long, unsigned long long>; +using IntegralTypes = testing::Types<signed char, unsigned char, // + short, unsigned short, // + int, unsigned int, // + long, unsigned long, // + long long, unsigned long long, // + absl::int128, absl::uint128>; TYPED_TEST_SUITE(IntegralTest, IntegralTypes); TYPED_TEST(IntegralTest, Printer) { for (auto v : {TypeParam{0}, std::numeric_limits<TypeParam>::min(), std::numeric_limits<TypeParam>::max()}) { - EXPECT_THAT(TestPrintValue(v), Each(std::to_string(v))); + if constexpr (std::is_integral_v<TypeParam>) { + EXPECT_THAT(TestPrintValue(v), Each(std::to_string(v))); + } else { + // Once the absl stable version supports [u]int128, and also + // have same output for chat streamline the implementation and use only + // StrFormat for all types. + std::stringstream ss; + ss << v; + EXPECT_THAT(TestPrintValue(v), Each(ss.str())); + } } } - enum Color { kRed, kBlue, kGreen }; enum ColorChar : char { kRedChar = 'r', kBlueChar = 'b' }; enum class ColorClass { kRed, kBlue, kGreen };