| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <type_traits> | 9 #include <type_traits> |
| 10 | 10 |
| (...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 | 664 |
| 665 const CheckedNumeric<Dst> checked_dst; | 665 const CheckedNumeric<Dst> checked_dst; |
| 666 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); | 666 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); |
| 667 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); | 667 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); |
| 668 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1)); | 668 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1)); |
| 669 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest()); | 669 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest()); |
| 670 | 670 |
| 671 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); | 671 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); |
| 672 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); | 672 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); |
| 673 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); | 673 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); |
| 674 |
| 675 // Additional saturation tests. |
| 676 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max())); |
| 677 EXPECT_EQ(DstLimits::lowest(), saturated_cast<Dst>(SrcLimits::lowest())); |
| 678 |
| 674 if (SrcLimits::is_iec559) { | 679 if (SrcLimits::is_iec559) { |
| 680 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::quiet_NaN())); |
| 681 |
| 675 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); | 682 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); |
| 676 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); | 683 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); |
| 677 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); | 684 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); |
| 678 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); | 685 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); |
| 679 if (DstLimits::is_integer) { | 686 if (DstLimits::is_integer) { |
| 680 if (SrcLimits::digits < DstLimits::digits) { | 687 if (SrcLimits::digits < DstLimits::digits) { |
| 681 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, | 688 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, |
| 682 static_cast<Src>(DstLimits::max())); | 689 static_cast<Src>(DstLimits::max())); |
| 683 } else { | 690 } else { |
| 684 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); | 691 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 707 TestStrictComparison<Dst, Src>(); | 714 TestStrictComparison<Dst, Src>(); |
| 708 | 715 |
| 709 const CheckedNumeric<Dst> checked_dst; | 716 const CheckedNumeric<Dst> checked_dst; |
| 710 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); | 717 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); |
| 711 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); | 718 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); |
| 712 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest()); | 719 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest()); |
| 713 | 720 |
| 714 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); | 721 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); |
| 715 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); | 722 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); |
| 716 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); | 723 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); |
| 724 |
| 725 // Additional saturation tests. |
| 726 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max())); |
| 727 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::lowest())); |
| 717 } | 728 } |
| 718 }; | 729 }; |
| 719 | 730 |
| 720 // Helper macro to wrap displaying the conversion types and line numbers | 731 // Helper macro to wrap displaying the conversion types and line numbers |
| 721 #define TEST_NUMERIC_CONVERSION(d, s, t) \ | 732 #define TEST_NUMERIC_CONVERSION(d, s, t) \ |
| 722 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__) | 733 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__) |
| 723 | 734 |
| 724 TEST(SafeNumerics, IntMinOperations) { | 735 TEST(SafeNumerics, IntMinOperations) { |
| 725 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); | 736 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); |
| 726 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); | 737 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); | 1105 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); |
| 1095 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); | 1106 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); |
| 1096 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); | 1107 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); |
| 1097 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); | 1108 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); |
| 1098 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); | 1109 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); |
| 1099 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); | 1110 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); |
| 1100 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); | 1111 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); |
| 1101 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); | 1112 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); |
| 1102 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); | 1113 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); |
| 1103 } | 1114 } |
| OLD | NEW |