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 | |
679 if (SrcLimits::is_iec559) { | 674 if (SrcLimits::is_iec559) { |
680 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::quiet_NaN())); | |
681 | |
682 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); | 675 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); |
683 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); | 676 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); |
684 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); | 677 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); |
685 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); | 678 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); |
686 if (DstLimits::is_integer) { | 679 if (DstLimits::is_integer) { |
687 if (SrcLimits::digits < DstLimits::digits) { | 680 if (SrcLimits::digits < DstLimits::digits) { |
688 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, | 681 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, |
689 static_cast<Src>(DstLimits::max())); | 682 static_cast<Src>(DstLimits::max())); |
690 } else { | 683 } else { |
691 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); | 684 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); |
(...skipping 22 matching lines...) Expand all Loading... |
714 TestStrictComparison<Dst, Src>(); | 707 TestStrictComparison<Dst, Src>(); |
715 | 708 |
716 const CheckedNumeric<Dst> checked_dst; | 709 const CheckedNumeric<Dst> checked_dst; |
717 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); | 710 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); |
718 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); | 711 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); |
719 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest()); | 712 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest()); |
720 | 713 |
721 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); | 714 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); |
722 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); | 715 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); |
723 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); | 716 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())); | |
728 } | 717 } |
729 }; | 718 }; |
730 | 719 |
731 // Helper macro to wrap displaying the conversion types and line numbers | 720 // Helper macro to wrap displaying the conversion types and line numbers |
732 #define TEST_NUMERIC_CONVERSION(d, s, t) \ | 721 #define TEST_NUMERIC_CONVERSION(d, s, t) \ |
733 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__) | 722 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__) |
734 | 723 |
735 TEST(SafeNumerics, IntMinOperations) { | 724 TEST(SafeNumerics, IntMinOperations) { |
736 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); | 725 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); |
737 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); | 726 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); | 1094 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); |
1106 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); | 1095 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); |
1107 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); | 1096 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); |
1108 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); | 1097 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); |
1109 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); | 1098 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); |
1110 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); | 1099 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); |
1111 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); | 1100 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); |
1112 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); | 1101 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); |
1113 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); | 1102 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); |
1114 } | 1103 } |
OLD | NEW |