15 #include "absl/time/time.h"
28 #include "gmock/gmock.h"
29 #include "gtest/gtest.h"
30 #include "absl/numeric/int128.h"
31 #include "absl/time/clock.h"
32 #include "absl/time/internal/test_util.h"
36 #if defined(GTEST_USES_SIMPLE_RE) && GTEST_USES_SIMPLE_RE
37 const char kZoneAbbrRE[] =
".*";
39 const char kZoneAbbrRE[] =
"[A-Za-z]{3,4}|[-+][0-9]{2}([0-9]{2})?";
44 #define EXPECT_CIVIL_INFO(ci, y, m, d, h, min, s, off, isdst) \
46 EXPECT_EQ(y, ci.cs.year()); \
47 EXPECT_EQ(m, ci.cs.month()); \
48 EXPECT_EQ(d, ci.cs.day()); \
49 EXPECT_EQ(h, ci.cs.hour()); \
50 EXPECT_EQ(min, ci.cs.minute()); \
51 EXPECT_EQ(s, ci.cs.second()); \
52 EXPECT_EQ(off, ci.offset); \
53 EXPECT_EQ(isdst, ci.is_dst); \
54 EXPECT_THAT(ci.zone_abbr, testing::MatchesRegex(kZoneAbbrRE)); \
61 if (ts.tv_sec ==
arg.tv_sec && ts.tv_nsec ==
arg.tv_nsec)
return true;
62 *result_listener <<
"expected: {" << ts.tv_sec <<
", " << ts.tv_nsec <<
"} ";
63 *result_listener <<
"actual: {" <<
arg.tv_sec <<
", " <<
arg.tv_nsec <<
"}";
71 if (tv.tv_sec ==
arg.tv_sec && tv.tv_usec ==
arg.tv_usec)
return true;
72 *result_listener <<
"expected: {" << tv.tv_sec <<
", " << tv.tv_usec <<
"} ";
73 *result_listener <<
"actual: {" <<
arg.tv_sec <<
", " <<
arg.tv_usec <<
"}";
77 TEST(Time, ConstExpr) {
83 static_assert(t2 !=
absl::Time(),
"InfinitePast");
85 static_assert(t3 ==
absl::Time(),
"FromUnixNanos");
87 static_assert(t4 ==
absl::Time(),
"FromUnixMicros");
89 static_assert(t5 ==
absl::Time(),
"FromUnixMillis");
91 static_assert(t6 ==
absl::Time(),
"FromUnixSeconds");
93 static_assert(t7 ==
absl::Time(),
"FromTimeT");
96 TEST(Time, ValueSemantics) {
117 TEST(Time, Breakdown) {
144 TEST(Time, AdditiveOperators) {
173 TEST(Time, RelationalOperators) {
179 static_assert(
t1 ==
t1,
"");
180 static_assert(t2 == t2,
"");
181 static_assert(t3 == t3,
"");
183 static_assert(
t1 < t2,
"");
184 static_assert(t2 < t3,
"");
185 static_assert(
t1 < t3,
"");
187 static_assert(
t1 <=
t1,
"");
188 static_assert(
t1 <= t2,
"");
189 static_assert(t2 <= t2,
"");
190 static_assert(t2 <= t3,
"");
191 static_assert(t3 <= t3,
"");
192 static_assert(
t1 <= t3,
"");
194 static_assert(t2 >
t1,
"");
195 static_assert(t3 > t2,
"");
196 static_assert(t3 >
t1,
"");
198 static_assert(t2 >= t2,
"");
199 static_assert(t2 >=
t1,
"");
200 static_assert(t3 >= t3,
"");
201 static_assert(t3 >= t2,
"");
202 static_assert(
t1 >=
t1,
"");
203 static_assert(t3 >=
t1,
"");
206 TEST(Time, Infinity) {
210 static_assert(ifuture == ifuture,
"");
211 static_assert(ipast == ipast,
"");
212 static_assert(ipast < ifuture,
"");
213 static_assert(ifuture > ipast,
"");
227 static_assert(t < ifuture,
"");
228 static_assert(t > ipast,
"");
234 TEST(Time, FloorConversion) {
235 #define TEST_FLOOR_CONVERSION(TO, FROM) \
236 EXPECT_EQ(1, TO(FROM(1001))); \
237 EXPECT_EQ(1, TO(FROM(1000))); \
238 EXPECT_EQ(0, TO(FROM(999))); \
239 EXPECT_EQ(0, TO(FROM(1))); \
240 EXPECT_EQ(0, TO(FROM(0))); \
241 EXPECT_EQ(-1, TO(FROM(-1))); \
242 EXPECT_EQ(-1, TO(FROM(-999))); \
243 EXPECT_EQ(-1, TO(FROM(-1000))); \
244 EXPECT_EQ(-2, TO(FROM(-1001)));
251 #undef TEST_FLOOR_CONVERSION
300 for (
const auto&
test : to_ts) {
317 for (
const auto&
test : from_ts) {
337 for (
const auto&
test : to_tv) {
354 for (
const auto&
test : from_tv) {
379 TEST(Time, RoundtripConversion) {
380 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
381 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
385 #define TEST_CONVERSION_ROUND_TRIP(SOURCE, FROM, TO, MATCHER) \
386 EXPECT_THAT(TO(FROM(SOURCE)), MATCHER(SOURCE))
425 int64_t now_s = std::time(
nullptr);
437 time_t now_time_t = std::time(
nullptr);
475 ts.tv_nsec = 999999999;
509 << std::fixed << std::setprecision(17) << now_ud;
512 int64_t now_uni = ((719162
LL * (24 * 60 * 60)) * (1000 * 1000 * 10)) +
524 #undef TEST_CONVERSION_ROUND_TRIP
527 template <
typename Duration>
529 return std::chrono::system_clock::from_time_t(0) +
d;
550 const auto century_sec = 60 * 60 * 24 * 365 *
int64_t{100};
552 const auto chrono_future = MakeChronoUnixTime(century);
553 const auto chrono_past = MakeChronoUnixTime(-century);
566 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
567 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
571 EXPECT_EQ(std::chrono::system_clock::from_time_t(-1),
573 EXPECT_EQ(std::chrono::system_clock::from_time_t(0),
575 EXPECT_EQ(std::chrono::system_clock::from_time_t(1),
578 EXPECT_EQ(MakeChronoUnixTime(std::chrono::milliseconds(-1)),
580 EXPECT_EQ(MakeChronoUnixTime(std::chrono::milliseconds(0)),
582 EXPECT_EQ(MakeChronoUnixTime(std::chrono::milliseconds(1)),
587 EXPECT_EQ(std::chrono::system_clock::from_time_t(0) -
588 std::chrono::system_clock::duration(1),
593 TEST(Time, Chrono128) {
603 std::chrono::duration<absl::int128, std::atto>>;
614 EXPECT_EQ(tp, std::chrono::time_point_cast<
615 std::chrono::system_clock::time_point::duration>(
616 std::chrono::time_point_cast<Timestamp::duration>(tp)));
619 v *= Timestamp::duration::period::den;
621 ts += std::chrono::duration<int64_t, std::atto>(0);
623 ts.time_since_epoch().count() / Timestamp::duration::period::den);
625 ts.time_since_epoch().count() % Timestamp::duration::period::den);
627 v *= Timestamp::duration::period::den;
629 ts += std::chrono::duration<int64_t, std::atto>(999999999750000000);
631 ts.time_since_epoch().count() / Timestamp::duration::period::den);
633 ts.time_since_epoch().count() % Timestamp::duration::period::den);
636 TEST(Time, TimeZoneAt) {
643 const auto nov01_ci = nyc.
At(nov01);
645 EXPECT_EQ(
"Fri, 1 Nov 2013 08:30:00 -0400 (EDT)",
655 const auto mar_ci = nyc.
At(mar13);
657 EXPECT_EQ(
"Sun, 13 Mar 2011 03:15:00 -0400 (EDT)",
659 EXPECT_EQ(
"Sun, 13 Mar 2011 03:00:00 -0400 (EDT)",
661 EXPECT_EQ(
"Sun, 13 Mar 2011 01:15:00 -0500 (EST)",
669 const auto nov06_ci = nyc.
At(nov06);
671 EXPECT_EQ(
"Sun, 6 Nov 2011 01:15:00 -0400 (EDT)",
673 EXPECT_EQ(
"Sun, 6 Nov 2011 01:00:00 -0500 (EST)",
675 EXPECT_EQ(
"Sun, 6 Nov 2011 01:15:00 -0500 (EST)",
681 const auto minus1_cl = nyc.
At(minus1);
684 EXPECT_EQ(
"Wed, 31 Dec 1969 18:59:59 -0500 (EST)",
686 EXPECT_EQ(
"Wed, 31 Dec 1969 23:59:59 +0000 (UTC)",
692 TEST(Time, FromCivilUTC) {
702 EXPECT_EQ(
"Fri, 25 Nov 292277026596 12:21:07 +0000 (UTC)",
711 EXPECT_EQ(
"Fri, 1 Nov -292277022657 10:37:52 +0000 (UTC)",
719 EXPECT_EQ(
"Wed, 28 Feb 1900 23:59:59 +0000 (UTC)",
722 EXPECT_EQ(
"Thu, 1 Mar 1900 00:00:00 +0000 (UTC)",
725 EXPECT_EQ(
"Tue, 29 Feb 2000 23:59:59 +0000 (UTC)",
728 EXPECT_EQ(
"Wed, 1 Mar 2000 00:00:00 +0000 (UTC)",
742 const struct tm tm_bt =
ToTM(t, utc);
746 gmtime_s(&tm_lc, &tt);
748 gmtime_r(&tt, &tm_lc);
758 EXPECT_EQ(tm_lc.tm_isdst, tm_bt.tm_isdst);
807 tm.tm_year = 2014 - 1900;
824 tm.tm_year = 2014 - 1900;
841 tm.tm_year = 2014 - 1900;
858 tm.tm_year = 2147483647 - 1900 + 1;
866 EXPECT_EQ(
"2147483648-06-28T01:02:03+00:00",
870 tm.tm_year = 2019 - 1900;
871 tm.tm_mon = 2147483647;
878 EXPECT_EQ(
"178958989-08-28T01:02:03+00:00",
882 TEST(Time, TMRoundTrip) {
920 for (
const auto base : bases) {
961 TEST(Time, ConversionSaturation) {
967 time_t tt = max_time_t - 1;
989 const auto max_timeval_sec =
991 const auto min_timeval_sec =
994 tv.
tv_sec = max_timeval_sec;
1009 tv.
tv_sec = min_timeval_sec;
1024 const auto max_timespec_sec =
1025 std::numeric_limits<decltype(timespec::tv_sec)>
::max();
1026 const auto min_timespec_sec =
1027 std::numeric_limits<decltype(timespec::tv_sec)>
::min();
1029 ts.tv_sec = max_timespec_sec;
1030 ts.tv_nsec = 999999998;
1044 ts.tv_sec = min_timespec_sec;
1077 EXPECT_EQ(
"292277026596-12-04T15:30:06+00:00",
1080 EXPECT_EQ(
"292277026596-12-04T15:30:07+00:00",
1089 EXPECT_EQ(
"292277026596-12-05T05:30:07+14:00",
1101 EXPECT_EQ(
"-292277022657-01-27T08:29:53+00:00",
1104 EXPECT_EQ(
"-292277022657-01-27T08:29:52+00:00",
1114 EXPECT_EQ(
"-292277022657-01-26T20:29:52-12:00",
1128 TEST(Time, ExtendedConversionSaturation) {
1167 TEST(Time, FromCivilAlignment) {
1184 TEST(Time, LegacyDateTime) {
1192 kMax, kMax, kMax, kMax, utc);
1196 kMin, kMin, kMin, kMin, utc);
1227 TEST(Time, NextTransitionUTC) {
1238 TEST(Time, PrevTransitionUTC) {
1249 TEST(Time, NextTransitionNYC) {
1273 TEST(Time, PrevTransitionNYC) {