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 };