xref: /aosp_15_r20/external/abseil-cpp/absl/time/duration_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #if defined(_MSC_VER)
16*9356374aSAndroid Build Coastguard Worker #include <winsock2.h>  // for timeval
17*9356374aSAndroid Build Coastguard Worker #endif
18*9356374aSAndroid Build Coastguard Worker 
19*9356374aSAndroid Build Coastguard Worker #include <array>
20*9356374aSAndroid Build Coastguard Worker #include <cfloat>
21*9356374aSAndroid Build Coastguard Worker #include <chrono>  // NOLINT(build/c++11)
22*9356374aSAndroid Build Coastguard Worker 
23*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
24*9356374aSAndroid Build Coastguard Worker #include <compare>
25*9356374aSAndroid Build Coastguard Worker #endif  // __cpp_impl_three_way_comparison
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker #include <cmath>
28*9356374aSAndroid Build Coastguard Worker #include <cstdint>
29*9356374aSAndroid Build Coastguard Worker #include <ctime>
30*9356374aSAndroid Build Coastguard Worker #include <iomanip>
31*9356374aSAndroid Build Coastguard Worker #include <limits>
32*9356374aSAndroid Build Coastguard Worker #include <random>
33*9356374aSAndroid Build Coastguard Worker #include <string>
34*9356374aSAndroid Build Coastguard Worker 
35*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
36*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_format.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/time/time.h"
39*9356374aSAndroid Build Coastguard Worker 
40*9356374aSAndroid Build Coastguard Worker namespace {
41*9356374aSAndroid Build Coastguard Worker 
42*9356374aSAndroid Build Coastguard Worker constexpr int64_t kint64max = std::numeric_limits<int64_t>::max();
43*9356374aSAndroid Build Coastguard Worker constexpr int64_t kint64min = std::numeric_limits<int64_t>::min();
44*9356374aSAndroid Build Coastguard Worker 
45*9356374aSAndroid Build Coastguard Worker // Approximates the given number of years. This is only used to make some test
46*9356374aSAndroid Build Coastguard Worker // code more readable.
ApproxYears(int64_t n)47*9356374aSAndroid Build Coastguard Worker absl::Duration ApproxYears(int64_t n) { return absl::Hours(n) * 365 * 24; }
48*9356374aSAndroid Build Coastguard Worker 
49*9356374aSAndroid Build Coastguard Worker // A gMock matcher to match timespec values. Use this matcher like:
50*9356374aSAndroid Build Coastguard Worker // timespec ts1, ts2;
51*9356374aSAndroid Build Coastguard Worker // EXPECT_THAT(ts1, TimespecMatcher(ts2));
52*9356374aSAndroid Build Coastguard Worker MATCHER_P(TimespecMatcher, ts, "") {
53*9356374aSAndroid Build Coastguard Worker   if (ts.tv_sec == arg.tv_sec && ts.tv_nsec == arg.tv_nsec)
54*9356374aSAndroid Build Coastguard Worker     return true;
55*9356374aSAndroid Build Coastguard Worker   *result_listener << "expected: {" << ts.tv_sec << ", " << ts.tv_nsec << "} ";
56*9356374aSAndroid Build Coastguard Worker   *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_nsec << "}";
57*9356374aSAndroid Build Coastguard Worker   return false;
58*9356374aSAndroid Build Coastguard Worker }
59*9356374aSAndroid Build Coastguard Worker 
60*9356374aSAndroid Build Coastguard Worker // A gMock matcher to match timeval values. Use this matcher like:
61*9356374aSAndroid Build Coastguard Worker // timeval tv1, tv2;
62*9356374aSAndroid Build Coastguard Worker // EXPECT_THAT(tv1, TimevalMatcher(tv2));
63*9356374aSAndroid Build Coastguard Worker MATCHER_P(TimevalMatcher, tv, "") {
64*9356374aSAndroid Build Coastguard Worker   if (tv.tv_sec == arg.tv_sec && tv.tv_usec == arg.tv_usec)
65*9356374aSAndroid Build Coastguard Worker     return true;
66*9356374aSAndroid Build Coastguard Worker   *result_listener << "expected: {" << tv.tv_sec << ", " << tv.tv_usec << "} ";
67*9356374aSAndroid Build Coastguard Worker   *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_usec << "}";
68*9356374aSAndroid Build Coastguard Worker   return false;
69*9356374aSAndroid Build Coastguard Worker }
70*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ConstExpr)71*9356374aSAndroid Build Coastguard Worker TEST(Duration, ConstExpr) {
72*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration d0 = absl::ZeroDuration();
73*9356374aSAndroid Build Coastguard Worker   static_assert(d0 == absl::ZeroDuration(), "ZeroDuration()");
74*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration d1 = absl::Seconds(1);
75*9356374aSAndroid Build Coastguard Worker   static_assert(d1 == absl::Seconds(1), "Seconds(1)");
76*9356374aSAndroid Build Coastguard Worker   static_assert(d1 != absl::ZeroDuration(), "Seconds(1)");
77*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration d2 = absl::InfiniteDuration();
78*9356374aSAndroid Build Coastguard Worker   static_assert(d2 == absl::InfiniteDuration(), "InfiniteDuration()");
79*9356374aSAndroid Build Coastguard Worker   static_assert(d2 != absl::ZeroDuration(), "InfiniteDuration()");
80*9356374aSAndroid Build Coastguard Worker }
81*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ValueSemantics)82*9356374aSAndroid Build Coastguard Worker TEST(Duration, ValueSemantics) {
83*9356374aSAndroid Build Coastguard Worker   // If this compiles, the test passes.
84*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration a;      // Default construction
85*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration b = a;  // Copy construction
86*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration c(b);   // Copy construction (again)
87*9356374aSAndroid Build Coastguard Worker 
88*9356374aSAndroid Build Coastguard Worker   absl::Duration d;
89*9356374aSAndroid Build Coastguard Worker   d = c;  // Assignment
90*9356374aSAndroid Build Coastguard Worker }
91*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Factories)92*9356374aSAndroid Build Coastguard Worker TEST(Duration, Factories) {
93*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration zero = absl::ZeroDuration();
94*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration nano = absl::Nanoseconds(1);
95*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration micro = absl::Microseconds(1);
96*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration milli = absl::Milliseconds(1);
97*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration sec = absl::Seconds(1);
98*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration min = absl::Minutes(1);
99*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration hour = absl::Hours(1);
100*9356374aSAndroid Build Coastguard Worker 
101*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(zero, absl::Duration());
102*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(zero, absl::Seconds(0));
103*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nano, absl::Nanoseconds(1));
104*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(micro, absl::Nanoseconds(1000));
105*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(milli, absl::Microseconds(1000));
106*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(sec, absl::Milliseconds(1000));
107*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min, absl::Seconds(60));
108*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hour, absl::Minutes(60));
109*9356374aSAndroid Build Coastguard Worker 
110*9356374aSAndroid Build Coastguard Worker   // Tests factory limits
111*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
112*9356374aSAndroid Build Coastguard Worker 
113*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, absl::Seconds(kint64max));
114*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, absl::Seconds(kint64min));
115*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, absl::Seconds(-kint64max));
116*9356374aSAndroid Build Coastguard Worker 
117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, absl::Minutes(kint64max));
118*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, absl::Minutes(kint64min));
119*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, absl::Minutes(-kint64max));
120*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, absl::Minutes(kint64max / 60));
121*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, absl::Minutes(kint64min / 60));
122*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, absl::Minutes(-kint64max / 60));
123*9356374aSAndroid Build Coastguard Worker 
124*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, absl::Hours(kint64max));
125*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, absl::Hours(kint64min));
126*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, absl::Hours(-kint64max));
127*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, absl::Hours(kint64max / 3600));
128*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, absl::Hours(kint64min / 3600));
129*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, absl::Hours(-kint64max / 3600));
130*9356374aSAndroid Build Coastguard Worker }
131*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ToConversion)132*9356374aSAndroid Build Coastguard Worker TEST(Duration, ToConversion) {
133*9356374aSAndroid Build Coastguard Worker #define TEST_DURATION_CONVERSION(UNIT)                                  \
134*9356374aSAndroid Build Coastguard Worker   do {                                                                  \
135*9356374aSAndroid Build Coastguard Worker     const absl::Duration d = absl::UNIT(1.5);                           \
136*9356374aSAndroid Build Coastguard Worker     constexpr absl::Duration z = absl::ZeroDuration();                  \
137*9356374aSAndroid Build Coastguard Worker     constexpr absl::Duration inf = absl::InfiniteDuration();            \
138*9356374aSAndroid Build Coastguard Worker     constexpr double dbl_inf = std::numeric_limits<double>::infinity(); \
139*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(kint64min, absl::ToInt64##UNIT(-inf));                    \
140*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-1, absl::ToInt64##UNIT(-d));                             \
141*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, absl::ToInt64##UNIT(z));                               \
142*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(1, absl::ToInt64##UNIT(d));                               \
143*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(kint64max, absl::ToInt64##UNIT(inf));                     \
144*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-dbl_inf, absl::ToDouble##UNIT(-inf));                    \
145*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-1.5, absl::ToDouble##UNIT(-d));                          \
146*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(0, absl::ToDouble##UNIT(z));                              \
147*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(1.5, absl::ToDouble##UNIT(d));                            \
148*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(dbl_inf, absl::ToDouble##UNIT(inf));                      \
149*9356374aSAndroid Build Coastguard Worker   } while (0)
150*9356374aSAndroid Build Coastguard Worker 
151*9356374aSAndroid Build Coastguard Worker   TEST_DURATION_CONVERSION(Nanoseconds);
152*9356374aSAndroid Build Coastguard Worker   TEST_DURATION_CONVERSION(Microseconds);
153*9356374aSAndroid Build Coastguard Worker   TEST_DURATION_CONVERSION(Milliseconds);
154*9356374aSAndroid Build Coastguard Worker   TEST_DURATION_CONVERSION(Seconds);
155*9356374aSAndroid Build Coastguard Worker   TEST_DURATION_CONVERSION(Minutes);
156*9356374aSAndroid Build Coastguard Worker   TEST_DURATION_CONVERSION(Hours);
157*9356374aSAndroid Build Coastguard Worker 
158*9356374aSAndroid Build Coastguard Worker #undef TEST_DURATION_CONVERSION
159*9356374aSAndroid Build Coastguard Worker }
160*9356374aSAndroid Build Coastguard Worker 
161*9356374aSAndroid Build Coastguard Worker template <int64_t N>
TestToConversion()162*9356374aSAndroid Build Coastguard Worker void TestToConversion() {
163*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration nano = absl::Nanoseconds(N);
164*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N, absl::ToInt64Nanoseconds(nano));
165*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Microseconds(nano));
166*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Milliseconds(nano));
167*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Seconds(nano));
168*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Minutes(nano));
169*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Hours(nano));
170*9356374aSAndroid Build Coastguard Worker   const absl::Duration micro = absl::Microseconds(N);
171*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 1000, absl::ToInt64Nanoseconds(micro));
172*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N, absl::ToInt64Microseconds(micro));
173*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Milliseconds(micro));
174*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Seconds(micro));
175*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Minutes(micro));
176*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Hours(micro));
177*9356374aSAndroid Build Coastguard Worker   const absl::Duration milli = absl::Milliseconds(N);
178*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 1000 * 1000, absl::ToInt64Nanoseconds(milli));
179*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 1000, absl::ToInt64Microseconds(milli));
180*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N, absl::ToInt64Milliseconds(milli));
181*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Seconds(milli));
182*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Minutes(milli));
183*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Hours(milli));
184*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec = absl::Seconds(N);
185*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 1000 * 1000 * 1000, absl::ToInt64Nanoseconds(sec));
186*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 1000 * 1000, absl::ToInt64Microseconds(sec));
187*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 1000, absl::ToInt64Milliseconds(sec));
188*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N, absl::ToInt64Seconds(sec));
189*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Minutes(sec));
190*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Hours(sec));
191*9356374aSAndroid Build Coastguard Worker   const absl::Duration min = absl::Minutes(N);
192*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 1000 * 1000 * 1000, absl::ToInt64Nanoseconds(min));
193*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 1000 * 1000, absl::ToInt64Microseconds(min));
194*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 1000, absl::ToInt64Milliseconds(min));
195*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60, absl::ToInt64Seconds(min));
196*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N, absl::ToInt64Minutes(min));
197*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ToInt64Hours(min));
198*9356374aSAndroid Build Coastguard Worker   const absl::Duration hour = absl::Hours(N);
199*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 60 * 1000 * 1000 * 1000, absl::ToInt64Nanoseconds(hour));
200*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 60 * 1000 * 1000, absl::ToInt64Microseconds(hour));
201*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 60 * 1000, absl::ToInt64Milliseconds(hour));
202*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60 * 60, absl::ToInt64Seconds(hour));
203*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N * 60, absl::ToInt64Minutes(hour));
204*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(N, absl::ToInt64Hours(hour));
205*9356374aSAndroid Build Coastguard Worker }
206*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ToConversionDeprecated)207*9356374aSAndroid Build Coastguard Worker TEST(Duration, ToConversionDeprecated) {
208*9356374aSAndroid Build Coastguard Worker   TestToConversion<43>();
209*9356374aSAndroid Build Coastguard Worker   TestToConversion<1>();
210*9356374aSAndroid Build Coastguard Worker   TestToConversion<0>();
211*9356374aSAndroid Build Coastguard Worker   TestToConversion<-1>();
212*9356374aSAndroid Build Coastguard Worker   TestToConversion<-43>();
213*9356374aSAndroid Build Coastguard Worker }
214*9356374aSAndroid Build Coastguard Worker 
215*9356374aSAndroid Build Coastguard Worker template <int64_t N>
TestFromChronoBasicEquality()216*9356374aSAndroid Build Coastguard Worker void TestFromChronoBasicEquality() {
217*9356374aSAndroid Build Coastguard Worker   using std::chrono::nanoseconds;
218*9356374aSAndroid Build Coastguard Worker   using std::chrono::microseconds;
219*9356374aSAndroid Build Coastguard Worker   using std::chrono::milliseconds;
220*9356374aSAndroid Build Coastguard Worker   using std::chrono::seconds;
221*9356374aSAndroid Build Coastguard Worker   using std::chrono::minutes;
222*9356374aSAndroid Build Coastguard Worker   using std::chrono::hours;
223*9356374aSAndroid Build Coastguard Worker 
224*9356374aSAndroid Build Coastguard Worker   static_assert(absl::Nanoseconds(N) == absl::FromChrono(nanoseconds(N)), "");
225*9356374aSAndroid Build Coastguard Worker   static_assert(absl::Microseconds(N) == absl::FromChrono(microseconds(N)), "");
226*9356374aSAndroid Build Coastguard Worker   static_assert(absl::Milliseconds(N) == absl::FromChrono(milliseconds(N)), "");
227*9356374aSAndroid Build Coastguard Worker   static_assert(absl::Seconds(N) == absl::FromChrono(seconds(N)), "");
228*9356374aSAndroid Build Coastguard Worker   static_assert(absl::Minutes(N) == absl::FromChrono(minutes(N)), "");
229*9356374aSAndroid Build Coastguard Worker   static_assert(absl::Hours(N) == absl::FromChrono(hours(N)), "");
230*9356374aSAndroid Build Coastguard Worker }
231*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,FromChrono)232*9356374aSAndroid Build Coastguard Worker TEST(Duration, FromChrono) {
233*9356374aSAndroid Build Coastguard Worker   TestFromChronoBasicEquality<-123>();
234*9356374aSAndroid Build Coastguard Worker   TestFromChronoBasicEquality<-1>();
235*9356374aSAndroid Build Coastguard Worker   TestFromChronoBasicEquality<0>();
236*9356374aSAndroid Build Coastguard Worker   TestFromChronoBasicEquality<1>();
237*9356374aSAndroid Build Coastguard Worker   TestFromChronoBasicEquality<123>();
238*9356374aSAndroid Build Coastguard Worker 
239*9356374aSAndroid Build Coastguard Worker   // Minutes (might, depending on the platform) saturate at +inf.
240*9356374aSAndroid Build Coastguard Worker   const auto chrono_minutes_max = std::chrono::minutes::max();
241*9356374aSAndroid Build Coastguard Worker   const auto minutes_max = absl::FromChrono(chrono_minutes_max);
242*9356374aSAndroid Build Coastguard Worker   const int64_t minutes_max_count = chrono_minutes_max.count();
243*9356374aSAndroid Build Coastguard Worker   if (minutes_max_count > kint64max / 60) {
244*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::InfiniteDuration(), minutes_max);
245*9356374aSAndroid Build Coastguard Worker   } else {
246*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Minutes(minutes_max_count), minutes_max);
247*9356374aSAndroid Build Coastguard Worker   }
248*9356374aSAndroid Build Coastguard Worker 
249*9356374aSAndroid Build Coastguard Worker   // Minutes (might, depending on the platform) saturate at -inf.
250*9356374aSAndroid Build Coastguard Worker   const auto chrono_minutes_min = std::chrono::minutes::min();
251*9356374aSAndroid Build Coastguard Worker   const auto minutes_min = absl::FromChrono(chrono_minutes_min);
252*9356374aSAndroid Build Coastguard Worker   const int64_t minutes_min_count = chrono_minutes_min.count();
253*9356374aSAndroid Build Coastguard Worker   if (minutes_min_count < kint64min / 60) {
254*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-absl::InfiniteDuration(), minutes_min);
255*9356374aSAndroid Build Coastguard Worker   } else {
256*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Minutes(minutes_min_count), minutes_min);
257*9356374aSAndroid Build Coastguard Worker   }
258*9356374aSAndroid Build Coastguard Worker 
259*9356374aSAndroid Build Coastguard Worker   // Hours (might, depending on the platform) saturate at +inf.
260*9356374aSAndroid Build Coastguard Worker   const auto chrono_hours_max = std::chrono::hours::max();
261*9356374aSAndroid Build Coastguard Worker   const auto hours_max = absl::FromChrono(chrono_hours_max);
262*9356374aSAndroid Build Coastguard Worker   const int64_t hours_max_count = chrono_hours_max.count();
263*9356374aSAndroid Build Coastguard Worker   if (hours_max_count > kint64max / 3600) {
264*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::InfiniteDuration(), hours_max);
265*9356374aSAndroid Build Coastguard Worker   } else {
266*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Hours(hours_max_count), hours_max);
267*9356374aSAndroid Build Coastguard Worker   }
268*9356374aSAndroid Build Coastguard Worker 
269*9356374aSAndroid Build Coastguard Worker   // Hours (might, depending on the platform) saturate at -inf.
270*9356374aSAndroid Build Coastguard Worker   const auto chrono_hours_min = std::chrono::hours::min();
271*9356374aSAndroid Build Coastguard Worker   const auto hours_min = absl::FromChrono(chrono_hours_min);
272*9356374aSAndroid Build Coastguard Worker   const int64_t hours_min_count = chrono_hours_min.count();
273*9356374aSAndroid Build Coastguard Worker   if (hours_min_count < kint64min / 3600) {
274*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-absl::InfiniteDuration(), hours_min);
275*9356374aSAndroid Build Coastguard Worker   } else {
276*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Hours(hours_min_count), hours_min);
277*9356374aSAndroid Build Coastguard Worker   }
278*9356374aSAndroid Build Coastguard Worker }
279*9356374aSAndroid Build Coastguard Worker 
280*9356374aSAndroid Build Coastguard Worker template <int64_t N>
TestToChrono()281*9356374aSAndroid Build Coastguard Worker void TestToChrono() {
282*9356374aSAndroid Build Coastguard Worker   using std::chrono::nanoseconds;
283*9356374aSAndroid Build Coastguard Worker   using std::chrono::microseconds;
284*9356374aSAndroid Build Coastguard Worker   using std::chrono::milliseconds;
285*9356374aSAndroid Build Coastguard Worker   using std::chrono::seconds;
286*9356374aSAndroid Build Coastguard Worker   using std::chrono::minutes;
287*9356374aSAndroid Build Coastguard Worker   using std::chrono::hours;
288*9356374aSAndroid Build Coastguard Worker 
289*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nanoseconds(N), absl::ToChronoNanoseconds(absl::Nanoseconds(N)));
290*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(microseconds(N), absl::ToChronoMicroseconds(absl::Microseconds(N)));
291*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(milliseconds(N), absl::ToChronoMilliseconds(absl::Milliseconds(N)));
292*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(seconds(N), absl::ToChronoSeconds(absl::Seconds(N)));
293*9356374aSAndroid Build Coastguard Worker 
294*9356374aSAndroid Build Coastguard Worker   constexpr auto absl_minutes = absl::Minutes(N);
295*9356374aSAndroid Build Coastguard Worker   auto chrono_minutes = minutes(N);
296*9356374aSAndroid Build Coastguard Worker   if (absl_minutes == -absl::InfiniteDuration()) {
297*9356374aSAndroid Build Coastguard Worker     chrono_minutes = minutes::min();
298*9356374aSAndroid Build Coastguard Worker   } else if (absl_minutes == absl::InfiniteDuration()) {
299*9356374aSAndroid Build Coastguard Worker     chrono_minutes = minutes::max();
300*9356374aSAndroid Build Coastguard Worker   }
301*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(chrono_minutes, absl::ToChronoMinutes(absl_minutes));
302*9356374aSAndroid Build Coastguard Worker 
303*9356374aSAndroid Build Coastguard Worker   constexpr auto absl_hours = absl::Hours(N);
304*9356374aSAndroid Build Coastguard Worker   auto chrono_hours = hours(N);
305*9356374aSAndroid Build Coastguard Worker   if (absl_hours == -absl::InfiniteDuration()) {
306*9356374aSAndroid Build Coastguard Worker     chrono_hours = hours::min();
307*9356374aSAndroid Build Coastguard Worker   } else if (absl_hours == absl::InfiniteDuration()) {
308*9356374aSAndroid Build Coastguard Worker     chrono_hours = hours::max();
309*9356374aSAndroid Build Coastguard Worker   }
310*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(chrono_hours, absl::ToChronoHours(absl_hours));
311*9356374aSAndroid Build Coastguard Worker }
312*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ToChrono)313*9356374aSAndroid Build Coastguard Worker TEST(Duration, ToChrono) {
314*9356374aSAndroid Build Coastguard Worker   using std::chrono::nanoseconds;
315*9356374aSAndroid Build Coastguard Worker   using std::chrono::microseconds;
316*9356374aSAndroid Build Coastguard Worker   using std::chrono::milliseconds;
317*9356374aSAndroid Build Coastguard Worker   using std::chrono::seconds;
318*9356374aSAndroid Build Coastguard Worker   using std::chrono::minutes;
319*9356374aSAndroid Build Coastguard Worker   using std::chrono::hours;
320*9356374aSAndroid Build Coastguard Worker 
321*9356374aSAndroid Build Coastguard Worker   TestToChrono<kint64min>();
322*9356374aSAndroid Build Coastguard Worker   TestToChrono<-1>();
323*9356374aSAndroid Build Coastguard Worker   TestToChrono<0>();
324*9356374aSAndroid Build Coastguard Worker   TestToChrono<1>();
325*9356374aSAndroid Build Coastguard Worker   TestToChrono<kint64max>();
326*9356374aSAndroid Build Coastguard Worker 
327*9356374aSAndroid Build Coastguard Worker   // Verify truncation toward zero.
328*9356374aSAndroid Build Coastguard Worker   const auto tick = absl::Nanoseconds(1) / 4;
329*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nanoseconds(0), absl::ToChronoNanoseconds(tick));
330*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nanoseconds(0), absl::ToChronoNanoseconds(-tick));
331*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(microseconds(0), absl::ToChronoMicroseconds(tick));
332*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(microseconds(0), absl::ToChronoMicroseconds(-tick));
333*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(milliseconds(0), absl::ToChronoMilliseconds(tick));
334*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(milliseconds(0), absl::ToChronoMilliseconds(-tick));
335*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(seconds(0), absl::ToChronoSeconds(tick));
336*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(seconds(0), absl::ToChronoSeconds(-tick));
337*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minutes(0), absl::ToChronoMinutes(tick));
338*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minutes(0), absl::ToChronoMinutes(-tick));
339*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hours(0), absl::ToChronoHours(tick));
340*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hours(0), absl::ToChronoHours(-tick));
341*9356374aSAndroid Build Coastguard Worker 
342*9356374aSAndroid Build Coastguard Worker   // Verifies +/- infinity saturation at max/min.
343*9356374aSAndroid Build Coastguard Worker   constexpr auto inf = absl::InfiniteDuration();
344*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nanoseconds::min(), absl::ToChronoNanoseconds(-inf));
345*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nanoseconds::max(), absl::ToChronoNanoseconds(inf));
346*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(microseconds::min(), absl::ToChronoMicroseconds(-inf));
347*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(microseconds::max(), absl::ToChronoMicroseconds(inf));
348*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(milliseconds::min(), absl::ToChronoMilliseconds(-inf));
349*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(milliseconds::max(), absl::ToChronoMilliseconds(inf));
350*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(seconds::min(), absl::ToChronoSeconds(-inf));
351*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(seconds::max(), absl::ToChronoSeconds(inf));
352*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minutes::min(), absl::ToChronoMinutes(-inf));
353*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(minutes::max(), absl::ToChronoMinutes(inf));
354*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hours::min(), absl::ToChronoHours(-inf));
355*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(hours::max(), absl::ToChronoHours(inf));
356*9356374aSAndroid Build Coastguard Worker }
357*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,FactoryOverloads)358*9356374aSAndroid Build Coastguard Worker TEST(Duration, FactoryOverloads) {
359*9356374aSAndroid Build Coastguard Worker   enum E { kOne = 1 };
360*9356374aSAndroid Build Coastguard Worker #define TEST_FACTORY_OVERLOADS(NAME)                                          \
361*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(kOne) / NAME(kOne));                                      \
362*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<int8_t>(1)) / NAME(1));                       \
363*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<int16_t>(1)) / NAME(1));                      \
364*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<int32_t>(1)) / NAME(1));                      \
365*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<int64_t>(1)) / NAME(1));                      \
366*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<uint8_t>(1)) / NAME(1));                      \
367*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<uint16_t>(1)) / NAME(1));                     \
368*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<uint32_t>(1)) / NAME(1));                     \
369*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, NAME(static_cast<uint64_t>(1)) / NAME(1));                     \
370*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(NAME(1) / 2, NAME(static_cast<float>(0.5)));                      \
371*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(NAME(1) / 2, NAME(static_cast<double>(0.5)));                     \
372*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<float>(1.5)), NAME(1))); \
373*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<double>(1.5)), NAME(1)));
374*9356374aSAndroid Build Coastguard Worker 
375*9356374aSAndroid Build Coastguard Worker   TEST_FACTORY_OVERLOADS(absl::Nanoseconds);
376*9356374aSAndroid Build Coastguard Worker   TEST_FACTORY_OVERLOADS(absl::Microseconds);
377*9356374aSAndroid Build Coastguard Worker   TEST_FACTORY_OVERLOADS(absl::Milliseconds);
378*9356374aSAndroid Build Coastguard Worker   TEST_FACTORY_OVERLOADS(absl::Seconds);
379*9356374aSAndroid Build Coastguard Worker   TEST_FACTORY_OVERLOADS(absl::Minutes);
380*9356374aSAndroid Build Coastguard Worker   TEST_FACTORY_OVERLOADS(absl::Hours);
381*9356374aSAndroid Build Coastguard Worker 
382*9356374aSAndroid Build Coastguard Worker #undef TEST_FACTORY_OVERLOADS
383*9356374aSAndroid Build Coastguard Worker 
384*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Milliseconds(1500), absl::Seconds(1.5));
385*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(absl::Nanoseconds(1), absl::Nanoseconds(1.5));
386*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(absl::Nanoseconds(2), absl::Nanoseconds(1.5));
387*9356374aSAndroid Build Coastguard Worker 
388*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
389*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), absl::Nanoseconds(dbl_inf));
390*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), absl::Microseconds(dbl_inf));
391*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), absl::Milliseconds(dbl_inf));
392*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), absl::Seconds(dbl_inf));
393*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), absl::Minutes(dbl_inf));
394*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), absl::Hours(dbl_inf));
395*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), absl::Nanoseconds(-dbl_inf));
396*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), absl::Microseconds(-dbl_inf));
397*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), absl::Milliseconds(-dbl_inf));
398*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), absl::Seconds(-dbl_inf));
399*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), absl::Minutes(-dbl_inf));
400*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), absl::Hours(-dbl_inf));
401*9356374aSAndroid Build Coastguard Worker }
402*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityExamples)403*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityExamples) {
404*9356374aSAndroid Build Coastguard Worker   // These examples are used in the documentation in time.h. They are
405*9356374aSAndroid Build Coastguard Worker   // written so that they can be copy-n-pasted easily.
406*9356374aSAndroid Build Coastguard Worker 
407*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration inf = absl::InfiniteDuration();
408*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration d = absl::Seconds(1);  // Any finite duration
409*9356374aSAndroid Build Coastguard Worker 
410*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(inf == inf + inf);
411*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(inf == inf + d);
412*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(inf == inf - inf);
413*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(-inf == d - inf);
414*9356374aSAndroid Build Coastguard Worker 
415*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(inf == d * 1e100);
416*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(0 == d / inf);  // NOLINT(readability/check)
417*9356374aSAndroid Build Coastguard Worker 
418*9356374aSAndroid Build Coastguard Worker   // Division by zero returns infinity, or kint64min/MAX where necessary.
419*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(inf == d / 0);
420*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(kint64max == d / absl::ZeroDuration());
421*9356374aSAndroid Build Coastguard Worker }
422*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityComparison)423*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityComparison) {
424*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
425*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
426*9356374aSAndroid Build Coastguard Worker 
427*9356374aSAndroid Build Coastguard Worker   // Equality
428*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf);
429*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf);
430*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(inf, -inf);
431*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(any_dur, inf);
432*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(any_dur, -inf);
433*9356374aSAndroid Build Coastguard Worker 
434*9356374aSAndroid Build Coastguard Worker   // Relational
435*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, any_dur);
436*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, any_dur);
437*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, inf);
438*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, -inf);
439*9356374aSAndroid Build Coastguard Worker 
440*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
441*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf <=> inf, std::strong_ordering::equal);
442*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf <=> -inf, std::strong_ordering::equal);
443*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf <=> inf, std::strong_ordering::less);
444*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf <=> -inf, std::strong_ordering::greater);
445*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(any_dur <=> inf, std::strong_ordering::less);
446*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(any_dur <=> -inf, std::strong_ordering::greater);
447*9356374aSAndroid Build Coastguard Worker #endif  // __cpp_impl_three_way_comparison
448*9356374aSAndroid Build Coastguard Worker }
449*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityAddition)450*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityAddition) {
451*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_max = absl::Seconds(kint64max);
452*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_min = absl::Seconds(kint64min);
453*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
454*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
455*9356374aSAndroid Build Coastguard Worker 
456*9356374aSAndroid Build Coastguard Worker   // Addition
457*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf + inf);
458*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf + -inf);
459*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf + inf);
460*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf + -inf);
461*9356374aSAndroid Build Coastguard Worker 
462*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf + any_dur);
463*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, any_dur + inf);
464*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf + any_dur);
465*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, any_dur + -inf);
466*9356374aSAndroid Build Coastguard Worker 
467*9356374aSAndroid Build Coastguard Worker   // Interesting case
468*9356374aSAndroid Build Coastguard Worker   absl::Duration almost_inf = sec_max + absl::Nanoseconds(999999999);
469*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, almost_inf);
470*9356374aSAndroid Build Coastguard Worker   almost_inf += -absl::Nanoseconds(999999999);
471*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(inf, almost_inf);
472*9356374aSAndroid Build Coastguard Worker 
473*9356374aSAndroid Build Coastguard Worker   // Addition overflow/underflow
474*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max + absl::Seconds(1));
475*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max + sec_max);
476*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_min + -absl::Seconds(1));
477*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_min + -sec_max);
478*9356374aSAndroid Build Coastguard Worker 
479*9356374aSAndroid Build Coastguard Worker   // For reference: IEEE 754 behavior
480*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
481*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(dbl_inf + dbl_inf));
482*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(dbl_inf + -dbl_inf));  // We return inf
483*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(-dbl_inf + dbl_inf));  // We return inf
484*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(-dbl_inf + -dbl_inf));
485*9356374aSAndroid Build Coastguard Worker }
486*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinitySubtraction)487*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinitySubtraction) {
488*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_max = absl::Seconds(kint64max);
489*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_min = absl::Seconds(kint64min);
490*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
491*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
492*9356374aSAndroid Build Coastguard Worker 
493*9356374aSAndroid Build Coastguard Worker   // Subtraction
494*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf - inf);
495*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf - -inf);
496*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf - inf);
497*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf - -inf);
498*9356374aSAndroid Build Coastguard Worker 
499*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf - any_dur);
500*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, any_dur - inf);
501*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf - any_dur);
502*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, any_dur - -inf);
503*9356374aSAndroid Build Coastguard Worker 
504*9356374aSAndroid Build Coastguard Worker   // Subtraction overflow/underflow
505*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max - -absl::Seconds(1));
506*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max - -sec_max);
507*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_min - absl::Seconds(1));
508*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_min - sec_max);
509*9356374aSAndroid Build Coastguard Worker 
510*9356374aSAndroid Build Coastguard Worker   // Interesting case
511*9356374aSAndroid Build Coastguard Worker   absl::Duration almost_neg_inf = sec_min;
512*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, almost_neg_inf);
513*9356374aSAndroid Build Coastguard Worker 
514*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
515*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf <=> almost_neg_inf, std::strong_ordering::less);
516*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(almost_neg_inf <=> -inf, std::strong_ordering::greater);
517*9356374aSAndroid Build Coastguard Worker #endif  // __cpp_impl_three_way_comparison
518*9356374aSAndroid Build Coastguard Worker 
519*9356374aSAndroid Build Coastguard Worker   almost_neg_inf -= -absl::Nanoseconds(1);
520*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(-inf, almost_neg_inf);
521*9356374aSAndroid Build Coastguard Worker 
522*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
523*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf <=> almost_neg_inf, std::strong_ordering::less);
524*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(almost_neg_inf <=> -inf, std::strong_ordering::greater);
525*9356374aSAndroid Build Coastguard Worker #endif  // __cpp_impl_three_way_comparison
526*9356374aSAndroid Build Coastguard Worker 
527*9356374aSAndroid Build Coastguard Worker   // For reference: IEEE 754 behavior
528*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
529*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(dbl_inf - dbl_inf));  // We return inf
530*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(dbl_inf - -dbl_inf));
531*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(-dbl_inf - dbl_inf));
532*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(-dbl_inf - -dbl_inf));  // We return inf
533*9356374aSAndroid Build Coastguard Worker }
534*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityMultiplication)535*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityMultiplication) {
536*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_max = absl::Seconds(kint64max);
537*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_min = absl::Seconds(kint64min);
538*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
539*9356374aSAndroid Build Coastguard Worker 
540*9356374aSAndroid Build Coastguard Worker #define TEST_INF_MUL_WITH_TYPE(T)                                     \
541*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf * static_cast<T>(2));                            \
542*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, inf * static_cast<T>(-2));                          \
543*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf * static_cast<T>(2));                          \
544*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -inf * static_cast<T>(-2));                          \
545*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf * static_cast<T>(0));                            \
546*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf * static_cast<T>(0));                          \
547*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max * static_cast<T>(2));                        \
548*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_min * static_cast<T>(-2));                       \
549*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, (sec_max / static_cast<T>(2)) * static_cast<T>(3));  \
550*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_max * static_cast<T>(-2));                      \
551*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_min * static_cast<T>(2));                       \
552*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, (sec_min / static_cast<T>(2)) * static_cast<T>(3));
553*9356374aSAndroid Build Coastguard Worker 
554*9356374aSAndroid Build Coastguard Worker   TEST_INF_MUL_WITH_TYPE(int64_t);  // NOLINT(readability/function)
555*9356374aSAndroid Build Coastguard Worker   TEST_INF_MUL_WITH_TYPE(double);   // NOLINT(readability/function)
556*9356374aSAndroid Build Coastguard Worker 
557*9356374aSAndroid Build Coastguard Worker #undef TEST_INF_MUL_WITH_TYPE
558*9356374aSAndroid Build Coastguard Worker 
559*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
560*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf * dbl_inf);
561*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf * dbl_inf);
562*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, inf * -dbl_inf);
563*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -inf * -dbl_inf);
564*9356374aSAndroid Build Coastguard Worker 
565*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
566*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, any_dur * dbl_inf);
567*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -any_dur * dbl_inf);
568*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, any_dur * -dbl_inf);
569*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -any_dur * -dbl_inf);
570*9356374aSAndroid Build Coastguard Worker 
571*9356374aSAndroid Build Coastguard Worker   // Fixed-point multiplication will produce a finite value, whereas floating
572*9356374aSAndroid Build Coastguard Worker   // point fuzziness will overflow to inf.
573*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(absl::InfiniteDuration(), absl::Seconds(1) * kint64max);
574*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, absl::Seconds(1) * static_cast<double>(kint64max));
575*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(-absl::InfiniteDuration(), absl::Seconds(1) * kint64min);
576*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, absl::Seconds(1) * static_cast<double>(kint64min));
577*9356374aSAndroid Build Coastguard Worker 
578*9356374aSAndroid Build Coastguard Worker   // Note that sec_max * or / by 1.0 overflows to inf due to the 53-bit
579*9356374aSAndroid Build Coastguard Worker   // limitations of double.
580*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(inf, sec_max);
581*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(inf, sec_max / 1);
582*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max / 1.0);
583*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(inf, sec_max * 1);
584*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max * 1.0);
585*9356374aSAndroid Build Coastguard Worker }
586*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityDivision)587*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityDivision) {
588*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_max = absl::Seconds(kint64max);
589*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_min = absl::Seconds(kint64min);
590*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
591*9356374aSAndroid Build Coastguard Worker 
592*9356374aSAndroid Build Coastguard Worker   // Division of Duration by a double
593*9356374aSAndroid Build Coastguard Worker #define TEST_INF_DIV_WITH_TYPE(T)            \
594*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf / static_cast<T>(2));   \
595*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, inf / static_cast<T>(-2)); \
596*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf / static_cast<T>(2)); \
597*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -inf / static_cast<T>(-2));
598*9356374aSAndroid Build Coastguard Worker 
599*9356374aSAndroid Build Coastguard Worker   TEST_INF_DIV_WITH_TYPE(int64_t);  // NOLINT(readability/function)
600*9356374aSAndroid Build Coastguard Worker   TEST_INF_DIV_WITH_TYPE(double);   // NOLINT(readability/function)
601*9356374aSAndroid Build Coastguard Worker 
602*9356374aSAndroid Build Coastguard Worker #undef TEST_INF_DIV_WITH_TYPE
603*9356374aSAndroid Build Coastguard Worker 
604*9356374aSAndroid Build Coastguard Worker   // Division of Duration by a double overflow/underflow
605*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_max / 0.5);
606*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, sec_min / -0.5);
607*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, ((sec_max / 0.5) + absl::Seconds(1)) / 0.5);
608*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_max / -0.5);
609*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, sec_min / 0.5);
610*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, ((sec_min / 0.5) - absl::Seconds(1)) / 0.5);
611*9356374aSAndroid Build Coastguard Worker 
612*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
613*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf / dbl_inf);
614*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, inf / -dbl_inf);
615*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf / dbl_inf);
616*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -inf / -dbl_inf);
617*9356374aSAndroid Build Coastguard Worker 
618*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
619*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), any_dur / dbl_inf);
620*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), any_dur / -dbl_inf);
621*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), -any_dur / dbl_inf);
622*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), -any_dur / -dbl_inf);
623*9356374aSAndroid Build Coastguard Worker }
624*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityModulus)625*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityModulus) {
626*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_max = absl::Seconds(kint64max);
627*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
628*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
629*9356374aSAndroid Build Coastguard Worker 
630*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf % inf);
631*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf % -inf);
632*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf % -inf);
633*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf % inf);
634*9356374aSAndroid Build Coastguard Worker 
635*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(any_dur, any_dur % inf);
636*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(any_dur, any_dur % -inf);
637*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-any_dur, -any_dur % inf);
638*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-any_dur, -any_dur % -inf);
639*9356374aSAndroid Build Coastguard Worker 
640*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf % -any_dur);
641*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, inf % any_dur);
642*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf % -any_dur);
643*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -inf % any_dur);
644*9356374aSAndroid Build Coastguard Worker 
645*9356374aSAndroid Build Coastguard Worker   // Remainder isn't affected by overflow.
646*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Seconds(1));
647*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Milliseconds(1));
648*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Microseconds(1));
649*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Nanoseconds(1));
650*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Nanoseconds(1) / 4);
651*9356374aSAndroid Build Coastguard Worker }
652*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityIDiv)653*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityIDiv) {
654*9356374aSAndroid Build Coastguard Worker   const absl::Duration sec_max = absl::Seconds(kint64max);
655*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
656*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
657*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
658*9356374aSAndroid Build Coastguard Worker 
659*9356374aSAndroid Build Coastguard Worker   // IDivDuration (int64_t return value + a remainer)
660*9356374aSAndroid Build Coastguard Worker   absl::Duration rem = absl::ZeroDuration();
661*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, absl::IDivDuration(inf, inf, &rem));
662*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, rem);
663*9356374aSAndroid Build Coastguard Worker 
664*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
665*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, absl::IDivDuration(-inf, -inf, &rem));
666*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, rem);
667*9356374aSAndroid Build Coastguard Worker 
668*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
669*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, absl::IDivDuration(inf, any_dur, &rem));
670*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, rem);
671*9356374aSAndroid Build Coastguard Worker 
672*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
673*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::IDivDuration(any_dur, inf, &rem));
674*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(any_dur, rem);
675*9356374aSAndroid Build Coastguard Worker 
676*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
677*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, absl::IDivDuration(-inf, -any_dur, &rem));
678*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, rem);
679*9356374aSAndroid Build Coastguard Worker 
680*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
681*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::IDivDuration(-any_dur, -inf, &rem));
682*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-any_dur, rem);
683*9356374aSAndroid Build Coastguard Worker 
684*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
685*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, absl::IDivDuration(-inf, inf, &rem));
686*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, rem);
687*9356374aSAndroid Build Coastguard Worker 
688*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
689*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, absl::IDivDuration(inf, -inf, &rem));
690*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, rem);
691*9356374aSAndroid Build Coastguard Worker 
692*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
693*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, absl::IDivDuration(-inf, any_dur, &rem));
694*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, rem);
695*9356374aSAndroid Build Coastguard Worker 
696*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
697*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::IDivDuration(-any_dur, inf, &rem));
698*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-any_dur, rem);
699*9356374aSAndroid Build Coastguard Worker 
700*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
701*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, absl::IDivDuration(inf, -any_dur, &rem));
702*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, rem);
703*9356374aSAndroid Build Coastguard Worker 
704*9356374aSAndroid Build Coastguard Worker   rem = absl::ZeroDuration();
705*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::IDivDuration(any_dur, -inf, &rem));
706*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(any_dur, rem);
707*9356374aSAndroid Build Coastguard Worker 
708*9356374aSAndroid Build Coastguard Worker   // IDivDuration overflow/underflow
709*9356374aSAndroid Build Coastguard Worker   rem = any_dur;
710*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max,
711*9356374aSAndroid Build Coastguard Worker             absl::IDivDuration(sec_max, absl::Nanoseconds(1) / 4, &rem));
712*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(sec_max - absl::Nanoseconds(kint64max) / 4, rem);
713*9356374aSAndroid Build Coastguard Worker 
714*9356374aSAndroid Build Coastguard Worker   rem = any_dur;
715*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max,
716*9356374aSAndroid Build Coastguard Worker             absl::IDivDuration(sec_max, absl::Milliseconds(1), &rem));
717*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(sec_max - absl::Milliseconds(kint64max), rem);
718*9356374aSAndroid Build Coastguard Worker 
719*9356374aSAndroid Build Coastguard Worker   rem = any_dur;
720*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max,
721*9356374aSAndroid Build Coastguard Worker             absl::IDivDuration(-sec_max, -absl::Milliseconds(1), &rem));
722*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-sec_max + absl::Milliseconds(kint64max), rem);
723*9356374aSAndroid Build Coastguard Worker 
724*9356374aSAndroid Build Coastguard Worker   rem = any_dur;
725*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min,
726*9356374aSAndroid Build Coastguard Worker             absl::IDivDuration(-sec_max, absl::Milliseconds(1), &rem));
727*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-sec_max - absl::Milliseconds(kint64min), rem);
728*9356374aSAndroid Build Coastguard Worker 
729*9356374aSAndroid Build Coastguard Worker   rem = any_dur;
730*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min,
731*9356374aSAndroid Build Coastguard Worker             absl::IDivDuration(sec_max, -absl::Milliseconds(1), &rem));
732*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(sec_max + absl::Milliseconds(kint64min), rem);
733*9356374aSAndroid Build Coastguard Worker 
734*9356374aSAndroid Build Coastguard Worker   //
735*9356374aSAndroid Build Coastguard Worker   // operator/(Duration, Duration) is a wrapper for IDivDuration().
736*9356374aSAndroid Build Coastguard Worker   //
737*9356374aSAndroid Build Coastguard Worker 
738*9356374aSAndroid Build Coastguard Worker   // IEEE 754 says inf / inf should be nan, but int64_t doesn't have
739*9356374aSAndroid Build Coastguard Worker   // nan so we'll return kint64max/kint64min instead.
740*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(dbl_inf / dbl_inf));
741*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, inf / inf);
742*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, -inf / -inf);
743*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, -inf / inf);
744*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, inf / -inf);
745*9356374aSAndroid Build Coastguard Worker 
746*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(dbl_inf / 2.0));
747*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, inf / any_dur);
748*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, -inf / -any_dur);
749*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, -inf / any_dur);
750*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, inf / -any_dur);
751*9356374aSAndroid Build Coastguard Worker 
752*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0.0, 2.0 / dbl_inf);
753*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, any_dur / inf);
754*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, any_dur / -inf);
755*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, -any_dur / inf);
756*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, -any_dur / -inf);
757*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::ZeroDuration() / inf);
758*9356374aSAndroid Build Coastguard Worker 
759*9356374aSAndroid Build Coastguard Worker   // Division of Duration by a Duration overflow/underflow
760*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, sec_max / absl::Milliseconds(1));
761*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, -sec_max / -absl::Milliseconds(1));
762*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, -sec_max / absl::Milliseconds(1));
763*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, sec_max / -absl::Milliseconds(1));
764*9356374aSAndroid Build Coastguard Worker }
765*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,InfinityFDiv)766*9356374aSAndroid Build Coastguard Worker TEST(Duration, InfinityFDiv) {
767*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
768*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
769*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
770*9356374aSAndroid Build Coastguard Worker 
771*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(dbl_inf, absl::FDivDuration(inf, inf));
772*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(dbl_inf, absl::FDivDuration(-inf, -inf));
773*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(dbl_inf, absl::FDivDuration(inf, any_dur));
774*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0.0, absl::FDivDuration(any_dur, inf));
775*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(dbl_inf, absl::FDivDuration(-inf, -any_dur));
776*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0.0, absl::FDivDuration(-any_dur, -inf));
777*9356374aSAndroid Build Coastguard Worker 
778*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-dbl_inf, absl::FDivDuration(-inf, inf));
779*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-dbl_inf, absl::FDivDuration(inf, -inf));
780*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-dbl_inf, absl::FDivDuration(-inf, any_dur));
781*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0.0, absl::FDivDuration(-any_dur, inf));
782*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-dbl_inf, absl::FDivDuration(inf, -any_dur));
783*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0.0, absl::FDivDuration(any_dur, -inf));
784*9356374aSAndroid Build Coastguard Worker }
785*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,DivisionByZero)786*9356374aSAndroid Build Coastguard Worker TEST(Duration, DivisionByZero) {
787*9356374aSAndroid Build Coastguard Worker   const absl::Duration zero = absl::ZeroDuration();
788*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
789*9356374aSAndroid Build Coastguard Worker   const absl::Duration any_dur = absl::Seconds(1);
790*9356374aSAndroid Build Coastguard Worker   const double dbl_inf = std::numeric_limits<double>::infinity();
791*9356374aSAndroid Build Coastguard Worker   const double dbl_denorm = std::numeric_limits<double>::denorm_min();
792*9356374aSAndroid Build Coastguard Worker 
793*9356374aSAndroid Build Coastguard Worker   // Operator/(Duration, double)
794*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, zero / 0.0);
795*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, zero / -0.0);
796*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, any_dur / 0.0);
797*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, any_dur / -0.0);
798*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -any_dur / 0.0);
799*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -any_dur / -0.0);
800*9356374aSAndroid Build Coastguard Worker 
801*9356374aSAndroid Build Coastguard Worker   // Tests dividing by a number very close to, but not quite zero.
802*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(zero, zero / dbl_denorm);
803*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(zero, zero / -dbl_denorm);
804*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, any_dur / dbl_denorm);
805*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, any_dur / -dbl_denorm);
806*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, -any_dur / dbl_denorm);
807*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, -any_dur / -dbl_denorm);
808*9356374aSAndroid Build Coastguard Worker 
809*9356374aSAndroid Build Coastguard Worker   // IDiv
810*9356374aSAndroid Build Coastguard Worker   absl::Duration rem = zero;
811*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, absl::IDivDuration(zero, zero, &rem));
812*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, rem);
813*9356374aSAndroid Build Coastguard Worker 
814*9356374aSAndroid Build Coastguard Worker   rem = zero;
815*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, absl::IDivDuration(any_dur, zero, &rem));
816*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(inf, rem);
817*9356374aSAndroid Build Coastguard Worker 
818*9356374aSAndroid Build Coastguard Worker   rem = zero;
819*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, absl::IDivDuration(-any_dur, zero, &rem));
820*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-inf, rem);
821*9356374aSAndroid Build Coastguard Worker 
822*9356374aSAndroid Build Coastguard Worker   // Operator/(Duration, Duration)
823*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, zero / zero);
824*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64max, any_dur / zero);
825*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(kint64min, -any_dur / zero);
826*9356374aSAndroid Build Coastguard Worker 
827*9356374aSAndroid Build Coastguard Worker   // FDiv
828*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(dbl_inf, absl::FDivDuration(zero, zero));
829*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(dbl_inf, absl::FDivDuration(any_dur, zero));
830*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-dbl_inf, absl::FDivDuration(-any_dur, zero));
831*9356374aSAndroid Build Coastguard Worker }
832*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,NaN)833*9356374aSAndroid Build Coastguard Worker TEST(Duration, NaN) {
834*9356374aSAndroid Build Coastguard Worker   // Note that IEEE 754 does not define the behavior of a nan's sign when it is
835*9356374aSAndroid Build Coastguard Worker   // copied, so the code below allows for either + or - InfiniteDuration.
836*9356374aSAndroid Build Coastguard Worker #define TEST_NAN_HANDLING(NAME, NAN)           \
837*9356374aSAndroid Build Coastguard Worker   do {                                         \
838*9356374aSAndroid Build Coastguard Worker     const auto inf = absl::InfiniteDuration(); \
839*9356374aSAndroid Build Coastguard Worker     auto x = NAME(NAN);                        \
840*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(x == inf || x == -inf);        \
841*9356374aSAndroid Build Coastguard Worker     auto y = NAME(42);                         \
842*9356374aSAndroid Build Coastguard Worker     y *= NAN;                                  \
843*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(y == inf || y == -inf);        \
844*9356374aSAndroid Build Coastguard Worker     auto z = NAME(42);                         \
845*9356374aSAndroid Build Coastguard Worker     z /= NAN;                                  \
846*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(z == inf || z == -inf);        \
847*9356374aSAndroid Build Coastguard Worker   } while (0)
848*9356374aSAndroid Build Coastguard Worker 
849*9356374aSAndroid Build Coastguard Worker   const double nan = std::numeric_limits<double>::quiet_NaN();
850*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Nanoseconds, nan);
851*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Microseconds, nan);
852*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Milliseconds, nan);
853*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Seconds, nan);
854*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Minutes, nan);
855*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Hours, nan);
856*9356374aSAndroid Build Coastguard Worker 
857*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Nanoseconds, -nan);
858*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Microseconds, -nan);
859*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Milliseconds, -nan);
860*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Seconds, -nan);
861*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Minutes, -nan);
862*9356374aSAndroid Build Coastguard Worker   TEST_NAN_HANDLING(absl::Hours, -nan);
863*9356374aSAndroid Build Coastguard Worker 
864*9356374aSAndroid Build Coastguard Worker #undef TEST_NAN_HANDLING
865*9356374aSAndroid Build Coastguard Worker }
866*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Range)867*9356374aSAndroid Build Coastguard Worker TEST(Duration, Range) {
868*9356374aSAndroid Build Coastguard Worker   const absl::Duration range = ApproxYears(100 * 1e9);
869*9356374aSAndroid Build Coastguard Worker   const absl::Duration range_future = range;
870*9356374aSAndroid Build Coastguard Worker   const absl::Duration range_past = -range;
871*9356374aSAndroid Build Coastguard Worker 
872*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(range_future, absl::InfiniteDuration());
873*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(range_past, -absl::InfiniteDuration());
874*9356374aSAndroid Build Coastguard Worker 
875*9356374aSAndroid Build Coastguard Worker   const absl::Duration full_range = range_future - range_past;
876*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(full_range, absl::ZeroDuration());
877*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(full_range, absl::InfiniteDuration());
878*9356374aSAndroid Build Coastguard Worker 
879*9356374aSAndroid Build Coastguard Worker   const absl::Duration neg_full_range = range_past - range_future;
880*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(neg_full_range, absl::ZeroDuration());
881*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(neg_full_range, -absl::InfiniteDuration());
882*9356374aSAndroid Build Coastguard Worker 
883*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(neg_full_range, full_range);
884*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(neg_full_range, -full_range);
885*9356374aSAndroid Build Coastguard Worker 
886*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
887*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(range_future <=> absl::InfiniteDuration(),
888*9356374aSAndroid Build Coastguard Worker             std::strong_ordering::less);
889*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(range_past <=> -absl::InfiniteDuration(),
890*9356374aSAndroid Build Coastguard Worker             std::strong_ordering::greater);
891*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(full_range <=> absl::ZeroDuration(),  //
892*9356374aSAndroid Build Coastguard Worker             std::strong_ordering::greater);
893*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(full_range <=> -absl::InfiniteDuration(),
894*9356374aSAndroid Build Coastguard Worker             std::strong_ordering::greater);
895*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(neg_full_range <=> -absl::InfiniteDuration(),
896*9356374aSAndroid Build Coastguard Worker             std::strong_ordering::greater);
897*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(neg_full_range <=> full_range, std::strong_ordering::less);
898*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(neg_full_range <=> -full_range, std::strong_ordering::equal);
899*9356374aSAndroid Build Coastguard Worker #endif  // __cpp_impl_three_way_comparison
900*9356374aSAndroid Build Coastguard Worker }
901*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,RelationalOperators)902*9356374aSAndroid Build Coastguard Worker TEST(Duration, RelationalOperators) {
903*9356374aSAndroid Build Coastguard Worker #define TEST_REL_OPS(UNIT)               \
904*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(2) == UNIT(2), ""); \
905*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(1) != UNIT(2), ""); \
906*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(1) < UNIT(2), "");  \
907*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(3) > UNIT(2), "");  \
908*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(1) <= UNIT(2), ""); \
909*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(2) <= UNIT(2), ""); \
910*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(3) >= UNIT(2), ""); \
911*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(2) >= UNIT(2), "");
912*9356374aSAndroid Build Coastguard Worker 
913*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Nanoseconds);
914*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Microseconds);
915*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Milliseconds);
916*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Seconds);
917*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Minutes);
918*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Hours);
919*9356374aSAndroid Build Coastguard Worker 
920*9356374aSAndroid Build Coastguard Worker #undef TEST_REL_OPS
921*9356374aSAndroid Build Coastguard Worker }
922*9356374aSAndroid Build Coastguard Worker 
923*9356374aSAndroid Build Coastguard Worker 
924*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
925*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,SpaceshipOperators)926*9356374aSAndroid Build Coastguard Worker TEST(Duration, SpaceshipOperators) {
927*9356374aSAndroid Build Coastguard Worker #define TEST_REL_OPS(UNIT)               \
928*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(2) <=> UNIT(2) == std::strong_ordering::equal, ""); \
929*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(1) <=> UNIT(2) == std::strong_ordering::less, ""); \
930*9356374aSAndroid Build Coastguard Worker   static_assert(UNIT(3) <=> UNIT(2) == std::strong_ordering::greater, "");
931*9356374aSAndroid Build Coastguard Worker 
932*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Nanoseconds);
933*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Microseconds);
934*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Milliseconds);
935*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Seconds);
936*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Minutes);
937*9356374aSAndroid Build Coastguard Worker   TEST_REL_OPS(absl::Hours);
938*9356374aSAndroid Build Coastguard Worker 
939*9356374aSAndroid Build Coastguard Worker #undef TEST_REL_OPS
940*9356374aSAndroid Build Coastguard Worker }
941*9356374aSAndroid Build Coastguard Worker 
942*9356374aSAndroid Build Coastguard Worker #endif  // __cpp_impl_three_way_comparison
943*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Addition)944*9356374aSAndroid Build Coastguard Worker TEST(Duration, Addition) {
945*9356374aSAndroid Build Coastguard Worker #define TEST_ADD_OPS(UNIT)                  \
946*9356374aSAndroid Build Coastguard Worker   do {                                      \
947*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(2), UNIT(1) + UNIT(1));  \
948*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(1), UNIT(2) - UNIT(1));  \
949*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(0), UNIT(2) - UNIT(2));  \
950*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-1), UNIT(1) - UNIT(2)); \
951*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-2), UNIT(0) - UNIT(2)); \
952*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-2), UNIT(1) - UNIT(3)); \
953*9356374aSAndroid Build Coastguard Worker     absl::Duration a = UNIT(1);             \
954*9356374aSAndroid Build Coastguard Worker     a += UNIT(1);                           \
955*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(2), a);                  \
956*9356374aSAndroid Build Coastguard Worker     a -= UNIT(1);                           \
957*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(1), a);                  \
958*9356374aSAndroid Build Coastguard Worker   } while (0)
959*9356374aSAndroid Build Coastguard Worker 
960*9356374aSAndroid Build Coastguard Worker   TEST_ADD_OPS(absl::Nanoseconds);
961*9356374aSAndroid Build Coastguard Worker   TEST_ADD_OPS(absl::Microseconds);
962*9356374aSAndroid Build Coastguard Worker   TEST_ADD_OPS(absl::Milliseconds);
963*9356374aSAndroid Build Coastguard Worker   TEST_ADD_OPS(absl::Seconds);
964*9356374aSAndroid Build Coastguard Worker   TEST_ADD_OPS(absl::Minutes);
965*9356374aSAndroid Build Coastguard Worker   TEST_ADD_OPS(absl::Hours);
966*9356374aSAndroid Build Coastguard Worker 
967*9356374aSAndroid Build Coastguard Worker #undef TEST_ADD_OPS
968*9356374aSAndroid Build Coastguard Worker 
969*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(2), absl::Seconds(3) - 2 * absl::Milliseconds(500));
970*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(2) + absl::Milliseconds(500),
971*9356374aSAndroid Build Coastguard Worker             absl::Seconds(3) - absl::Milliseconds(500));
972*9356374aSAndroid Build Coastguard Worker 
973*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(1) + absl::Milliseconds(998),
974*9356374aSAndroid Build Coastguard Worker             absl::Milliseconds(999) + absl::Milliseconds(999));
975*9356374aSAndroid Build Coastguard Worker 
976*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Milliseconds(-1),
977*9356374aSAndroid Build Coastguard Worker             absl::Milliseconds(998) - absl::Milliseconds(999));
978*9356374aSAndroid Build Coastguard Worker 
979*9356374aSAndroid Build Coastguard Worker   // Tests fractions of a nanoseconds. These are implementation details only.
980*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(absl::Nanoseconds(1), absl::Nanoseconds(1) / 2);
981*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1),
982*9356374aSAndroid Build Coastguard Worker             absl::Nanoseconds(1) / 2 + absl::Nanoseconds(1) / 2);
983*9356374aSAndroid Build Coastguard Worker   EXPECT_GT(absl::Nanoseconds(1) / 4, absl::Nanoseconds(0));
984*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1) / 8, absl::Nanoseconds(0));
985*9356374aSAndroid Build Coastguard Worker 
986*9356374aSAndroid Build Coastguard Worker   // Tests subtraction that will cause wrap around of the rep_lo_ bits.
987*9356374aSAndroid Build Coastguard Worker   absl::Duration d_7_5 = absl::Seconds(7) + absl::Milliseconds(500);
988*9356374aSAndroid Build Coastguard Worker   absl::Duration d_3_7 = absl::Seconds(3) + absl::Milliseconds(700);
989*9356374aSAndroid Build Coastguard Worker   absl::Duration ans_3_8 = absl::Seconds(3) + absl::Milliseconds(800);
990*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(ans_3_8, d_7_5 - d_3_7);
991*9356374aSAndroid Build Coastguard Worker 
992*9356374aSAndroid Build Coastguard Worker   // Subtracting min_duration
993*9356374aSAndroid Build Coastguard Worker   absl::Duration min_dur = absl::Seconds(kint64min);
994*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(0), min_dur - min_dur);
995*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(kint64max), absl::Seconds(-1) - min_dur);
996*9356374aSAndroid Build Coastguard Worker }
997*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Negation)998*9356374aSAndroid Build Coastguard Worker TEST(Duration, Negation) {
999*9356374aSAndroid Build Coastguard Worker   // By storing negations of various values in constexpr variables we
1000*9356374aSAndroid Build Coastguard Worker   // verify that the initializers are constant expressions.
1001*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration negated_zero_duration = -absl::ZeroDuration();
1002*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(negated_zero_duration, absl::ZeroDuration());
1003*9356374aSAndroid Build Coastguard Worker 
1004*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration negated_infinite_duration =
1005*9356374aSAndroid Build Coastguard Worker       -absl::InfiniteDuration();
1006*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(negated_infinite_duration, absl::InfiniteDuration());
1007*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-negated_infinite_duration, absl::InfiniteDuration());
1008*9356374aSAndroid Build Coastguard Worker 
1009*9356374aSAndroid Build Coastguard Worker   // The public APIs to check if a duration is infinite depend on using
1010*9356374aSAndroid Build Coastguard Worker   // -InfiniteDuration(), but we're trying to test operator- here, so we
1011*9356374aSAndroid Build Coastguard Worker   // need to use the lower-level internal query IsInfiniteDuration.
1012*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
1013*9356374aSAndroid Build Coastguard Worker       absl::time_internal::IsInfiniteDuration(negated_infinite_duration));
1014*9356374aSAndroid Build Coastguard Worker 
1015*9356374aSAndroid Build Coastguard Worker   // The largest Duration is kint64max seconds and kTicksPerSecond - 1 ticks.
1016*9356374aSAndroid Build Coastguard Worker   // Using the absl::time_internal::MakeDuration API is the cleanest way to
1017*9356374aSAndroid Build Coastguard Worker   // construct that Duration.
1018*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration max_duration = absl::time_internal::MakeDuration(
1019*9356374aSAndroid Build Coastguard Worker       kint64max, absl::time_internal::kTicksPerSecond - 1);
1020*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration negated_max_duration = -max_duration;
1021*9356374aSAndroid Build Coastguard Worker   // The largest negatable value is one tick above the minimum representable;
1022*9356374aSAndroid Build Coastguard Worker   // it's the negation of max_duration.
1023*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration nearly_min_duration =
1024*9356374aSAndroid Build Coastguard Worker       absl::time_internal::MakeDuration(kint64min, int64_t{1});
1025*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration negated_nearly_min_duration = -nearly_min_duration;
1026*9356374aSAndroid Build Coastguard Worker 
1027*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(negated_max_duration, nearly_min_duration);
1028*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(negated_nearly_min_duration, max_duration);
1029*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-(-max_duration), max_duration);
1030*9356374aSAndroid Build Coastguard Worker 
1031*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration min_duration =
1032*9356374aSAndroid Build Coastguard Worker       absl::time_internal::MakeDuration(kint64min);
1033*9356374aSAndroid Build Coastguard Worker   constexpr absl::Duration negated_min_duration = -min_duration;
1034*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(negated_min_duration, absl::InfiniteDuration());
1035*9356374aSAndroid Build Coastguard Worker }
1036*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,AbsoluteValue)1037*9356374aSAndroid Build Coastguard Worker TEST(Duration, AbsoluteValue) {
1038*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), AbsDuration(absl::ZeroDuration()));
1039*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(1), AbsDuration(absl::Seconds(1)));
1040*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(1), AbsDuration(absl::Seconds(-1)));
1041*9356374aSAndroid Build Coastguard Worker 
1042*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), AbsDuration(absl::InfiniteDuration()));
1043*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), AbsDuration(-absl::InfiniteDuration()));
1044*9356374aSAndroid Build Coastguard Worker 
1045*9356374aSAndroid Build Coastguard Worker   absl::Duration max_dur =
1046*9356374aSAndroid Build Coastguard Worker       absl::Seconds(kint64max) + (absl::Seconds(1) - absl::Nanoseconds(1) / 4);
1047*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_dur, AbsDuration(max_dur));
1048*9356374aSAndroid Build Coastguard Worker 
1049*9356374aSAndroid Build Coastguard Worker   absl::Duration min_dur = absl::Seconds(kint64min);
1050*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), AbsDuration(min_dur));
1051*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_dur, AbsDuration(min_dur + absl::Nanoseconds(1) / 4));
1052*9356374aSAndroid Build Coastguard Worker }
1053*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Multiplication)1054*9356374aSAndroid Build Coastguard Worker TEST(Duration, Multiplication) {
1055*9356374aSAndroid Build Coastguard Worker #define TEST_MUL_OPS(UNIT)                                    \
1056*9356374aSAndroid Build Coastguard Worker   do {                                                        \
1057*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(5), UNIT(2) * 2.5);                        \
1058*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(2), UNIT(5) / 2.5);                        \
1059*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-5), UNIT(-2) * 2.5);                      \
1060*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-5), -UNIT(2) * 2.5);                      \
1061*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-5), UNIT(2) * -2.5);                      \
1062*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-2), UNIT(-5) / 2.5);                      \
1063*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-2), -UNIT(5) / 2.5);                      \
1064*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(-2), UNIT(5) / -2.5);                      \
1065*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(2), UNIT(11) % UNIT(3));                   \
1066*9356374aSAndroid Build Coastguard Worker     absl::Duration a = UNIT(2);                               \
1067*9356374aSAndroid Build Coastguard Worker     a *= 2.5;                                                 \
1068*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(5), a);                                    \
1069*9356374aSAndroid Build Coastguard Worker     a /= 2.5;                                                 \
1070*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(2), a);                                    \
1071*9356374aSAndroid Build Coastguard Worker     a %= UNIT(1);                                             \
1072*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(0), a);                                    \
1073*9356374aSAndroid Build Coastguard Worker     absl::Duration big = UNIT(1000000000);                    \
1074*9356374aSAndroid Build Coastguard Worker     big *= 3;                                                 \
1075*9356374aSAndroid Build Coastguard Worker     big /= 3;                                                 \
1076*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(UNIT(1000000000), big);                         \
1077*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-UNIT(2), -UNIT(2));                            \
1078*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-UNIT(2), UNIT(2) * -1);                        \
1079*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-UNIT(2), -1 * UNIT(2));                        \
1080*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-UNIT(-2), UNIT(2));                            \
1081*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(2, UNIT(2) / UNIT(1));                          \
1082*9356374aSAndroid Build Coastguard Worker     absl::Duration rem;                                       \
1083*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(2, absl::IDivDuration(UNIT(2), UNIT(1), &rem)); \
1084*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(2.0, absl::FDivDuration(UNIT(2), UNIT(1)));     \
1085*9356374aSAndroid Build Coastguard Worker   } while (0)
1086*9356374aSAndroid Build Coastguard Worker 
1087*9356374aSAndroid Build Coastguard Worker   TEST_MUL_OPS(absl::Nanoseconds);
1088*9356374aSAndroid Build Coastguard Worker   TEST_MUL_OPS(absl::Microseconds);
1089*9356374aSAndroid Build Coastguard Worker   TEST_MUL_OPS(absl::Milliseconds);
1090*9356374aSAndroid Build Coastguard Worker   TEST_MUL_OPS(absl::Seconds);
1091*9356374aSAndroid Build Coastguard Worker   TEST_MUL_OPS(absl::Minutes);
1092*9356374aSAndroid Build Coastguard Worker   TEST_MUL_OPS(absl::Hours);
1093*9356374aSAndroid Build Coastguard Worker 
1094*9356374aSAndroid Build Coastguard Worker #undef TEST_MUL_OPS
1095*9356374aSAndroid Build Coastguard Worker 
1096*9356374aSAndroid Build Coastguard Worker   // Ensures that multiplication and division by 1 with a maxed-out durations
1097*9356374aSAndroid Build Coastguard Worker   // doesn't lose precision.
1098*9356374aSAndroid Build Coastguard Worker   absl::Duration max_dur =
1099*9356374aSAndroid Build Coastguard Worker       absl::Seconds(kint64max) + (absl::Seconds(1) - absl::Nanoseconds(1) / 4);
1100*9356374aSAndroid Build Coastguard Worker   absl::Duration min_dur = absl::Seconds(kint64min);
1101*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_dur, max_dur * 1);
1102*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_dur, max_dur / 1);
1103*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_dur, min_dur * 1);
1104*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_dur, min_dur / 1);
1105*9356374aSAndroid Build Coastguard Worker 
1106*9356374aSAndroid Build Coastguard Worker   // Tests division on a Duration with a large number of significant digits.
1107*9356374aSAndroid Build Coastguard Worker   // Tests when the digits span hi and lo as well as only in hi.
1108*9356374aSAndroid Build Coastguard Worker   absl::Duration sigfigs = absl::Seconds(2000000000) + absl::Nanoseconds(3);
1109*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(666666666) + absl::Nanoseconds(666666667) +
1110*9356374aSAndroid Build Coastguard Worker                 absl::Nanoseconds(1) / 2,
1111*9356374aSAndroid Build Coastguard Worker             sigfigs / 3);
1112*9356374aSAndroid Build Coastguard Worker   sigfigs = absl::Seconds(int64_t{7000000000});
1113*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(2333333333) + absl::Nanoseconds(333333333) +
1114*9356374aSAndroid Build Coastguard Worker                 absl::Nanoseconds(1) / 4,
1115*9356374aSAndroid Build Coastguard Worker             sigfigs / 3);
1116*9356374aSAndroid Build Coastguard Worker 
1117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(7) + absl::Milliseconds(500), absl::Seconds(3) * 2.5);
1118*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(8) * -1 + absl::Milliseconds(300),
1119*9356374aSAndroid Build Coastguard Worker             (absl::Seconds(2) + absl::Milliseconds(200)) * -3.5);
1120*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Seconds(8) + absl::Milliseconds(300),
1121*9356374aSAndroid Build Coastguard Worker             (absl::Seconds(2) + absl::Milliseconds(200)) * -3.5);
1122*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(1) + absl::Milliseconds(875),
1123*9356374aSAndroid Build Coastguard Worker             (absl::Seconds(7) + absl::Milliseconds(500)) / 4);
1124*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(30),
1125*9356374aSAndroid Build Coastguard Worker             (absl::Seconds(7) + absl::Milliseconds(500)) / 0.25);
1126*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(3),
1127*9356374aSAndroid Build Coastguard Worker             (absl::Seconds(7) + absl::Milliseconds(500)) / 2.5);
1128*9356374aSAndroid Build Coastguard Worker 
1129*9356374aSAndroid Build Coastguard Worker   // Tests division remainder.
1130*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(0), absl::Nanoseconds(7) % absl::Nanoseconds(1));
1131*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(0), absl::Nanoseconds(0) % absl::Nanoseconds(10));
1132*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(2), absl::Nanoseconds(7) % absl::Nanoseconds(5));
1133*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(2), absl::Nanoseconds(2) % absl::Nanoseconds(5));
1134*9356374aSAndroid Build Coastguard Worker 
1135*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1), absl::Nanoseconds(10) % absl::Nanoseconds(3));
1136*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1),
1137*9356374aSAndroid Build Coastguard Worker             absl::Nanoseconds(10) % absl::Nanoseconds(-3));
1138*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(-1),
1139*9356374aSAndroid Build Coastguard Worker             absl::Nanoseconds(-10) % absl::Nanoseconds(3));
1140*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(-1),
1141*9356374aSAndroid Build Coastguard Worker             absl::Nanoseconds(-10) % absl::Nanoseconds(-3));
1142*9356374aSAndroid Build Coastguard Worker 
1143*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Milliseconds(100),
1144*9356374aSAndroid Build Coastguard Worker             absl::Seconds(1) % absl::Milliseconds(300));
1145*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(
1146*9356374aSAndroid Build Coastguard Worker       absl::Milliseconds(300),
1147*9356374aSAndroid Build Coastguard Worker       (absl::Seconds(3) + absl::Milliseconds(800)) % absl::Milliseconds(500));
1148*9356374aSAndroid Build Coastguard Worker 
1149*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1), absl::Nanoseconds(1) % absl::Seconds(1));
1150*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(-1), absl::Nanoseconds(-1) % absl::Seconds(1));
1151*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, absl::Nanoseconds(-1) / absl::Seconds(1));  // Actual -1e-9
1152*9356374aSAndroid Build Coastguard Worker 
1153*9356374aSAndroid Build Coastguard Worker   // Tests identity a = (a/b)*b + a%b
1154*9356374aSAndroid Build Coastguard Worker #define TEST_MOD_IDENTITY(a, b) \
1155*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ((a), ((a) / (b))*(b) + ((a)%(b)))
1156*9356374aSAndroid Build Coastguard Worker 
1157*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(0), absl::Seconds(2));
1158*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(1), absl::Seconds(1));
1159*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(1), absl::Seconds(2));
1160*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(2), absl::Seconds(1));
1161*9356374aSAndroid Build Coastguard Worker 
1162*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(-2), absl::Seconds(1));
1163*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(2), absl::Seconds(-1));
1164*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(-2), absl::Seconds(-1));
1165*9356374aSAndroid Build Coastguard Worker 
1166*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(0), absl::Nanoseconds(2));
1167*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(1), absl::Nanoseconds(1));
1168*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(1), absl::Nanoseconds(2));
1169*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(2), absl::Nanoseconds(1));
1170*9356374aSAndroid Build Coastguard Worker 
1171*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(-2), absl::Nanoseconds(1));
1172*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(2), absl::Nanoseconds(-1));
1173*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Nanoseconds(-2), absl::Nanoseconds(-1));
1174*9356374aSAndroid Build Coastguard Worker 
1175*9356374aSAndroid Build Coastguard Worker   // Mixed seconds + subseconds
1176*9356374aSAndroid Build Coastguard Worker   absl::Duration mixed_a = absl::Seconds(1) + absl::Nanoseconds(2);
1177*9356374aSAndroid Build Coastguard Worker   absl::Duration mixed_b = absl::Seconds(1) + absl::Nanoseconds(3);
1178*9356374aSAndroid Build Coastguard Worker 
1179*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(absl::Seconds(0), mixed_a);
1180*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(mixed_a, mixed_a);
1181*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(mixed_a, mixed_b);
1182*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(mixed_b, mixed_a);
1183*9356374aSAndroid Build Coastguard Worker 
1184*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(-mixed_a, mixed_b);
1185*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(mixed_a, -mixed_b);
1186*9356374aSAndroid Build Coastguard Worker   TEST_MOD_IDENTITY(-mixed_a, -mixed_b);
1187*9356374aSAndroid Build Coastguard Worker 
1188*9356374aSAndroid Build Coastguard Worker #undef TEST_MOD_IDENTITY
1189*9356374aSAndroid Build Coastguard Worker }
1190*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Truncation)1191*9356374aSAndroid Build Coastguard Worker TEST(Duration, Truncation) {
1192*9356374aSAndroid Build Coastguard Worker   const absl::Duration d = absl::Nanoseconds(1234567890);
1193*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
1194*9356374aSAndroid Build Coastguard Worker   for (int unit_sign : {1, -1}) {  // sign shouldn't matter
1195*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Nanoseconds(1234567890),
1196*9356374aSAndroid Build Coastguard Worker               Trunc(d, unit_sign * absl::Nanoseconds(1)));
1197*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Microseconds(1234567),
1198*9356374aSAndroid Build Coastguard Worker               Trunc(d, unit_sign * absl::Microseconds(1)));
1199*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Milliseconds(1234),
1200*9356374aSAndroid Build Coastguard Worker               Trunc(d, unit_sign * absl::Milliseconds(1)));
1201*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Seconds(1), Trunc(d, unit_sign * absl::Seconds(1)));
1202*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(inf, Trunc(inf, unit_sign * absl::Seconds(1)));
1203*9356374aSAndroid Build Coastguard Worker 
1204*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Nanoseconds(-1234567890),
1205*9356374aSAndroid Build Coastguard Worker               Trunc(-d, unit_sign * absl::Nanoseconds(1)));
1206*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Microseconds(-1234567),
1207*9356374aSAndroid Build Coastguard Worker               Trunc(-d, unit_sign * absl::Microseconds(1)));
1208*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Milliseconds(-1234),
1209*9356374aSAndroid Build Coastguard Worker               Trunc(-d, unit_sign * absl::Milliseconds(1)));
1210*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Seconds(-1), Trunc(-d, unit_sign * absl::Seconds(1)));
1211*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-inf, Trunc(-inf, unit_sign * absl::Seconds(1)));
1212*9356374aSAndroid Build Coastguard Worker   }
1213*9356374aSAndroid Build Coastguard Worker }
1214*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Flooring)1215*9356374aSAndroid Build Coastguard Worker TEST(Duration, Flooring) {
1216*9356374aSAndroid Build Coastguard Worker   const absl::Duration d = absl::Nanoseconds(1234567890);
1217*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
1218*9356374aSAndroid Build Coastguard Worker   for (int unit_sign : {1, -1}) {  // sign shouldn't matter
1219*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Nanoseconds(1234567890),
1220*9356374aSAndroid Build Coastguard Worker               absl::Floor(d, unit_sign * absl::Nanoseconds(1)));
1221*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Microseconds(1234567),
1222*9356374aSAndroid Build Coastguard Worker               absl::Floor(d, unit_sign * absl::Microseconds(1)));
1223*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Milliseconds(1234),
1224*9356374aSAndroid Build Coastguard Worker               absl::Floor(d, unit_sign * absl::Milliseconds(1)));
1225*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Seconds(1), absl::Floor(d, unit_sign * absl::Seconds(1)));
1226*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(inf, absl::Floor(inf, unit_sign * absl::Seconds(1)));
1227*9356374aSAndroid Build Coastguard Worker 
1228*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Nanoseconds(-1234567890),
1229*9356374aSAndroid Build Coastguard Worker               absl::Floor(-d, unit_sign * absl::Nanoseconds(1)));
1230*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Microseconds(-1234568),
1231*9356374aSAndroid Build Coastguard Worker               absl::Floor(-d, unit_sign * absl::Microseconds(1)));
1232*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Milliseconds(-1235),
1233*9356374aSAndroid Build Coastguard Worker               absl::Floor(-d, unit_sign * absl::Milliseconds(1)));
1234*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Seconds(-2), absl::Floor(-d, unit_sign * absl::Seconds(1)));
1235*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-inf, absl::Floor(-inf, unit_sign * absl::Seconds(1)));
1236*9356374aSAndroid Build Coastguard Worker   }
1237*9356374aSAndroid Build Coastguard Worker }
1238*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,Ceiling)1239*9356374aSAndroid Build Coastguard Worker TEST(Duration, Ceiling) {
1240*9356374aSAndroid Build Coastguard Worker   const absl::Duration d = absl::Nanoseconds(1234567890);
1241*9356374aSAndroid Build Coastguard Worker   const absl::Duration inf = absl::InfiniteDuration();
1242*9356374aSAndroid Build Coastguard Worker   for (int unit_sign : {1, -1}) {  // // sign shouldn't matter
1243*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Nanoseconds(1234567890),
1244*9356374aSAndroid Build Coastguard Worker               absl::Ceil(d, unit_sign * absl::Nanoseconds(1)));
1245*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Microseconds(1234568),
1246*9356374aSAndroid Build Coastguard Worker               absl::Ceil(d, unit_sign * absl::Microseconds(1)));
1247*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Milliseconds(1235),
1248*9356374aSAndroid Build Coastguard Worker               absl::Ceil(d, unit_sign * absl::Milliseconds(1)));
1249*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Seconds(2), absl::Ceil(d, unit_sign * absl::Seconds(1)));
1250*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(inf, absl::Ceil(inf, unit_sign * absl::Seconds(1)));
1251*9356374aSAndroid Build Coastguard Worker 
1252*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Nanoseconds(-1234567890),
1253*9356374aSAndroid Build Coastguard Worker               absl::Ceil(-d, unit_sign * absl::Nanoseconds(1)));
1254*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Microseconds(-1234567),
1255*9356374aSAndroid Build Coastguard Worker               absl::Ceil(-d, unit_sign * absl::Microseconds(1)));
1256*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Milliseconds(-1234),
1257*9356374aSAndroid Build Coastguard Worker               absl::Ceil(-d, unit_sign * absl::Milliseconds(1)));
1258*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(absl::Seconds(-1), absl::Ceil(-d, unit_sign * absl::Seconds(1)));
1259*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(-inf, absl::Ceil(-inf, unit_sign * absl::Seconds(1)));
1260*9356374aSAndroid Build Coastguard Worker   }
1261*9356374aSAndroid Build Coastguard Worker }
1262*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,RoundTripUnits)1263*9356374aSAndroid Build Coastguard Worker TEST(Duration, RoundTripUnits) {
1264*9356374aSAndroid Build Coastguard Worker   const int kRange = 100000;
1265*9356374aSAndroid Build Coastguard Worker 
1266*9356374aSAndroid Build Coastguard Worker #define ROUND_TRIP_UNIT(U, LOW, HIGH)          \
1267*9356374aSAndroid Build Coastguard Worker   do {                                         \
1268*9356374aSAndroid Build Coastguard Worker     for (int64_t i = LOW; i < HIGH; ++i) {     \
1269*9356374aSAndroid Build Coastguard Worker       absl::Duration d = absl::U(i);           \
1270*9356374aSAndroid Build Coastguard Worker       if (d == absl::InfiniteDuration())       \
1271*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(kint64max, d / absl::U(1));  \
1272*9356374aSAndroid Build Coastguard Worker       else if (d == -absl::InfiniteDuration()) \
1273*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(kint64min, d / absl::U(1));  \
1274*9356374aSAndroid Build Coastguard Worker       else                                     \
1275*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(i, absl::U(i) / absl::U(1)); \
1276*9356374aSAndroid Build Coastguard Worker     }                                          \
1277*9356374aSAndroid Build Coastguard Worker   } while (0)
1278*9356374aSAndroid Build Coastguard Worker 
1279*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Nanoseconds, kint64min, kint64min + kRange);
1280*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Nanoseconds, -kRange, kRange);
1281*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Nanoseconds, kint64max - kRange, kint64max);
1282*9356374aSAndroid Build Coastguard Worker 
1283*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Microseconds, kint64min, kint64min + kRange);
1284*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Microseconds, -kRange, kRange);
1285*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Microseconds, kint64max - kRange, kint64max);
1286*9356374aSAndroid Build Coastguard Worker 
1287*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Milliseconds, kint64min, kint64min + kRange);
1288*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Milliseconds, -kRange, kRange);
1289*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Milliseconds, kint64max - kRange, kint64max);
1290*9356374aSAndroid Build Coastguard Worker 
1291*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Seconds, kint64min, kint64min + kRange);
1292*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Seconds, -kRange, kRange);
1293*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Seconds, kint64max - kRange, kint64max);
1294*9356374aSAndroid Build Coastguard Worker 
1295*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Minutes, kint64min / 60, kint64min / 60 + kRange);
1296*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Minutes, -kRange, kRange);
1297*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Minutes, kint64max / 60 - kRange, kint64max / 60);
1298*9356374aSAndroid Build Coastguard Worker 
1299*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Hours, kint64min / 3600, kint64min / 3600 + kRange);
1300*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Hours, -kRange, kRange);
1301*9356374aSAndroid Build Coastguard Worker   ROUND_TRIP_UNIT(Hours, kint64max / 3600 - kRange, kint64max / 3600);
1302*9356374aSAndroid Build Coastguard Worker 
1303*9356374aSAndroid Build Coastguard Worker #undef ROUND_TRIP_UNIT
1304*9356374aSAndroid Build Coastguard Worker }
1305*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,TruncConversions)1306*9356374aSAndroid Build Coastguard Worker TEST(Duration, TruncConversions) {
1307*9356374aSAndroid Build Coastguard Worker   // Tests ToTimespec()/DurationFromTimespec()
1308*9356374aSAndroid Build Coastguard Worker   const struct {
1309*9356374aSAndroid Build Coastguard Worker     absl::Duration d;
1310*9356374aSAndroid Build Coastguard Worker     timespec ts;
1311*9356374aSAndroid Build Coastguard Worker   } to_ts[] = {
1312*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(1) + absl::Nanoseconds(1), {1, 1}},
1313*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(1) + absl::Nanoseconds(1) / 2, {1, 0}},
1314*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(1) + absl::Nanoseconds(0), {1, 0}},
1315*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(0) + absl::Nanoseconds(0), {0, 0}},
1316*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(0) - absl::Nanoseconds(1) / 2, {0, 0}},
1317*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(0) - absl::Nanoseconds(1), {-1, 999999999}},
1318*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) + absl::Nanoseconds(1), {-1, 1}},
1319*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) + absl::Nanoseconds(1) / 2, {-1, 1}},
1320*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) + absl::Nanoseconds(0), {-1, 0}},
1321*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) - absl::Nanoseconds(1) / 2, {-1, 0}},
1322*9356374aSAndroid Build Coastguard Worker   };
1323*9356374aSAndroid Build Coastguard Worker   for (const auto& test : to_ts) {
1324*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(absl::ToTimespec(test.d), TimespecMatcher(test.ts));
1325*9356374aSAndroid Build Coastguard Worker   }
1326*9356374aSAndroid Build Coastguard Worker   const struct {
1327*9356374aSAndroid Build Coastguard Worker     timespec ts;
1328*9356374aSAndroid Build Coastguard Worker     absl::Duration d;
1329*9356374aSAndroid Build Coastguard Worker   } from_ts[] = {
1330*9356374aSAndroid Build Coastguard Worker       {{1, 1}, absl::Seconds(1) + absl::Nanoseconds(1)},
1331*9356374aSAndroid Build Coastguard Worker       {{1, 0}, absl::Seconds(1) + absl::Nanoseconds(0)},
1332*9356374aSAndroid Build Coastguard Worker       {{0, 0}, absl::Seconds(0) + absl::Nanoseconds(0)},
1333*9356374aSAndroid Build Coastguard Worker       {{0, -1}, absl::Seconds(0) - absl::Nanoseconds(1)},
1334*9356374aSAndroid Build Coastguard Worker       {{-1, 999999999}, absl::Seconds(0) - absl::Nanoseconds(1)},
1335*9356374aSAndroid Build Coastguard Worker       {{-1, 1}, absl::Seconds(-1) + absl::Nanoseconds(1)},
1336*9356374aSAndroid Build Coastguard Worker       {{-1, 0}, absl::Seconds(-1) + absl::Nanoseconds(0)},
1337*9356374aSAndroid Build Coastguard Worker       {{-1, -1}, absl::Seconds(-1) - absl::Nanoseconds(1)},
1338*9356374aSAndroid Build Coastguard Worker       {{-2, 999999999}, absl::Seconds(-1) - absl::Nanoseconds(1)},
1339*9356374aSAndroid Build Coastguard Worker   };
1340*9356374aSAndroid Build Coastguard Worker   for (const auto& test : from_ts) {
1341*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test.d, absl::DurationFromTimespec(test.ts));
1342*9356374aSAndroid Build Coastguard Worker   }
1343*9356374aSAndroid Build Coastguard Worker 
1344*9356374aSAndroid Build Coastguard Worker   // Tests ToTimeval()/DurationFromTimeval() (same as timespec above)
1345*9356374aSAndroid Build Coastguard Worker   const struct {
1346*9356374aSAndroid Build Coastguard Worker     absl::Duration d;
1347*9356374aSAndroid Build Coastguard Worker     timeval tv;
1348*9356374aSAndroid Build Coastguard Worker   } to_tv[] = {
1349*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(1) + absl::Microseconds(1), {1, 1}},
1350*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(1) + absl::Microseconds(1) / 2, {1, 0}},
1351*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(1) + absl::Microseconds(0), {1, 0}},
1352*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(0) + absl::Microseconds(0), {0, 0}},
1353*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(0) - absl::Microseconds(1) / 2, {0, 0}},
1354*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(0) - absl::Microseconds(1), {-1, 999999}},
1355*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) + absl::Microseconds(1), {-1, 1}},
1356*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) + absl::Microseconds(1) / 2, {-1, 1}},
1357*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) + absl::Microseconds(0), {-1, 0}},
1358*9356374aSAndroid Build Coastguard Worker       {absl::Seconds(-1) - absl::Microseconds(1) / 2, {-1, 0}},
1359*9356374aSAndroid Build Coastguard Worker   };
1360*9356374aSAndroid Build Coastguard Worker   for (const auto& test : to_tv) {
1361*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(absl::ToTimeval(test.d), TimevalMatcher(test.tv));
1362*9356374aSAndroid Build Coastguard Worker   }
1363*9356374aSAndroid Build Coastguard Worker   const struct {
1364*9356374aSAndroid Build Coastguard Worker     timeval tv;
1365*9356374aSAndroid Build Coastguard Worker     absl::Duration d;
1366*9356374aSAndroid Build Coastguard Worker   } from_tv[] = {
1367*9356374aSAndroid Build Coastguard Worker       {{1, 1}, absl::Seconds(1) + absl::Microseconds(1)},
1368*9356374aSAndroid Build Coastguard Worker       {{1, 0}, absl::Seconds(1) + absl::Microseconds(0)},
1369*9356374aSAndroid Build Coastguard Worker       {{0, 0}, absl::Seconds(0) + absl::Microseconds(0)},
1370*9356374aSAndroid Build Coastguard Worker       {{0, -1}, absl::Seconds(0) - absl::Microseconds(1)},
1371*9356374aSAndroid Build Coastguard Worker       {{-1, 999999}, absl::Seconds(0) - absl::Microseconds(1)},
1372*9356374aSAndroid Build Coastguard Worker       {{-1, 1}, absl::Seconds(-1) + absl::Microseconds(1)},
1373*9356374aSAndroid Build Coastguard Worker       {{-1, 0}, absl::Seconds(-1) + absl::Microseconds(0)},
1374*9356374aSAndroid Build Coastguard Worker       {{-1, -1}, absl::Seconds(-1) - absl::Microseconds(1)},
1375*9356374aSAndroid Build Coastguard Worker       {{-2, 999999}, absl::Seconds(-1) - absl::Microseconds(1)},
1376*9356374aSAndroid Build Coastguard Worker   };
1377*9356374aSAndroid Build Coastguard Worker   for (const auto& test : from_tv) {
1378*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test.d, absl::DurationFromTimeval(test.tv));
1379*9356374aSAndroid Build Coastguard Worker   }
1380*9356374aSAndroid Build Coastguard Worker }
1381*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,SmallConversions)1382*9356374aSAndroid Build Coastguard Worker TEST(Duration, SmallConversions) {
1383*9356374aSAndroid Build Coastguard Worker   // Special tests for conversions of small durations.
1384*9356374aSAndroid Build Coastguard Worker 
1385*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(0));
1386*9356374aSAndroid Build Coastguard Worker   // TODO(bww): Is the next one OK?
1387*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(std::nextafter(0.125e-9, 0)));
1388*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1) / 4, absl::Seconds(0.125e-9));
1389*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1) / 4, absl::Seconds(0.250e-9));
1390*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1) / 2, absl::Seconds(0.375e-9));
1391*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1) / 2, absl::Seconds(0.500e-9));
1392*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(3) / 4, absl::Seconds(0.625e-9));
1393*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(3) / 4, absl::Seconds(0.750e-9));
1394*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1), absl::Seconds(0.875e-9));
1395*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1), absl::Seconds(1.000e-9));
1396*9356374aSAndroid Build Coastguard Worker 
1397*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(std::nextafter(-0.125e-9, 0)));
1398*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(1) / 4, absl::Seconds(-0.125e-9));
1399*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(1) / 4, absl::Seconds(-0.250e-9));
1400*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(1) / 2, absl::Seconds(-0.375e-9));
1401*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(1) / 2, absl::Seconds(-0.500e-9));
1402*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(3) / 4, absl::Seconds(-0.625e-9));
1403*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(3) / 4, absl::Seconds(-0.750e-9));
1404*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(1), absl::Seconds(-0.875e-9));
1405*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::Nanoseconds(1), absl::Seconds(-1.000e-9));
1406*9356374aSAndroid Build Coastguard Worker 
1407*9356374aSAndroid Build Coastguard Worker   timespec ts;
1408*9356374aSAndroid Build Coastguard Worker   ts.tv_sec = 0;
1409*9356374aSAndroid Build Coastguard Worker   ts.tv_nsec = 0;
1410*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(0)), TimespecMatcher(ts));
1411*9356374aSAndroid Build Coastguard Worker   // TODO(bww): Are the next three OK?
1412*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(1) / 4), TimespecMatcher(ts));
1413*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(2) / 4), TimespecMatcher(ts));
1414*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(3) / 4), TimespecMatcher(ts));
1415*9356374aSAndroid Build Coastguard Worker   ts.tv_nsec = 1;
1416*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(4) / 4), TimespecMatcher(ts));
1417*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(5) / 4), TimespecMatcher(ts));
1418*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(6) / 4), TimespecMatcher(ts));
1419*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(7) / 4), TimespecMatcher(ts));
1420*9356374aSAndroid Build Coastguard Worker   ts.tv_nsec = 2;
1421*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimespec(absl::Nanoseconds(8) / 4), TimespecMatcher(ts));
1422*9356374aSAndroid Build Coastguard Worker 
1423*9356374aSAndroid Build Coastguard Worker   timeval tv;
1424*9356374aSAndroid Build Coastguard Worker   tv.tv_sec = 0;
1425*9356374aSAndroid Build Coastguard Worker   tv.tv_usec = 0;
1426*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimeval(absl::Nanoseconds(0)), TimevalMatcher(tv));
1427*9356374aSAndroid Build Coastguard Worker   // TODO(bww): Is the next one OK?
1428*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimeval(absl::Nanoseconds(999)), TimevalMatcher(tv));
1429*9356374aSAndroid Build Coastguard Worker   tv.tv_usec = 1;
1430*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimeval(absl::Nanoseconds(1000)), TimevalMatcher(tv));
1431*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimeval(absl::Nanoseconds(1999)), TimevalMatcher(tv));
1432*9356374aSAndroid Build Coastguard Worker   tv.tv_usec = 2;
1433*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(ToTimeval(absl::Nanoseconds(2000)), TimevalMatcher(tv));
1434*9356374aSAndroid Build Coastguard Worker }
1435*9356374aSAndroid Build Coastguard Worker 
VerifyApproxSameAsMul(double time_as_seconds,int * const misses)1436*9356374aSAndroid Build Coastguard Worker void VerifyApproxSameAsMul(double time_as_seconds, int* const misses) {
1437*9356374aSAndroid Build Coastguard Worker   auto direct_seconds = absl::Seconds(time_as_seconds);
1438*9356374aSAndroid Build Coastguard Worker   auto mul_by_one_second = time_as_seconds * absl::Seconds(1);
1439*9356374aSAndroid Build Coastguard Worker   // These are expected to differ by up to one tick due to fused multiply/add
1440*9356374aSAndroid Build Coastguard Worker   // contraction.
1441*9356374aSAndroid Build Coastguard Worker   if (absl::AbsDuration(direct_seconds - mul_by_one_second) >
1442*9356374aSAndroid Build Coastguard Worker       absl::time_internal::MakeDuration(0, 1u)) {
1443*9356374aSAndroid Build Coastguard Worker     if (*misses > 10) return;
1444*9356374aSAndroid Build Coastguard Worker     ASSERT_LE(++(*misses), 10) << "Too many errors, not reporting more.";
1445*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(direct_seconds, mul_by_one_second)
1446*9356374aSAndroid Build Coastguard Worker         << "given double time_as_seconds = " << std::setprecision(17)
1447*9356374aSAndroid Build Coastguard Worker         << time_as_seconds;
1448*9356374aSAndroid Build Coastguard Worker   }
1449*9356374aSAndroid Build Coastguard Worker }
1450*9356374aSAndroid Build Coastguard Worker 
1451*9356374aSAndroid Build Coastguard Worker // For a variety of interesting durations, we find the exact point
1452*9356374aSAndroid Build Coastguard Worker // where one double converts to that duration, and the very next double
1453*9356374aSAndroid Build Coastguard Worker // converts to the next duration.  For both of those points, verify that
1454*9356374aSAndroid Build Coastguard Worker // Seconds(point) returns a duration near point * Seconds(1.0). (They may
1455*9356374aSAndroid Build Coastguard Worker // not be exactly equal due to fused multiply/add contraction.)
TEST(Duration,ToDoubleSecondsCheckEdgeCases)1456*9356374aSAndroid Build Coastguard Worker TEST(Duration, ToDoubleSecondsCheckEdgeCases) {
1457*9356374aSAndroid Build Coastguard Worker #if (defined(__i386__) || defined(_M_IX86)) && FLT_EVAL_METHOD != 0
1458*9356374aSAndroid Build Coastguard Worker   // We're using an x87-compatible FPU, and intermediate operations can be
1459*9356374aSAndroid Build Coastguard Worker   // performed with 80-bit floats. This means the edge cases are different than
1460*9356374aSAndroid Build Coastguard Worker   // what we expect here, so just skip this test.
1461*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP()
1462*9356374aSAndroid Build Coastguard Worker       << "Skipping the test because we detected x87 floating-point semantics";
1463*9356374aSAndroid Build Coastguard Worker #endif
1464*9356374aSAndroid Build Coastguard Worker 
1465*9356374aSAndroid Build Coastguard Worker   constexpr uint32_t kTicksPerSecond = absl::time_internal::kTicksPerSecond;
1466*9356374aSAndroid Build Coastguard Worker   constexpr auto duration_tick = absl::time_internal::MakeDuration(0, 1u);
1467*9356374aSAndroid Build Coastguard Worker   int misses = 0;
1468*9356374aSAndroid Build Coastguard Worker   for (int64_t seconds = 0; seconds < 99; ++seconds) {
1469*9356374aSAndroid Build Coastguard Worker     uint32_t tick_vals[] = {0, +999, +999999, +999999999, kTicksPerSecond - 1,
1470*9356374aSAndroid Build Coastguard Worker                             0, 1000, 1000000, 1000000000, kTicksPerSecond,
1471*9356374aSAndroid Build Coastguard Worker                             1, 1001, 1000001, 1000000001, kTicksPerSecond + 1,
1472*9356374aSAndroid Build Coastguard Worker                             2, 1002, 1000002, 1000000002, kTicksPerSecond + 2,
1473*9356374aSAndroid Build Coastguard Worker                             3, 1003, 1000003, 1000000003, kTicksPerSecond + 3,
1474*9356374aSAndroid Build Coastguard Worker                             4, 1004, 1000004, 1000000004, kTicksPerSecond + 4,
1475*9356374aSAndroid Build Coastguard Worker                             5, 6,    7,       8,          9};
1476*9356374aSAndroid Build Coastguard Worker     for (uint32_t ticks : tick_vals) {
1477*9356374aSAndroid Build Coastguard Worker       absl::Duration s_plus_t = absl::Seconds(seconds) + ticks * duration_tick;
1478*9356374aSAndroid Build Coastguard Worker       for (absl::Duration d : {s_plus_t, -s_plus_t}) {
1479*9356374aSAndroid Build Coastguard Worker         absl::Duration after_d = d + duration_tick;
1480*9356374aSAndroid Build Coastguard Worker         EXPECT_NE(d, after_d);
1481*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(after_d - d, duration_tick);
1482*9356374aSAndroid Build Coastguard Worker 
1483*9356374aSAndroid Build Coastguard Worker         double low_edge = ToDoubleSeconds(d);
1484*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(d, absl::Seconds(low_edge));
1485*9356374aSAndroid Build Coastguard Worker 
1486*9356374aSAndroid Build Coastguard Worker         double high_edge = ToDoubleSeconds(after_d);
1487*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(after_d, absl::Seconds(high_edge));
1488*9356374aSAndroid Build Coastguard Worker 
1489*9356374aSAndroid Build Coastguard Worker         for (;;) {
1490*9356374aSAndroid Build Coastguard Worker           double midpoint = low_edge + (high_edge - low_edge) / 2;
1491*9356374aSAndroid Build Coastguard Worker           if (midpoint == low_edge || midpoint == high_edge) break;
1492*9356374aSAndroid Build Coastguard Worker           absl::Duration mid_duration = absl::Seconds(midpoint);
1493*9356374aSAndroid Build Coastguard Worker           if (mid_duration == d) {
1494*9356374aSAndroid Build Coastguard Worker             low_edge = midpoint;
1495*9356374aSAndroid Build Coastguard Worker           } else {
1496*9356374aSAndroid Build Coastguard Worker             EXPECT_EQ(mid_duration, after_d);
1497*9356374aSAndroid Build Coastguard Worker             high_edge = midpoint;
1498*9356374aSAndroid Build Coastguard Worker           }
1499*9356374aSAndroid Build Coastguard Worker         }
1500*9356374aSAndroid Build Coastguard Worker         // Now low_edge is the highest double that converts to Duration d,
1501*9356374aSAndroid Build Coastguard Worker         // and high_edge is the lowest double that converts to Duration after_d.
1502*9356374aSAndroid Build Coastguard Worker         VerifyApproxSameAsMul(low_edge, &misses);
1503*9356374aSAndroid Build Coastguard Worker         VerifyApproxSameAsMul(high_edge, &misses);
1504*9356374aSAndroid Build Coastguard Worker       }
1505*9356374aSAndroid Build Coastguard Worker     }
1506*9356374aSAndroid Build Coastguard Worker   }
1507*9356374aSAndroid Build Coastguard Worker }
1508*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ToDoubleSecondsCheckRandom)1509*9356374aSAndroid Build Coastguard Worker TEST(Duration, ToDoubleSecondsCheckRandom) {
1510*9356374aSAndroid Build Coastguard Worker   std::random_device rd;
1511*9356374aSAndroid Build Coastguard Worker   std::seed_seq seed({rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()});
1512*9356374aSAndroid Build Coastguard Worker   std::mt19937_64 gen(seed);
1513*9356374aSAndroid Build Coastguard Worker   // We want doubles distributed from 1/8ns up to 2^63, where
1514*9356374aSAndroid Build Coastguard Worker   // as many values are tested from 1ns to 2ns as from 1sec to 2sec,
1515*9356374aSAndroid Build Coastguard Worker   // so even distribute along a log-scale of those values, and
1516*9356374aSAndroid Build Coastguard Worker   // exponentiate before using them.  (9.223377e+18 is just slightly
1517*9356374aSAndroid Build Coastguard Worker   // out of bounds for absl::Duration.)
1518*9356374aSAndroid Build Coastguard Worker   std::uniform_real_distribution<double> uniform(std::log(0.125e-9),
1519*9356374aSAndroid Build Coastguard Worker                                                  std::log(9.223377e+18));
1520*9356374aSAndroid Build Coastguard Worker   int misses = 0;
1521*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 1000000; ++i) {
1522*9356374aSAndroid Build Coastguard Worker     double d = std::exp(uniform(gen));
1523*9356374aSAndroid Build Coastguard Worker     VerifyApproxSameAsMul(d, &misses);
1524*9356374aSAndroid Build Coastguard Worker     VerifyApproxSameAsMul(-d, &misses);
1525*9356374aSAndroid Build Coastguard Worker   }
1526*9356374aSAndroid Build Coastguard Worker }
1527*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ConversionSaturation)1528*9356374aSAndroid Build Coastguard Worker TEST(Duration, ConversionSaturation) {
1529*9356374aSAndroid Build Coastguard Worker   absl::Duration d;
1530*9356374aSAndroid Build Coastguard Worker 
1531*9356374aSAndroid Build Coastguard Worker   const auto max_timeval_sec =
1532*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<decltype(timeval::tv_sec)>::max();
1533*9356374aSAndroid Build Coastguard Worker   const auto min_timeval_sec =
1534*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<decltype(timeval::tv_sec)>::min();
1535*9356374aSAndroid Build Coastguard Worker   timeval tv;
1536*9356374aSAndroid Build Coastguard Worker   tv.tv_sec = max_timeval_sec;
1537*9356374aSAndroid Build Coastguard Worker   tv.tv_usec = 999998;
1538*9356374aSAndroid Build Coastguard Worker   d = absl::DurationFromTimeval(tv);
1539*9356374aSAndroid Build Coastguard Worker   tv = ToTimeval(d);
1540*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1541*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(999998, tv.tv_usec);
1542*9356374aSAndroid Build Coastguard Worker   d += absl::Microseconds(1);
1543*9356374aSAndroid Build Coastguard Worker   tv = ToTimeval(d);
1544*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1545*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(999999, tv.tv_usec);
1546*9356374aSAndroid Build Coastguard Worker   d += absl::Microseconds(1);  // no effect
1547*9356374aSAndroid Build Coastguard Worker   tv = ToTimeval(d);
1548*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1549*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(999999, tv.tv_usec);
1550*9356374aSAndroid Build Coastguard Worker 
1551*9356374aSAndroid Build Coastguard Worker   tv.tv_sec = min_timeval_sec;
1552*9356374aSAndroid Build Coastguard Worker   tv.tv_usec = 1;
1553*9356374aSAndroid Build Coastguard Worker   d = absl::DurationFromTimeval(tv);
1554*9356374aSAndroid Build Coastguard Worker   tv = ToTimeval(d);
1555*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1556*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, tv.tv_usec);
1557*9356374aSAndroid Build Coastguard Worker   d -= absl::Microseconds(1);
1558*9356374aSAndroid Build Coastguard Worker   tv = ToTimeval(d);
1559*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1560*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, tv.tv_usec);
1561*9356374aSAndroid Build Coastguard Worker   d -= absl::Microseconds(1);  // no effect
1562*9356374aSAndroid Build Coastguard Worker   tv = ToTimeval(d);
1563*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1564*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, tv.tv_usec);
1565*9356374aSAndroid Build Coastguard Worker 
1566*9356374aSAndroid Build Coastguard Worker   const auto max_timespec_sec =
1567*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<decltype(timespec::tv_sec)>::max();
1568*9356374aSAndroid Build Coastguard Worker   const auto min_timespec_sec =
1569*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<decltype(timespec::tv_sec)>::min();
1570*9356374aSAndroid Build Coastguard Worker   timespec ts;
1571*9356374aSAndroid Build Coastguard Worker   ts.tv_sec = max_timespec_sec;
1572*9356374aSAndroid Build Coastguard Worker   ts.tv_nsec = 999999998;
1573*9356374aSAndroid Build Coastguard Worker   d = absl::DurationFromTimespec(ts);
1574*9356374aSAndroid Build Coastguard Worker   ts = absl::ToTimespec(d);
1575*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1576*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(999999998, ts.tv_nsec);
1577*9356374aSAndroid Build Coastguard Worker   d += absl::Nanoseconds(1);
1578*9356374aSAndroid Build Coastguard Worker   ts = absl::ToTimespec(d);
1579*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1580*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(999999999, ts.tv_nsec);
1581*9356374aSAndroid Build Coastguard Worker   d += absl::Nanoseconds(1);  // no effect
1582*9356374aSAndroid Build Coastguard Worker   ts = absl::ToTimespec(d);
1583*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1584*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(999999999, ts.tv_nsec);
1585*9356374aSAndroid Build Coastguard Worker 
1586*9356374aSAndroid Build Coastguard Worker   ts.tv_sec = min_timespec_sec;
1587*9356374aSAndroid Build Coastguard Worker   ts.tv_nsec = 1;
1588*9356374aSAndroid Build Coastguard Worker   d = absl::DurationFromTimespec(ts);
1589*9356374aSAndroid Build Coastguard Worker   ts = absl::ToTimespec(d);
1590*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1591*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1, ts.tv_nsec);
1592*9356374aSAndroid Build Coastguard Worker   d -= absl::Nanoseconds(1);
1593*9356374aSAndroid Build Coastguard Worker   ts = absl::ToTimespec(d);
1594*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1595*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, ts.tv_nsec);
1596*9356374aSAndroid Build Coastguard Worker   d -= absl::Nanoseconds(1);  // no effect
1597*9356374aSAndroid Build Coastguard Worker   ts = absl::ToTimespec(d);
1598*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1599*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, ts.tv_nsec);
1600*9356374aSAndroid Build Coastguard Worker }
1601*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,FormatDuration)1602*9356374aSAndroid Build Coastguard Worker TEST(Duration, FormatDuration) {
1603*9356374aSAndroid Build Coastguard Worker   // Example from Go's docs.
1604*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("72h3m0.5s",
1605*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Hours(72) + absl::Minutes(3) +
1606*9356374aSAndroid Build Coastguard Worker                                  absl::Milliseconds(500)));
1607*9356374aSAndroid Build Coastguard Worker   // Go's largest time: 2540400h10m10.000000000s
1608*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2540400h10m10s",
1609*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Hours(2540400) + absl::Minutes(10) +
1610*9356374aSAndroid Build Coastguard Worker                                  absl::Seconds(10)));
1611*9356374aSAndroid Build Coastguard Worker 
1612*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("0", absl::FormatDuration(absl::ZeroDuration()));
1613*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("0", absl::FormatDuration(absl::Seconds(0)));
1614*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("0", absl::FormatDuration(absl::Nanoseconds(0)));
1615*9356374aSAndroid Build Coastguard Worker 
1616*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1ns", absl::FormatDuration(absl::Nanoseconds(1)));
1617*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1us", absl::FormatDuration(absl::Microseconds(1)));
1618*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1ms", absl::FormatDuration(absl::Milliseconds(1)));
1619*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1s", absl::FormatDuration(absl::Seconds(1)));
1620*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1m", absl::FormatDuration(absl::Minutes(1)));
1621*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h", absl::FormatDuration(absl::Hours(1)));
1622*9356374aSAndroid Build Coastguard Worker 
1623*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h1m", absl::FormatDuration(absl::Hours(1) + absl::Minutes(1)));
1624*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h1s", absl::FormatDuration(absl::Hours(1) + absl::Seconds(1)));
1625*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1m1s", absl::FormatDuration(absl::Minutes(1) + absl::Seconds(1)));
1626*9356374aSAndroid Build Coastguard Worker 
1627*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h0.25s",
1628*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Hours(1) + absl::Milliseconds(250)));
1629*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1m0.25s",
1630*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Minutes(1) + absl::Milliseconds(250)));
1631*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h1m0.25s",
1632*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Hours(1) + absl::Minutes(1) +
1633*9356374aSAndroid Build Coastguard Worker                                  absl::Milliseconds(250)));
1634*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h0.0005s",
1635*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Hours(1) + absl::Microseconds(500)));
1636*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1h0.0000005s",
1637*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Hours(1) + absl::Nanoseconds(500)));
1638*9356374aSAndroid Build Coastguard Worker 
1639*9356374aSAndroid Build Coastguard Worker   // Subsecond special case.
1640*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.5ns", absl::FormatDuration(absl::Nanoseconds(1) +
1641*9356374aSAndroid Build Coastguard Worker                                           absl::Nanoseconds(1) / 2));
1642*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.25ns", absl::FormatDuration(absl::Nanoseconds(1) +
1643*9356374aSAndroid Build Coastguard Worker                                            absl::Nanoseconds(1) / 4));
1644*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1ns", absl::FormatDuration(absl::Nanoseconds(1) +
1645*9356374aSAndroid Build Coastguard Worker                                         absl::Nanoseconds(1) / 9));
1646*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.2us", absl::FormatDuration(absl::Microseconds(1) +
1647*9356374aSAndroid Build Coastguard Worker                                           absl::Nanoseconds(200)));
1648*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.2ms", absl::FormatDuration(absl::Milliseconds(1) +
1649*9356374aSAndroid Build Coastguard Worker                                           absl::Microseconds(200)));
1650*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.0002ms", absl::FormatDuration(absl::Milliseconds(1) +
1651*9356374aSAndroid Build Coastguard Worker                                              absl::Nanoseconds(200)));
1652*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.00001ms", absl::FormatDuration(absl::Milliseconds(1) +
1653*9356374aSAndroid Build Coastguard Worker                                               absl::Nanoseconds(10)));
1654*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("1.000001ms",
1655*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Milliseconds(1) + absl::Nanoseconds(1)));
1656*9356374aSAndroid Build Coastguard Worker 
1657*9356374aSAndroid Build Coastguard Worker   // Negative durations.
1658*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1ns", absl::FormatDuration(absl::Nanoseconds(-1)));
1659*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1us", absl::FormatDuration(absl::Microseconds(-1)));
1660*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1ms", absl::FormatDuration(absl::Milliseconds(-1)));
1661*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1s", absl::FormatDuration(absl::Seconds(-1)));
1662*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1m", absl::FormatDuration(absl::Minutes(-1)));
1663*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1h", absl::FormatDuration(absl::Hours(-1)));
1664*9356374aSAndroid Build Coastguard Worker 
1665*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1h1m",
1666*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(-(absl::Hours(1) + absl::Minutes(1))));
1667*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1h1s",
1668*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(-(absl::Hours(1) + absl::Seconds(1))));
1669*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1m1s",
1670*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(-(absl::Minutes(1) + absl::Seconds(1))));
1671*9356374aSAndroid Build Coastguard Worker 
1672*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1ns", absl::FormatDuration(absl::Nanoseconds(-1)));
1673*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1.2us", absl::FormatDuration(
1674*9356374aSAndroid Build Coastguard Worker                           -(absl::Microseconds(1) + absl::Nanoseconds(200))));
1675*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1.2ms", absl::FormatDuration(
1676*9356374aSAndroid Build Coastguard Worker                           -(absl::Milliseconds(1) + absl::Microseconds(200))));
1677*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1.0002ms", absl::FormatDuration(-(absl::Milliseconds(1) +
1678*9356374aSAndroid Build Coastguard Worker                                                 absl::Nanoseconds(200))));
1679*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1.00001ms", absl::FormatDuration(-(absl::Milliseconds(1) +
1680*9356374aSAndroid Build Coastguard Worker                                                  absl::Nanoseconds(10))));
1681*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-1.000001ms", absl::FormatDuration(-(absl::Milliseconds(1) +
1682*9356374aSAndroid Build Coastguard Worker                                                   absl::Nanoseconds(1))));
1683*9356374aSAndroid Build Coastguard Worker 
1684*9356374aSAndroid Build Coastguard Worker   //
1685*9356374aSAndroid Build Coastguard Worker   // Interesting corner cases.
1686*9356374aSAndroid Build Coastguard Worker   //
1687*9356374aSAndroid Build Coastguard Worker 
1688*9356374aSAndroid Build Coastguard Worker   const absl::Duration qns = absl::Nanoseconds(1) / 4;
1689*9356374aSAndroid Build Coastguard Worker   const absl::Duration max_dur =
1690*9356374aSAndroid Build Coastguard Worker       absl::Seconds(kint64max) + (absl::Seconds(1) - qns);
1691*9356374aSAndroid Build Coastguard Worker   const absl::Duration min_dur = absl::Seconds(kint64min);
1692*9356374aSAndroid Build Coastguard Worker 
1693*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("0.25ns", absl::FormatDuration(qns));
1694*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-0.25ns", absl::FormatDuration(-qns));
1695*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("2562047788015215h30m7.99999999975s",
1696*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(max_dur));
1697*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-2562047788015215h30m8s", absl::FormatDuration(min_dur));
1698*9356374aSAndroid Build Coastguard Worker 
1699*9356374aSAndroid Build Coastguard Worker   // Tests printing full precision from units that print using FDivDuration
1700*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("55.00000000025s", absl::FormatDuration(absl::Seconds(55) + qns));
1701*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("55.00000025ms",
1702*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(absl::Milliseconds(55) + qns));
1703*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("55.00025us", absl::FormatDuration(absl::Microseconds(55) + qns));
1704*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("55.25ns", absl::FormatDuration(absl::Nanoseconds(55) + qns));
1705*9356374aSAndroid Build Coastguard Worker 
1706*9356374aSAndroid Build Coastguard Worker   // Formatting infinity
1707*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("inf", absl::FormatDuration(absl::InfiniteDuration()));
1708*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-inf", absl::FormatDuration(-absl::InfiniteDuration()));
1709*9356374aSAndroid Build Coastguard Worker 
1710*9356374aSAndroid Build Coastguard Worker   // Formatting approximately +/- 100 billion years
1711*9356374aSAndroid Build Coastguard Worker   const absl::Duration huge_range = ApproxYears(100000000000);
1712*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("876000000000000h", absl::FormatDuration(huge_range));
1713*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-876000000000000h", absl::FormatDuration(-huge_range));
1714*9356374aSAndroid Build Coastguard Worker 
1715*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("876000000000000h0.999999999s",
1716*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(huge_range +
1717*9356374aSAndroid Build Coastguard Worker                                  (absl::Seconds(1) - absl::Nanoseconds(1))));
1718*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("876000000000000h0.9999999995s",
1719*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(
1720*9356374aSAndroid Build Coastguard Worker                 huge_range + (absl::Seconds(1) - absl::Nanoseconds(1) / 2)));
1721*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("876000000000000h0.99999999975s",
1722*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(
1723*9356374aSAndroid Build Coastguard Worker                 huge_range + (absl::Seconds(1) - absl::Nanoseconds(1) / 4)));
1724*9356374aSAndroid Build Coastguard Worker 
1725*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-876000000000000h0.999999999s",
1726*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(-huge_range -
1727*9356374aSAndroid Build Coastguard Worker                                  (absl::Seconds(1) - absl::Nanoseconds(1))));
1728*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-876000000000000h0.9999999995s",
1729*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(
1730*9356374aSAndroid Build Coastguard Worker                 -huge_range - (absl::Seconds(1) - absl::Nanoseconds(1) / 2)));
1731*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ("-876000000000000h0.99999999975s",
1732*9356374aSAndroid Build Coastguard Worker             absl::FormatDuration(
1733*9356374aSAndroid Build Coastguard Worker                 -huge_range - (absl::Seconds(1) - absl::Nanoseconds(1) / 4)));
1734*9356374aSAndroid Build Coastguard Worker }
1735*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,ParseDuration)1736*9356374aSAndroid Build Coastguard Worker TEST(Duration, ParseDuration) {
1737*9356374aSAndroid Build Coastguard Worker   absl::Duration d;
1738*9356374aSAndroid Build Coastguard Worker 
1739*9356374aSAndroid Build Coastguard Worker   // No specified unit. Should only work for zero and infinity.
1740*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("0", &d));
1741*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), d);
1742*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("+0", &d));
1743*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), d);
1744*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-0", &d));
1745*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::ZeroDuration(), d);
1746*9356374aSAndroid Build Coastguard Worker 
1747*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("inf", &d));
1748*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), d);
1749*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("+inf", &d));
1750*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::InfiniteDuration(), d);
1751*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-inf", &d));
1752*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-absl::InfiniteDuration(), d);
1753*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("infBlah", &d));
1754*9356374aSAndroid Build Coastguard Worker 
1755*9356374aSAndroid Build Coastguard Worker   // Illegal input forms.
1756*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("", &d));
1757*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("0.0", &d));
1758*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration(".0", &d));
1759*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration(".", &d));
1760*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("01", &d));
1761*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("1", &d));
1762*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("-1", &d));
1763*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("2", &d));
1764*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("2 s", &d));
1765*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration(".s", &d));
1766*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("-.s", &d));
1767*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("s", &d));
1768*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration(" 2s", &d));
1769*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("2s ", &d));
1770*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration(" 2s ", &d));
1771*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("2mt", &d));
1772*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("1e3s", &d));
1773*9356374aSAndroid Build Coastguard Worker 
1774*9356374aSAndroid Build Coastguard Worker   // One unit type.
1775*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1ns", &d));
1776*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(1), d);
1777*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1us", &d));
1778*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Microseconds(1), d);
1779*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1ms", &d));
1780*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Milliseconds(1), d);
1781*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1s", &d));
1782*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(1), d);
1783*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("2m", &d));
1784*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Minutes(2), d);
1785*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("2h", &d));
1786*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Hours(2), d);
1787*9356374aSAndroid Build Coastguard Worker 
1788*9356374aSAndroid Build Coastguard Worker   // Huge counts of a unit.
1789*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("9223372036854775807us", &d));
1790*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Microseconds(9223372036854775807), d);
1791*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-9223372036854775807us", &d));
1792*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Microseconds(-9223372036854775807), d);
1793*9356374aSAndroid Build Coastguard Worker 
1794*9356374aSAndroid Build Coastguard Worker   // Multiple units.
1795*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("2h3m4s", &d));
1796*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Hours(2) + absl::Minutes(3) + absl::Seconds(4), d);
1797*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("3m4s5us", &d));
1798*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Minutes(3) + absl::Seconds(4) + absl::Microseconds(5), d);
1799*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("2h3m4s5ms6us7ns", &d));
1800*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Hours(2) + absl::Minutes(3) + absl::Seconds(4) +
1801*9356374aSAndroid Build Coastguard Worker                 absl::Milliseconds(5) + absl::Microseconds(6) +
1802*9356374aSAndroid Build Coastguard Worker                 absl::Nanoseconds(7),
1803*9356374aSAndroid Build Coastguard Worker             d);
1804*9356374aSAndroid Build Coastguard Worker 
1805*9356374aSAndroid Build Coastguard Worker   // Multiple units out of order.
1806*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("2us3m4s5h", &d));
1807*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Hours(5) + absl::Minutes(3) + absl::Seconds(4) +
1808*9356374aSAndroid Build Coastguard Worker                 absl::Microseconds(2),
1809*9356374aSAndroid Build Coastguard Worker             d);
1810*9356374aSAndroid Build Coastguard Worker 
1811*9356374aSAndroid Build Coastguard Worker   // Fractional values of units.
1812*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1.5ns", &d));
1813*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5 * absl::Nanoseconds(1), d);
1814*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1.5us", &d));
1815*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5 * absl::Microseconds(1), d);
1816*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1.5ms", &d));
1817*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5 * absl::Milliseconds(1), d);
1818*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1.5s", &d));
1819*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5 * absl::Seconds(1), d);
1820*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1.5m", &d));
1821*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5 * absl::Minutes(1), d);
1822*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("1.5h", &d));
1823*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1.5 * absl::Hours(1), d);
1824*9356374aSAndroid Build Coastguard Worker 
1825*9356374aSAndroid Build Coastguard Worker   // Huge fractional counts of a unit.
1826*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("0.4294967295s", &d));
1827*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(429496729) + absl::Nanoseconds(1) / 2, d);
1828*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("0.429496729501234567890123456789s", &d));
1829*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Nanoseconds(429496729) + absl::Nanoseconds(1) / 2, d);
1830*9356374aSAndroid Build Coastguard Worker 
1831*9356374aSAndroid Build Coastguard Worker   // Negative durations.
1832*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-1s", &d));
1833*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Seconds(-1), d);
1834*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-1m", &d));
1835*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Minutes(-1), d);
1836*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-1h", &d));
1837*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::Hours(-1), d);
1838*9356374aSAndroid Build Coastguard Worker 
1839*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::ParseDuration("-1h2s", &d));
1840*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-(absl::Hours(1) + absl::Seconds(2)), d);
1841*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("1h-2s", &d));
1842*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("-1h-2s", &d));
1843*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::ParseDuration("-1h -2s", &d));
1844*9356374aSAndroid Build Coastguard Worker }
1845*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,FormatParseRoundTrip)1846*9356374aSAndroid Build Coastguard Worker TEST(Duration, FormatParseRoundTrip) {
1847*9356374aSAndroid Build Coastguard Worker #define TEST_PARSE_ROUNDTRIP(d)                \
1848*9356374aSAndroid Build Coastguard Worker   do {                                         \
1849*9356374aSAndroid Build Coastguard Worker     std::string s = absl::FormatDuration(d);   \
1850*9356374aSAndroid Build Coastguard Worker     absl::Duration dur;                        \
1851*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(absl::ParseDuration(s, &dur)); \
1852*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(d, dur);                         \
1853*9356374aSAndroid Build Coastguard Worker   } while (0)
1854*9356374aSAndroid Build Coastguard Worker 
1855*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Nanoseconds(1));
1856*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Microseconds(1));
1857*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Milliseconds(1));
1858*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Seconds(1));
1859*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Minutes(1));
1860*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Hours(1));
1861*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Hours(1) + absl::Nanoseconds(2));
1862*9356374aSAndroid Build Coastguard Worker 
1863*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Nanoseconds(-1));
1864*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Microseconds(-1));
1865*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Milliseconds(-1));
1866*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Seconds(-1));
1867*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Minutes(-1));
1868*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Hours(-1));
1869*9356374aSAndroid Build Coastguard Worker 
1870*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Hours(-1) + absl::Nanoseconds(2));
1871*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Hours(1) + absl::Nanoseconds(-2));
1872*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Hours(-1) + absl::Nanoseconds(-2));
1873*9356374aSAndroid Build Coastguard Worker 
1874*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(absl::Nanoseconds(1) +
1875*9356374aSAndroid Build Coastguard Worker                        absl::Nanoseconds(1) / 4);  // 1.25ns
1876*9356374aSAndroid Build Coastguard Worker 
1877*9356374aSAndroid Build Coastguard Worker   const absl::Duration huge_range = ApproxYears(100000000000);
1878*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(huge_range);
1879*9356374aSAndroid Build Coastguard Worker   TEST_PARSE_ROUNDTRIP(huge_range + (absl::Seconds(1) - absl::Nanoseconds(1)));
1880*9356374aSAndroid Build Coastguard Worker 
1881*9356374aSAndroid Build Coastguard Worker #undef TEST_PARSE_ROUNDTRIP
1882*9356374aSAndroid Build Coastguard Worker }
1883*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,AbslStringify)1884*9356374aSAndroid Build Coastguard Worker TEST(Duration, AbslStringify) {
1885*9356374aSAndroid Build Coastguard Worker   // FormatDuration is already well tested, so just use one test case here to
1886*9356374aSAndroid Build Coastguard Worker   // verify that StrFormat("%v", d) works as expected.
1887*9356374aSAndroid Build Coastguard Worker   absl::Duration d = absl::Seconds(1);
1888*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::StrFormat("%v", d), absl::FormatDuration(d));
1889*9356374aSAndroid Build Coastguard Worker }
1890*9356374aSAndroid Build Coastguard Worker 
TEST(Duration,NoPadding)1891*9356374aSAndroid Build Coastguard Worker TEST(Duration, NoPadding) {
1892*9356374aSAndroid Build Coastguard Worker   // Should match the size of a struct with uint32_t alignment and no padding.
1893*9356374aSAndroid Build Coastguard Worker   using NoPadding = std::array<uint32_t, 3>;
1894*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(NoPadding), sizeof(absl::Duration));
1895*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(alignof(NoPadding), alignof(absl::Duration));
1896*9356374aSAndroid Build Coastguard Worker }
1897*9356374aSAndroid Build Coastguard Worker 
1898*9356374aSAndroid Build Coastguard Worker }  // namespace
1899