Add time hash tests

PiperOrigin-RevId: 730223619
Change-Id: I0e4712477cfbf4b45cb069ebb9d479d27b5767e5
diff --git a/absl/time/BUILD.bazel b/absl/time/BUILD.bazel
index e0bf96b..b577d92 100644
--- a/absl/time/BUILD.bazel
+++ b/absl/time/BUILD.bazel
@@ -97,6 +97,7 @@
         ":time",
         "//absl/base:config",
         "//absl/base:core_headers",
+        "//absl/hash:hash_testing",
         "//absl/numeric:int128",
         "//absl/strings:str_format",
         "//absl/time/internal/cctz:time_zone",
diff --git a/absl/time/CMakeLists.txt b/absl/time/CMakeLists.txt
index fe625f2..a48689c 100644
--- a/absl/time/CMakeLists.txt
+++ b/absl/time/CMakeLists.txt
@@ -121,6 +121,7 @@
     absl::time
     absl::config
     absl::core_headers
+    absl::hash_testing
     absl::strings
     absl::str_format
     absl::time_zone
diff --git a/absl/time/civil_time_test.cc b/absl/time/civil_time_test.cc
index 19292a9..6e5c35d 100644
--- a/absl/time/civil_time_test.cc
+++ b/absl/time/civil_time_test.cc
@@ -21,6 +21,7 @@
 
 #include "gtest/gtest.h"
 #include "absl/base/macros.h"
+#include "absl/hash/hash_testing.h"
 #include "absl/strings/str_format.h"
 
 namespace {
@@ -1259,4 +1260,137 @@
   }
 }
 
