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 |