29 #include "gmock/gmock.h"
30 #include "gtest/gtest.h"
31 #include "absl/time/time.h"
46 if (ts.tv_sec ==
arg.tv_sec && ts.tv_nsec ==
arg.tv_nsec)
48 *result_listener <<
"expected: {" << ts.tv_sec <<
", " << ts.tv_nsec <<
"} ";
49 *result_listener <<
"actual: {" <<
arg.tv_sec <<
", " <<
arg.tv_nsec <<
"}";
57 if (tv.tv_sec ==
arg.tv_sec && tv.tv_usec ==
arg.tv_usec)
59 *result_listener <<
"expected: {" << tv.tv_sec <<
", " << tv.tv_usec <<
"} ";
60 *result_listener <<
"actual: {" <<
arg.tv_sec <<
", " <<
arg.tv_usec <<
"}";
126 #define TEST_DURATION_CONVERSION(UNIT) \
128 const absl::Duration d = absl::UNIT(1.5); \
129 constexpr absl::Duration z = absl::ZeroDuration(); \
130 constexpr absl::Duration inf = absl::InfiniteDuration(); \
131 constexpr double dbl_inf = std::numeric_limits<double>::infinity(); \
132 EXPECT_EQ(kint64min, absl::ToInt64##UNIT(-inf)); \
133 EXPECT_EQ(-1, absl::ToInt64##UNIT(-d)); \
134 EXPECT_EQ(0, absl::ToInt64##UNIT(z)); \
135 EXPECT_EQ(1, absl::ToInt64##UNIT(d)); \
136 EXPECT_EQ(kint64max, absl::ToInt64##UNIT(inf)); \
137 EXPECT_EQ(-dbl_inf, absl::ToDouble##UNIT(-inf)); \
138 EXPECT_EQ(-1.5, absl::ToDouble##UNIT(-d)); \
139 EXPECT_EQ(0, absl::ToDouble##UNIT(z)); \
140 EXPECT_EQ(1.5, absl::ToDouble##UNIT(d)); \
141 EXPECT_EQ(dbl_inf, absl::ToDouble##UNIT(inf)); \
151 #undef TEST_DURATION_CONVERSION
155 void TestToConversion() {
201 TestToConversion<43>();
202 TestToConversion<1>();
203 TestToConversion<0>();
204 TestToConversion<-1>();
205 TestToConversion<-43>();
209 void TestFromChronoBasicEquality() {
210 using std::chrono::nanoseconds;
211 using std::chrono::microseconds;
212 using std::chrono::milliseconds;
214 using std::chrono::minutes;
215 using std::chrono::hours;
226 TestFromChronoBasicEquality<-123>();
227 TestFromChronoBasicEquality<-1>();
228 TestFromChronoBasicEquality<0>();
229 TestFromChronoBasicEquality<1>();
230 TestFromChronoBasicEquality<123>();
235 const int64_t minutes_max_count = chrono_minutes_max.count();
236 if (minutes_max_count >
kint64max / 60) {
245 const int64_t minutes_min_count = chrono_minutes_min.count();
246 if (minutes_min_count <
kint64min / 60) {
255 const int64_t hours_max_count = chrono_hours_max.count();
256 if (hours_max_count >
kint64max / 3600) {
265 const int64_t hours_min_count = chrono_hours_min.count();
266 if (hours_min_count <
kint64min / 3600) {
274 void TestToChrono() {
275 using std::chrono::nanoseconds;
276 using std::chrono::microseconds;
277 using std::chrono::milliseconds;
279 using std::chrono::minutes;
280 using std::chrono::hours;
288 auto chrono_minutes = minutes(
N);
297 auto chrono_hours = hours(
N);
307 using std::chrono::nanoseconds;
308 using std::chrono::microseconds;
309 using std::chrono::milliseconds;
311 using std::chrono::minutes;
312 using std::chrono::hours;
314 TestToChrono<kint64min>();
318 TestToChrono<kint64max>();
352 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
353 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
358 #define TEST_FACTORY_OVERLOADS(NAME) \
359 EXPECT_EQ(1, NAME(kOne) / NAME(kOne)); \
360 EXPECT_EQ(1, NAME(static_cast<int8_t>(1)) / NAME(1)); \
361 EXPECT_EQ(1, NAME(static_cast<int16_t>(1)) / NAME(1)); \
362 EXPECT_EQ(1, NAME(static_cast<int32_t>(1)) / NAME(1)); \
363 EXPECT_EQ(1, NAME(static_cast<int64_t>(1)) / NAME(1)); \
364 EXPECT_EQ(1, NAME(static_cast<uint8_t>(1)) / NAME(1)); \
365 EXPECT_EQ(1, NAME(static_cast<uint16_t>(1)) / NAME(1)); \
366 EXPECT_EQ(1, NAME(static_cast<uint32_t>(1)) / NAME(1)); \
367 EXPECT_EQ(1, NAME(static_cast<uint64_t>(1)) / NAME(1)); \
368 EXPECT_EQ(NAME(1) / 2, NAME(static_cast<float>(0.5))); \
369 EXPECT_EQ(NAME(1) / 2, NAME(static_cast<double>(0.5))); \
370 EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<float>(1.5)), NAME(1))); \
371 EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<double>(1.5)), NAME(1)));
380 #undef TEST_FACTORY_OVERLOADS
386 const double dbl_inf = std::numeric_limits<double>::infinity();
469 const double dbl_inf = std::numeric_limits<double>::infinity();
506 const double dbl_inf = std::numeric_limits<double>::infinity();
518 #define TEST_INF_MUL_WITH_TYPE(T) \
519 EXPECT_EQ(inf, inf * static_cast<T>(2)); \
520 EXPECT_EQ(-inf, inf * static_cast<T>(-2)); \
521 EXPECT_EQ(-inf, -inf * static_cast<T>(2)); \
522 EXPECT_EQ(inf, -inf * static_cast<T>(-2)); \
523 EXPECT_EQ(inf, inf * static_cast<T>(0)); \
524 EXPECT_EQ(-inf, -inf * static_cast<T>(0)); \
525 EXPECT_EQ(inf, sec_max * static_cast<T>(2)); \
526 EXPECT_EQ(inf, sec_min * static_cast<T>(-2)); \
527 EXPECT_EQ(inf, (sec_max / static_cast<T>(2)) * static_cast<T>(3)); \
528 EXPECT_EQ(-inf, sec_max * static_cast<T>(-2)); \
529 EXPECT_EQ(-inf, sec_min * static_cast<T>(2)); \
530 EXPECT_EQ(-inf, (sec_min / static_cast<T>(2)) * static_cast<T>(3));
535 #undef TEST_INF_MUL_WITH_TYPE
537 const double dbl_inf = std::numeric_limits<double>::infinity();
571 #define TEST_INF_DIV_WITH_TYPE(T) \
572 EXPECT_EQ(inf, inf / static_cast<T>(2)); \
573 EXPECT_EQ(-inf, inf / static_cast<T>(-2)); \
574 EXPECT_EQ(-inf, -inf / static_cast<T>(2)); \
575 EXPECT_EQ(inf, -inf / static_cast<T>(-2));
580 #undef TEST_INF_DIV_WITH_TYPE
590 const double dbl_inf = std::numeric_limits<double>::infinity();
635 const double dbl_inf = std::numeric_limits<double>::infinity();
747 const double dbl_inf = std::numeric_limits<double>::infinity();
768 const double dbl_inf = std::numeric_limits<double>::infinity();
769 const double dbl_denorm = std::numeric_limits<double>::denorm_min();
814 #define TEST_NAN_HANDLING(NAME, NAN) \
816 const auto inf = absl::InfiniteDuration(); \
817 auto x = NAME(NAN); \
818 EXPECT_TRUE(x == inf || x == -inf); \
821 EXPECT_TRUE(y == inf || y == -inf); \
824 EXPECT_TRUE(z == inf || z == -inf); \
827 const double nan = std::numeric_limits<double>::quiet_NaN();
842 #undef TEST_NAN_HANDLING
866 #define TEST_REL_OPS(UNIT) \
867 static_assert(UNIT(2) == UNIT(2), ""); \
868 static_assert(UNIT(1) != UNIT(2), ""); \
869 static_assert(UNIT(1) < UNIT(2), ""); \
870 static_assert(UNIT(3) > UNIT(2), ""); \
871 static_assert(UNIT(1) <= UNIT(2), ""); \
872 static_assert(UNIT(2) <= UNIT(2), ""); \
873 static_assert(UNIT(3) >= UNIT(2), ""); \
874 static_assert(UNIT(2) >= UNIT(2), "");
887 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
888 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
892 #define TEST_ADD_OPS(UNIT) \
894 EXPECT_EQ(UNIT(2), UNIT(1) + UNIT(1)); \
895 EXPECT_EQ(UNIT(1), UNIT(2) - UNIT(1)); \
896 EXPECT_EQ(UNIT(0), UNIT(2) - UNIT(2)); \
897 EXPECT_EQ(UNIT(-1), UNIT(1) - UNIT(2)); \
898 EXPECT_EQ(UNIT(-2), UNIT(0) - UNIT(2)); \
899 EXPECT_EQ(UNIT(-2), UNIT(1) - UNIT(3)); \
900 absl::Duration a = UNIT(1); \
902 EXPECT_EQ(UNIT(2), a); \
904 EXPECT_EQ(UNIT(1), a); \
972 constexpr
absl::Duration negated_nearly_min_duration = -nearly_min_duration;
974 EXPECT_EQ(negated_max_duration, nearly_min_duration);
975 EXPECT_EQ(negated_nearly_min_duration, max_duration);
976 EXPECT_EQ(-(-max_duration), max_duration);
985 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
986 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
1007 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
1008 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
1012 #define TEST_MUL_OPS(UNIT) \
1014 EXPECT_EQ(UNIT(5), UNIT(2) * 2.5); \
1015 EXPECT_EQ(UNIT(2), UNIT(5) / 2.5); \
1016 EXPECT_EQ(UNIT(-5), UNIT(-2) * 2.5); \
1017 EXPECT_EQ(UNIT(-5), -UNIT(2) * 2.5); \
1018 EXPECT_EQ(UNIT(-5), UNIT(2) * -2.5); \
1019 EXPECT_EQ(UNIT(-2), UNIT(-5) / 2.5); \
1020 EXPECT_EQ(UNIT(-2), -UNIT(5) / 2.5); \
1021 EXPECT_EQ(UNIT(-2), UNIT(5) / -2.5); \
1022 EXPECT_EQ(UNIT(2), UNIT(11) % UNIT(3)); \
1023 absl::Duration a = UNIT(2); \
1025 EXPECT_EQ(UNIT(5), a); \
1027 EXPECT_EQ(UNIT(2), a); \
1029 EXPECT_EQ(UNIT(0), a); \
1030 absl::Duration big = UNIT(1000000000); \
1033 EXPECT_EQ(UNIT(1000000000), big); \
1034 EXPECT_EQ(-UNIT(2), -UNIT(2)); \
1035 EXPECT_EQ(-UNIT(2), UNIT(2) * -1); \
1036 EXPECT_EQ(-UNIT(2), -1 * UNIT(2)); \
1037 EXPECT_EQ(-UNIT(-2), UNIT(2)); \
1038 EXPECT_EQ(2, UNIT(2) / UNIT(1)); \
1039 absl::Duration rem; \
1040 EXPECT_EQ(2, absl::IDivDuration(UNIT(2), UNIT(1), &rem)); \
1041 EXPECT_EQ(2.0, absl::FDivDuration(UNIT(2), UNIT(1))); \
1111 #define TEST_MOD_IDENTITY(a, b) \
1112 EXPECT_EQ((a), ((a) / (b))*(b) + ((a)%(b)))
1145 #undef TEST_MOD_IDENTITY
1151 for (
int unit_sign : {1, -1}) {
1175 for (
int unit_sign : {1, -1}) {
1199 for (
int unit_sign : {1, -1}) {
1221 const int kRange = 100000;
1223 #define ROUND_TRIP_UNIT(U, LOW, HIGH) \
1225 for (int64_t i = LOW; i < HIGH; ++i) { \
1226 absl::Duration d = absl::U(i); \
1227 if (d == absl::InfiniteDuration()) \
1228 EXPECT_EQ(kint64max, d / absl::U(1)); \
1229 else if (d == -absl::InfiniteDuration()) \
1230 EXPECT_EQ(kint64min, d / absl::U(1)); \
1232 EXPECT_EQ(i, absl::U(i) / absl::U(1)); \
1260 #undef ROUND_TRIP_UNIT
1264 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
1265 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
1285 for (
const auto&
test : to_ts) {
1302 for (
const auto&
test : from_ts) {
1322 for (
const auto&
test : to_tv) {
1339 for (
const auto&
test : from_tv) {
1398 void VerifyApproxSameAsMul(
double time_as_seconds,
int*
const misses) {
1400 auto mul_by_one_second = time_as_seconds *
absl::Seconds(1);
1405 if (*misses > 10)
return;
1406 ASSERT_LE(++(*misses), 10) <<
"Too many errors, not reporting more.";
1407 EXPECT_EQ(direct_seconds, mul_by_one_second)
1408 <<
"given double time_as_seconds = " << std::setprecision(17)
1419 #if (defined(__i386__) || defined(_M_IX86)) && FLT_EVAL_METHOD != 0
1424 <<
"Skipping the test because we detected x87 floating-point semantics";
1452 double midpoint = low_edge + (high_edge - low_edge) / 2;
1453 if (midpoint == low_edge || midpoint == high_edge)
break;
1455 if (mid_duration ==
d) {
1456 low_edge = midpoint;
1459 high_edge = midpoint;
1464 VerifyApproxSameAsMul(low_edge, &misses);
1465 VerifyApproxSameAsMul(high_edge, &misses);
1472 std::random_device rd;
1473 std::seed_seq
seed({rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()});
1480 std::uniform_real_distribution<double> uniform(
std::log(0.125e-9),
1483 for (
int i = 0;
i < 1000000; ++
i) {
1484 double d = std::exp(uniform(
gen));
1485 VerifyApproxSameAsMul(
d, &misses);
1486 VerifyApproxSameAsMul(-
d, &misses);
1493 const auto max_timeval_sec =
1495 const auto min_timeval_sec =
1498 tv.
tv_sec = max_timeval_sec;
1513 tv.
tv_sec = min_timeval_sec;
1528 const auto max_timespec_sec =
1529 std::numeric_limits<decltype(timespec::tv_sec)>
::max();
1530 const auto min_timespec_sec =
1531 std::numeric_limits<decltype(timespec::tv_sec)>
::min();
1533 ts.tv_sec = max_timespec_sec;
1534 ts.tv_nsec = 999999998;
1548 ts.tv_sec = min_timespec_sec;
1565 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
1566 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
1662 EXPECT_EQ(
"2562047788015215h30m7.99999999975s",
1682 EXPECT_EQ(
"876000000000000h0.999999999s",
1685 EXPECT_EQ(
"876000000000000h0.9999999995s",
1688 EXPECT_EQ(
"876000000000000h0.99999999975s",
1692 EXPECT_EQ(
"-876000000000000h0.999999999s",
1695 EXPECT_EQ(
"-876000000000000h0.9999999995s",
1698 EXPECT_EQ(
"-876000000000000h0.99999999975s",
1704 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
1705 ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
1819 #define TEST_PARSE_ROUNDTRIP(d) \
1821 std::string s = absl::FormatDuration(d); \
1822 absl::Duration dur; \
1823 EXPECT_TRUE(absl::ParseDuration(s, &dur)); \
1824 EXPECT_EQ(d, dur); \
1853 #undef TEST_PARSE_ROUNDTRIP