+TEST(CivilTime, SupportsHash) {
+  // To check that every field is used by the hash implementation, test
+  // with values that have all fields the same bar one, for each field.
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::CivilYear(2017),
+      absl::CivilYear(2018),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::CivilMonth(2017, 1),
+      absl::CivilMonth(2017, 2),
+      absl::CivilMonth(2018, 1),
+      absl::CivilMonth(2018, 2),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::CivilDay(2017, 1, 1),
+      absl::CivilDay(2017, 1, 2),
+      absl::CivilDay(2017, 2, 1),
+      absl::CivilDay(2017, 2, 2),
+      absl::CivilDay(2018, 1, 1),
+      absl::CivilDay(2018, 1, 2),
+      absl::CivilDay(2018, 2, 1),
+      absl::CivilDay(2018, 2, 2),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::CivilHour(2017, 1, 1, 0),
+      absl::CivilHour(2017, 1, 1, 1),
+      absl::CivilHour(2017, 1, 2, 0),
+      absl::CivilHour(2017, 1, 2, 1),
+      absl::CivilHour(2017, 2, 1, 0),
+      absl::CivilHour(2017, 2, 1, 1),
+      absl::CivilHour(2017, 2, 2, 0),
+      absl::CivilHour(2017, 2, 2, 1),
+      absl::CivilHour(2018, 1, 1, 0),
+      absl::CivilHour(2018, 1, 1, 1),
+      absl::CivilHour(2018, 1, 2, 0),
+      absl::CivilHour(2018, 1, 2, 1),
+      absl::CivilHour(2018, 2, 1, 0),
+      absl::CivilHour(2018, 2, 1, 1),
+      absl::CivilHour(2018, 2, 2, 0),
+      absl::CivilHour(2018, 2, 2, 1),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::CivilMinute(2017, 1, 1, 0, 0), absl::CivilMinute(2017, 1, 1, 0, 1),
+      absl::CivilMinute(2017, 1, 1, 1, 0), absl::CivilMinute(2017, 1, 1, 1, 1),
+      absl::CivilMinute(2017, 1, 2, 0, 0), absl::CivilMinute(2017, 1, 2, 0, 1),
+      absl::CivilMinute(2017, 1, 2, 1, 0), absl::CivilMinute(2017, 1, 2, 1, 1),
+      absl::CivilMinute(2017, 2, 1, 0, 0), absl::CivilMinute(2017, 2, 1, 0, 1),
+      absl::CivilMinute(2017, 2, 1, 1, 0), absl::CivilMinute(2017, 2, 1, 1, 1),
+      absl::CivilMinute(2017, 2, 2, 0, 0), absl::CivilMinute(2017, 2, 2, 0, 1),
+      absl::CivilMinute(2017, 2, 2, 1, 0), absl::CivilMinute(2017, 2, 2, 1, 1),
+      absl::CivilMinute(2018, 1, 1, 0, 0), absl::CivilMinute(2018, 1, 1, 0, 1),
+      absl::CivilMinute(2018, 1, 1, 1, 0), absl::CivilMinute(2018, 1, 1, 1, 1),
+      absl::CivilMinute(2018, 1, 2, 0, 0), absl::CivilMinute(2018, 1, 2, 0, 1),
+      absl::CivilMinute(2018, 1, 2, 1, 0), absl::CivilMinute(2018, 1, 2, 1, 1),
+      absl::CivilMinute(2018, 2, 1, 0, 0), absl::CivilMinute(2018, 2, 1, 0, 1),
+      absl::CivilMinute(2018, 2, 1, 1, 0), absl::CivilMinute(2018, 2, 1, 1, 1),
+      absl::CivilMinute(2018, 2, 2, 0, 0), absl::CivilMinute(2018, 2, 2, 0, 1),
+      absl::CivilMinute(2018, 2, 2, 1, 0), absl::CivilMinute(2018, 2, 2, 1, 1),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::CivilSecond(2017, 1, 1, 0, 0, 0),
+      absl::CivilSecond(2017, 1, 1, 0, 0, 1),
+      absl::CivilSecond(2017, 1, 1, 0, 1, 0),
+      absl::CivilSecond(2017, 1, 1, 0, 1, 1),
+      absl::CivilSecond(2017, 1, 1, 1, 0, 0),
+      absl::CivilSecond(2017, 1, 1, 1, 0, 1),
+      absl::CivilSecond(2017, 1, 1, 1, 1, 0),
+      absl::CivilSecond(2017, 1, 1, 1, 1, 1),
+      absl::CivilSecond(2017, 1, 2, 0, 0, 0),
+      absl::CivilSecond(2017, 1, 2, 0, 0, 1),
+      absl::CivilSecond(2017, 1, 2, 0, 1, 0),
+      absl::CivilSecond(2017, 1, 2, 0, 1, 1),
+      absl::CivilSecond(2017, 1, 2, 1, 0, 0),
+      absl::CivilSecond(2017, 1, 2, 1, 0, 1),
+      absl::CivilSecond(2017, 1, 2, 1, 1, 0),
+      absl::CivilSecond(2017, 1, 2, 1, 1, 1),
+      absl::CivilSecond(2017, 2, 1, 0, 0, 0),
+      absl::CivilSecond(2017, 2, 1, 0, 0, 1),
+      absl::CivilSecond(2017, 2, 1, 0, 1, 0),
+      absl::CivilSecond(2017, 2, 1, 0, 1, 1),
+      absl::CivilSecond(2017, 2, 1, 1, 0, 0),
+      absl::CivilSecond(2017, 2, 1, 1, 0, 1),
+      absl::CivilSecond(2017, 2, 1, 1, 1, 0),
+      absl::CivilSecond(2017, 2, 1, 1, 1, 1),
+      absl::CivilSecond(2017, 2, 2, 0, 0, 0),
+      absl::CivilSecond(2017, 2, 2, 0, 0, 1),
+      absl::CivilSecond(2017, 2, 2, 0, 1, 0),
+      absl::CivilSecond(2017, 2, 2, 0, 1, 1),
+      absl::CivilSecond(2017, 2, 2, 1, 0, 0),
+      absl::CivilSecond(2017, 2, 2, 1, 0, 1),
+      absl::CivilSecond(2017, 2, 2, 1, 1, 0),
+      absl::CivilSecond(2017, 2, 2, 1, 1, 1),
+      absl::CivilSecond(2018, 1, 1, 0, 0, 0),
+      absl::CivilSecond(2018, 1, 1, 0, 0, 1),
+      absl::CivilSecond(2018, 1, 1, 0, 1, 0),
+      absl::CivilSecond(2018, 1, 1, 0, 1, 1),
+      absl::CivilSecond(2018, 1, 1, 1, 0, 0),
+      absl::CivilSecond(2018, 1, 1, 1, 0, 1),
+      absl::CivilSecond(2018, 1, 1, 1, 1, 0),
+      absl::CivilSecond(2018, 1, 1, 1, 1, 1),
+      absl::CivilSecond(2018, 1, 2, 0, 0, 0),
+      absl::CivilSecond(2018, 1, 2, 0, 0, 1),
+      absl::CivilSecond(2018, 1, 2, 0, 1, 0),
+      absl::CivilSecond(2018, 1, 2, 0, 1, 1),
+      absl::CivilSecond(2018, 1, 2, 1, 0, 0),
+      absl::CivilSecond(2018, 1, 2, 1, 0, 1),
+      absl::CivilSecond(2018, 1, 2, 1, 1, 0),
+      absl::CivilSecond(2018, 1, 2, 1, 1, 1),
+      absl::CivilSecond(2018, 2, 1, 0, 0, 0),
+      absl::CivilSecond(2018, 2, 1, 0, 0, 1),
+      absl::CivilSecond(2018, 2, 1, 0, 1, 0),
+      absl::CivilSecond(2018, 2, 1, 0, 1, 1),
+      absl::CivilSecond(2018, 2, 1, 1, 0, 0),
+      absl::CivilSecond(2018, 2, 1, 1, 0, 1),
+      absl::CivilSecond(2018, 2, 1, 1, 1, 0),
+      absl::CivilSecond(2018, 2, 1, 1, 1, 1),
+      absl::CivilSecond(2018, 2, 2, 0, 0, 0),
+      absl::CivilSecond(2018, 2, 2, 0, 0, 1),
+      absl::CivilSecond(2018, 2, 2, 0, 1, 0),
+      absl::CivilSecond(2018, 2, 2, 0, 1, 1),
+      absl::CivilSecond(2018, 2, 2, 1, 0, 0),
+      absl::CivilSecond(2018, 2, 2, 1, 0, 1),
+      absl::CivilSecond(2018, 2, 2, 1, 1, 0),
+      absl::CivilSecond(2018, 2, 2, 1, 1, 1),
+  }));
+}
+
 }  // namespace
diff --git a/absl/time/time_test.cc b/absl/time/time_test.cc
index 6f21008..7033326 100644
--- a/absl/time/time_test.cc
+++ b/absl/time/time_test.cc
@@ -41,6 +41,7 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
+#include "absl/hash/hash_testing.h"
 #include "absl/numeric/int128.h"
 #include "absl/strings/str_format.h"
 #include "absl/time/clock.h"
@@ -1335,4 +1336,29 @@
   EXPECT_EQ(absl::StrFormat("%v", t), absl::FormatTime(t));
 }
 
+TEST(Time, SupportsHash) {
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::UTCTimeZone(),
+      absl::FixedTimeZone(-8 * 60 * 60),
+      absl::UTCTimeZone(),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::Now(),
+      absl::UnixEpoch(),
+      absl::UnixEpoch() + absl::Seconds(60),
+      absl::UnixEpoch() + absl::Minutes(1),
+      absl::InfiniteFuture(),
+      absl::InfinitePast(),
+  }));
+
+  EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
+      absl::Seconds(1),
+      absl::Seconds(60),
+      absl::Minutes(1),
+      absl::InfiniteDuration(),
+      -absl::InfiniteDuration(),
+  }));
+}
+
 }  // namespace