duration_test.cc 73 KB

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