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

Unified Diff: base/numerics/safe_numerics_unittest.cc

Issue 2545253002: Add support for CheckedNumeric Max and Min constexpr functions (Closed)
Patch Set: MakeStrictNum Created 4 years 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
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/numerics/safe_numerics_unittest.cc
diff --git a/base/numerics/safe_numerics_unittest.cc b/base/numerics/safe_numerics_unittest.cc
index f1522ba3800060851fb23686f9010b99bfdbf98c..7d42a8361ec8cf801366c23ff0e452a63b32e77e 100644
--- a/base/numerics/safe_numerics_unittest.cc
+++ b/base/numerics/safe_numerics_unittest.cc
@@ -26,6 +26,8 @@ using base::IsValidForType;
using base::ValueOrDieForType;
using base::ValueOrDefaultForType;
using base::CheckNum;
+using base::CheckMax;
+using base::CheckMin;
using base::CheckAdd;
using base::CheckSub;
using base::CheckMul;
@@ -38,9 +40,9 @@ using base::IsValueInRangeForNumericType;
using base::IsValueNegative;
using base::SizeT;
using base::StrictNumeric;
+using base::MakeStrictNum;
using base::saturated_cast;
using base::strict_cast;
-using base::StrictNumeric;
using base::internal::MaxExponent;
using base::internal::RANGE_VALID;
using base::internal::RANGE_INVALID;
@@ -438,37 +440,63 @@ template <typename Dst, typename Src>
void TestStrictComparison() {
typedef numeric_limits<Dst> DstLimits;
typedef numeric_limits<Src> SrcLimits;
- static_assert(StrictNumeric<Src>(SrcLimits::min()) < DstLimits::max(), "");
- static_assert(StrictNumeric<Src>(SrcLimits::min()) < SrcLimits::max(), "");
- static_assert(!(StrictNumeric<Src>(SrcLimits::min()) >= DstLimits::max()),
+ static_assert(StrictNumeric<Src>(SrcLimits::lowest()) < DstLimits::max(), "");
+ static_assert(StrictNumeric<Src>(SrcLimits::lowest()) < SrcLimits::max(), "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) >= DstLimits::max()),
+ "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) >= SrcLimits::max()),
+ "");
+ static_assert(StrictNumeric<Src>(SrcLimits::lowest()) <= DstLimits::max(),
+ "");
+ static_assert(StrictNumeric<Src>(SrcLimits::lowest()) <= SrcLimits::max(),
+ "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) > DstLimits::max()),
+ "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) > SrcLimits::max()),
"");
- static_assert(!(StrictNumeric<Src>(SrcLimits::min()) >= SrcLimits::max()),
+ static_assert(StrictNumeric<Src>(SrcLimits::max()) > DstLimits::lowest(), "");
+ static_assert(StrictNumeric<Src>(SrcLimits::max()) > SrcLimits::lowest(), "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= DstLimits::lowest()),
"");
- static_assert(StrictNumeric<Src>(SrcLimits::min()) <= DstLimits::max(), "");
- static_assert(StrictNumeric<Src>(SrcLimits::min()) <= SrcLimits::max(), "");
- static_assert(!(StrictNumeric<Src>(SrcLimits::min()) > DstLimits::max()), "");
- static_assert(!(StrictNumeric<Src>(SrcLimits::min()) > SrcLimits::max()), "");
- static_assert(StrictNumeric<Src>(SrcLimits::max()) > DstLimits::min(), "");
- static_assert(StrictNumeric<Src>(SrcLimits::max()) > SrcLimits::min(), "");
- static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= DstLimits::min()),
+ static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= SrcLimits::lowest()),
"");
- static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= SrcLimits::min()),
+ static_assert(StrictNumeric<Src>(SrcLimits::max()) >= DstLimits::lowest(),
+ "");
+ static_assert(StrictNumeric<Src>(SrcLimits::max()) >= SrcLimits::lowest(),
+ "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < DstLimits::lowest()),
+ "");
+ static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < SrcLimits::lowest()),
"");
- static_assert(StrictNumeric<Src>(SrcLimits::max()) >= DstLimits::min(), "");
- static_assert(StrictNumeric<Src>(SrcLimits::max()) >= SrcLimits::min(), "");
- static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < DstLimits::min()), "");
- static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < SrcLimits::min()), "");
static_assert(StrictNumeric<Src>(static_cast<Src>(1)) == static_cast<Dst>(1),
"");
static_assert(StrictNumeric<Src>(static_cast<Src>(1)) != static_cast<Dst>(0),
"");
static_assert(StrictNumeric<Src>(SrcLimits::max()) != static_cast<Dst>(0),
"");
- static_assert(StrictNumeric<Src>(SrcLimits::max()) != DstLimits::min(), "");
+ static_assert(StrictNumeric<Src>(SrcLimits::max()) != DstLimits::lowest(),
+ "");
static_assert(
!(StrictNumeric<Src>(static_cast<Src>(1)) != static_cast<Dst>(1)), "");
static_assert(
!(StrictNumeric<Src>(static_cast<Src>(1)) == static_cast<Dst>(0)), "");
+
+ // Due to differences in float handling between compilers, these aren't
+ // compile-time constants everywhere. So, we use run-time tests.
+ EXPECT_EQ(SrcLimits::max(),
+ CheckNum(SrcLimits::max()).Max(DstLimits::lowest()).ValueOrDie());
+ EXPECT_EQ(DstLimits::max(),
+ CheckNum(SrcLimits::lowest()).Max(DstLimits::max()).ValueOrDie());
+ EXPECT_EQ(DstLimits::lowest(),
+ CheckNum(SrcLimits::max()).Min(DstLimits::lowest()).ValueOrDie());
+ EXPECT_EQ(SrcLimits::lowest(),
+ CheckNum(SrcLimits::lowest()).Min(DstLimits::max()).ValueOrDie());
+ EXPECT_EQ(SrcLimits::lowest(), CheckMin(MakeStrictNum(1), CheckNum(0),
+ DstLimits::max(), SrcLimits::lowest())
+ .ValueOrDie());
+ EXPECT_EQ(DstLimits::max(), CheckMax(MakeStrictNum(1), CheckNum(0),
+ DstLimits::max(), SrcLimits::lowest())
+ .ValueOrDie());
}
template <typename Dst, typename Src>
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698