Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3562)

Unified Diff: base/time/time_unittest.cc

Issue 1976703005: Allow constexpr variables of TimeDelta type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: Fix overflow from doubles, and test all the boundaries better. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/time/time_unittest.cc
diff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
index 8a6a7f517728335660c180788cadcd158abcb78a..5b215fbf94525af222d082ebb3b209539e0db2d0 100644
--- a/base/time/time_unittest.cc
+++ b/base/time/time_unittest.cc
@@ -723,16 +723,21 @@ TEST(TimeTicks, SnappedToNextTickOverflow) {
}
TEST(TimeDelta, FromAndIn) {
- EXPECT_TRUE(TimeDelta::FromDays(2) == TimeDelta::FromHours(48));
- EXPECT_TRUE(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180));
- EXPECT_TRUE(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120));
- EXPECT_TRUE(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000));
- EXPECT_TRUE(TimeDelta::FromMilliseconds(2) ==
- TimeDelta::FromMicroseconds(2000));
- EXPECT_TRUE(TimeDelta::FromSecondsD(2.3) ==
- TimeDelta::FromMilliseconds(2300));
- EXPECT_TRUE(TimeDelta::FromMillisecondsD(2.5) ==
- TimeDelta::FromMicroseconds(2500));
+ // static_assert also checks that the contained expression is a constant
+ // expression, meaning all its components are suitable for initializing global
+ // variables.
+ static_assert(TimeDelta::FromDays(2) == TimeDelta::FromHours(48), "");
+ static_assert(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180), "");
+ static_assert(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120), "");
+ static_assert(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000),
+ "");
+ static_assert(
+ TimeDelta::FromMilliseconds(2) == TimeDelta::FromMicroseconds(2000), "");
+ static_assert(
+ TimeDelta::FromSecondsD(2.3) == TimeDelta::FromMilliseconds(2300), "");
+ static_assert(
+ TimeDelta::FromMillisecondsD(2.5) == TimeDelta::FromMicroseconds(2500),
+ "");
EXPECT_EQ(13, TimeDelta::FromDays(13).InDays());
EXPECT_EQ(13, TimeDelta::FromHours(13).InHours());
EXPECT_EQ(13, TimeDelta::FromMinutes(13).InMinutes());
@@ -855,18 +860,26 @@ TEST(TimeDelta, MaxConversions) {
int64_t max_int = std::numeric_limits<int64_t>::max();
+ t = TimeDelta::FromSeconds(max_int / Time::kMicrosecondsPerSecond);
+ EXPECT_FALSE(t.is_max());
t = TimeDelta::FromSeconds(max_int / Time::kMicrosecondsPerSecond + 1);
EXPECT_TRUE(t.is_max());
+ t = TimeDelta::FromMilliseconds(max_int / Time::kMillisecondsPerSecond);
+ EXPECT_FALSE(t.is_max());
t = TimeDelta::FromMilliseconds(max_int / Time::kMillisecondsPerSecond + 1);
EXPECT_TRUE(t.is_max());
t = TimeDelta::FromMicroseconds(max_int);
EXPECT_TRUE(t.is_max());
+ t = TimeDelta::FromSeconds(-max_int / Time::kMicrosecondsPerSecond);
+ EXPECT_FALSE(IsMin(t));
t = TimeDelta::FromSeconds(-max_int / Time::kMicrosecondsPerSecond - 1);
EXPECT_TRUE(IsMin(t));
+ t = TimeDelta::FromMilliseconds(-max_int / Time::kMillisecondsPerSecond);
+ EXPECT_FALSE(IsMin(t));
t = TimeDelta::FromMilliseconds(-max_int / Time::kMillisecondsPerSecond - 1);
EXPECT_TRUE(IsMin(t));
@@ -880,21 +893,35 @@ TEST(TimeDelta, MaxConversions) {
EXPECT_TRUE(t.is_max());
double max_d = max_int;
+ // Converting max_int to double changes its value.
+ EXPECT_EQ(pow(2.0, 63), max_d);
- t = TimeDelta::FromSecondsD(max_d / Time::kMicrosecondsPerSecond + 1);
+ t = TimeDelta::FromSecondsD(max_d / Time::kMicrosecondsPerSecond);
EXPECT_TRUE(t.is_max());
+ t = TimeDelta::FromSecondsD(
+ nexttoward(max_d / Time::kMicrosecondsPerSecond, 0));
+ EXPECT_FALSE(t.is_max());
t = TimeDelta::FromMillisecondsD(std::numeric_limits<double>::infinity());
EXPECT_TRUE(t.is_max());
- t = TimeDelta::FromMillisecondsD(max_d / Time::kMillisecondsPerSecond * 2);
- EXPECT_TRUE(t.is_max());
+ t = TimeDelta::FromMillisecondsD(max_d / Time::kMillisecondsPerSecond);
+ EXPECT_TRUE(t.is_max()) << t;
+ t = TimeDelta::FromMillisecondsD(
+ nexttoward(max_d / Time::kMillisecondsPerSecond, 0));
+ EXPECT_FALSE(t.is_max());
- t = TimeDelta::FromSecondsD(-max_d / Time::kMicrosecondsPerSecond - 1);
+ t = TimeDelta::FromSecondsD(-max_d / Time::kMicrosecondsPerSecond);
EXPECT_TRUE(IsMin(t));
+ t = TimeDelta::FromSecondsD(
+ nexttoward(-max_d / Time::kMicrosecondsPerSecond, 0));
+ EXPECT_FALSE(IsMin(t));
- t = TimeDelta::FromMillisecondsD(-max_d / Time::kMillisecondsPerSecond * 2);
- EXPECT_TRUE(IsMin(t));
+ t = TimeDelta::FromMillisecondsD(-max_d / Time::kMillisecondsPerSecond);
+ EXPECT_TRUE(IsMin(t)) << t;
+ t = TimeDelta::FromMillisecondsD(
+ nexttoward(-max_d / Time::kMillisecondsPerSecond, 0));
+ EXPECT_FALSE(IsMin(t));
}
TEST(TimeDelta, NumericOperators) {

Powered by Google App Engine
This is Rietveld 408576698