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