| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012, Google Inc. All rights reserved. | 2 * Copyright (c) 2012, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "wtf/SaturatedArithmetic.h" | 32 #include "wtf/SaturatedArithmetic.h" |
| 33 | 33 |
| 34 #include <gtest/gtest.h> | 34 #include <gtest/gtest.h> |
| 35 #include <limits.h> | 35 #include <limits.h> |
| 36 | 36 |
| 37 namespace WTF { | 37 namespace WTF { |
| 38 | 38 |
| 39 TEST(SaturatedArithmeticTest, Addition) | 39 TEST(SaturatedArithmeticTest, Addition) { |
| 40 { | 40 EXPECT_EQ(0, saturatedAddition(0, 0)); |
| 41 EXPECT_EQ(0, saturatedAddition(0, 0)); | 41 EXPECT_EQ(1, saturatedAddition(0, 1)); |
| 42 EXPECT_EQ(1, saturatedAddition(0, 1)); | 42 EXPECT_EQ(100, saturatedAddition(0, 100)); |
| 43 EXPECT_EQ(100, saturatedAddition(0, 100)); | 43 EXPECT_EQ(150, saturatedAddition(100, 50)); |
| 44 EXPECT_EQ(150, saturatedAddition(100, 50)); | |
| 45 | 44 |
| 46 EXPECT_EQ(-1, saturatedAddition(0, -1)); | 45 EXPECT_EQ(-1, saturatedAddition(0, -1)); |
| 47 EXPECT_EQ(0, saturatedAddition(1, -1)); | 46 EXPECT_EQ(0, saturatedAddition(1, -1)); |
| 48 EXPECT_EQ(50, saturatedAddition(100, -50)); | 47 EXPECT_EQ(50, saturatedAddition(100, -50)); |
| 49 EXPECT_EQ(-50, saturatedAddition(50, -100)); | 48 EXPECT_EQ(-50, saturatedAddition(50, -100)); |
| 50 | 49 |
| 51 EXPECT_EQ(INT_MAX - 1, saturatedAddition(INT_MAX - 1, 0)); | 50 EXPECT_EQ(INT_MAX - 1, saturatedAddition(INT_MAX - 1, 0)); |
| 52 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 1)); | 51 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 1)); |
| 53 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 2)); | 52 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 2)); |
| 54 EXPECT_EQ(INT_MAX - 1, saturatedAddition(0, INT_MAX - 1)); | 53 EXPECT_EQ(INT_MAX - 1, saturatedAddition(0, INT_MAX - 1)); |
| 55 EXPECT_EQ(INT_MAX, saturatedAddition(1, INT_MAX - 1)); | 54 EXPECT_EQ(INT_MAX, saturatedAddition(1, INT_MAX - 1)); |
| 56 EXPECT_EQ(INT_MAX, saturatedAddition(2, INT_MAX - 1)); | 55 EXPECT_EQ(INT_MAX, saturatedAddition(2, INT_MAX - 1)); |
| 57 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, INT_MAX - 1)); | 56 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, INT_MAX - 1)); |
| 58 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX, INT_MAX)); | 57 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX, INT_MAX)); |
| 59 | 58 |
| 60 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN, 0)); | 59 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN, 0)); |
| 61 EXPECT_EQ(INT_MIN + 1, saturatedAddition(INT_MIN + 1, 0)); | 60 EXPECT_EQ(INT_MIN + 1, saturatedAddition(INT_MIN + 1, 0)); |
| 62 EXPECT_EQ(INT_MIN + 2, saturatedAddition(INT_MIN + 1, 1)); | 61 EXPECT_EQ(INT_MIN + 2, saturatedAddition(INT_MIN + 1, 1)); |
| 63 EXPECT_EQ(INT_MIN + 3, saturatedAddition(INT_MIN + 1, 2)); | 62 EXPECT_EQ(INT_MIN + 3, saturatedAddition(INT_MIN + 1, 2)); |
| 64 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -1)); | 63 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -1)); |
| 65 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -2)); | 64 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -2)); |
| 66 EXPECT_EQ(INT_MIN + 1, saturatedAddition(0, INT_MIN + 1)); | 65 EXPECT_EQ(INT_MIN + 1, saturatedAddition(0, INT_MIN + 1)); |
| 67 EXPECT_EQ(INT_MIN, saturatedAddition(-1, INT_MIN + 1)); | 66 EXPECT_EQ(INT_MIN, saturatedAddition(-1, INT_MIN + 1)); |
| 68 EXPECT_EQ(INT_MIN, saturatedAddition(-2, INT_MIN + 1)); | 67 EXPECT_EQ(INT_MIN, saturatedAddition(-2, INT_MIN + 1)); |
| 69 | 68 |
| 70 EXPECT_EQ(INT_MAX / 2 + 10000, saturatedAddition(INT_MAX / 2, 10000)); | 69 EXPECT_EQ(INT_MAX / 2 + 10000, saturatedAddition(INT_MAX / 2, 10000)); |
| 71 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX / 2 + 1, INT_MAX / 2 + 1)); | 70 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX / 2 + 1, INT_MAX / 2 + 1)); |
| 72 EXPECT_EQ(-1, saturatedAddition(INT_MIN, INT_MAX)); | 71 EXPECT_EQ(-1, saturatedAddition(INT_MIN, INT_MAX)); |
| 73 } | 72 } |
| 74 | 73 |
| 75 TEST(SaturatedArithmeticTest, Subtraction) | 74 TEST(SaturatedArithmeticTest, Subtraction) { |
| 76 { | 75 EXPECT_EQ(0, saturatedSubtraction(0, 0)); |
| 77 EXPECT_EQ(0, saturatedSubtraction(0, 0)); | 76 EXPECT_EQ(-1, saturatedSubtraction(0, 1)); |
| 78 EXPECT_EQ(-1, saturatedSubtraction(0, 1)); | 77 EXPECT_EQ(-100, saturatedSubtraction(0, 100)); |
| 79 EXPECT_EQ(-100, saturatedSubtraction(0, 100)); | 78 EXPECT_EQ(50, saturatedSubtraction(100, 50)); |
| 80 EXPECT_EQ(50, saturatedSubtraction(100, 50)); | |
| 81 | 79 |
| 82 EXPECT_EQ(1, saturatedSubtraction(0, -1)); | 80 EXPECT_EQ(1, saturatedSubtraction(0, -1)); |
| 83 EXPECT_EQ(2, saturatedSubtraction(1, -1)); | 81 EXPECT_EQ(2, saturatedSubtraction(1, -1)); |
| 84 EXPECT_EQ(150, saturatedSubtraction(100, -50)); | 82 EXPECT_EQ(150, saturatedSubtraction(100, -50)); |
| 85 EXPECT_EQ(150, saturatedSubtraction(50, -100)); | 83 EXPECT_EQ(150, saturatedSubtraction(50, -100)); |
| 86 | 84 |
| 87 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, 0)); | 85 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, 0)); |
| 88 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX, 1)); | 86 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX, 1)); |
| 89 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX - 1, 0)); | 87 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX - 1, 0)); |
| 90 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -1)); | 88 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -1)); |
| 91 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -2)); | 89 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -2)); |
| 92 EXPECT_EQ(-INT_MAX + 1, saturatedSubtraction(0, INT_MAX - 1)); | 90 EXPECT_EQ(-INT_MAX + 1, saturatedSubtraction(0, INT_MAX - 1)); |
| 93 EXPECT_EQ(-INT_MAX, saturatedSubtraction(-1, INT_MAX - 1)); | 91 EXPECT_EQ(-INT_MAX, saturatedSubtraction(-1, INT_MAX - 1)); |
| 94 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-2, INT_MAX - 1)); | 92 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-2, INT_MAX - 1)); |
| 95 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-3, INT_MAX - 1)); | 93 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-3, INT_MAX - 1)); |
| 96 | 94 |
| 97 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN, 0)); | 95 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN, 0)); |
| 98 EXPECT_EQ(INT_MIN + 1, saturatedSubtraction(INT_MIN + 1, 0)); | 96 EXPECT_EQ(INT_MIN + 1, saturatedSubtraction(INT_MIN + 1, 0)); |
| 99 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 1)); | 97 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 1)); |
| 100 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 2)); | 98 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 2)); |
| 101 | 99 |
| 102 EXPECT_EQ(0, saturatedSubtraction(INT_MIN, INT_MIN)); | 100 EXPECT_EQ(0, saturatedSubtraction(INT_MIN, INT_MIN)); |
| 103 EXPECT_EQ(0, saturatedSubtraction(INT_MAX, INT_MAX)); | 101 EXPECT_EQ(0, saturatedSubtraction(INT_MAX, INT_MAX)); |
| 104 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, INT_MIN)); | 102 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, INT_MIN)); |
| 105 } | 103 } |
| 106 | 104 |
| 107 TEST(SaturatedArithmeticTest, SetSigned) | 105 TEST(SaturatedArithmeticTest, SetSigned) { |
| 108 { | 106 const int kFractionBits = 6; |
| 109 const int kFractionBits = 6; | 107 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; |
| 110 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; | 108 const int intMinForLayoutUnit = INT_MIN >> kFractionBits; |
| 111 const int intMinForLayoutUnit = INT_MIN >> kFractionBits; | |
| 112 | 109 |
| 113 EXPECT_EQ(0, saturatedSet(0, kFractionBits)); | 110 EXPECT_EQ(0, saturatedSet(0, kFractionBits)); |
| 114 | 111 |
| 115 // Internally the max number we can represent (without saturating) | 112 // Internally the max number we can represent (without saturating) |
| 116 // is all the (non-sign) bits set except for the bottom n fraction bits | 113 // is all the (non-sign) bits set except for the bottom n fraction bits |
| 117 const int maxInternalRepresentation = INT_MAX ^ ((1 << kFractionBits)-1); | 114 const int maxInternalRepresentation = INT_MAX ^ ((1 << kFractionBits) - 1); |
| 118 EXPECT_EQ(maxInternalRepresentation, | 115 EXPECT_EQ(maxInternalRepresentation, |
| 119 saturatedSet(intMaxForLayoutUnit, kFractionBits)); | 116 saturatedSet(intMaxForLayoutUnit, kFractionBits)); |
| 120 | 117 |
| 121 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), | 118 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), |
| 122 saturatedSet(intMaxForLayoutUnit + 100, kFractionBits)); | 119 saturatedSet(intMaxForLayoutUnit + 100, kFractionBits)); |
| 123 | 120 |
| 124 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, | 121 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, |
| 125 saturatedSet(intMaxForLayoutUnit - 100, kFractionBits)); | 122 saturatedSet(intMaxForLayoutUnit - 100, kFractionBits)); |
| 126 | 123 |
| 127 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), | 124 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), |
| 128 saturatedSet(intMinForLayoutUnit, kFractionBits)); | 125 saturatedSet(intMinForLayoutUnit, kFractionBits)); |
| 129 | 126 |
| 130 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), | 127 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), |
| 131 saturatedSet(intMinForLayoutUnit - 100, kFractionBits)); | 128 saturatedSet(intMinForLayoutUnit - 100, kFractionBits)); |
| 132 | 129 |
| 133 // Shifting negative numbers left has undefined behavior, so use | 130 // Shifting negative numbers left has undefined behavior, so use |
| 134 // multiplication instead of direct shifting here. | 131 // multiplication instead of direct shifting here. |
| 135 EXPECT_EQ((intMinForLayoutUnit + 100) * (1 << kFractionBits), | 132 EXPECT_EQ((intMinForLayoutUnit + 100) * (1 << kFractionBits), |
| 136 saturatedSet(intMinForLayoutUnit + 100, kFractionBits)); | 133 saturatedSet(intMinForLayoutUnit + 100, kFractionBits)); |
| 137 } | 134 } |
| 138 | 135 |
| 139 TEST(SaturatedArithmeticTest, SetUnsigned) | 136 TEST(SaturatedArithmeticTest, SetUnsigned) { |
| 140 { | 137 const int kFractionBits = 6; |
| 141 const int kFractionBits = 6; | 138 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; |
| 142 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; | |
| 143 | 139 |
| 144 EXPECT_EQ(0, saturatedSet((unsigned)0, kFractionBits)); | 140 EXPECT_EQ(0, saturatedSet((unsigned)0, kFractionBits)); |
| 145 | 141 |
| 146 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), | 142 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), |
| 147 saturatedSet((unsigned)intMaxForLayoutUnit, kFractionBits)); | 143 saturatedSet((unsigned)intMaxForLayoutUnit, kFractionBits)); |
| 148 | 144 |
| 149 const unsigned kOverflowed = intMaxForLayoutUnit + 100; | 145 const unsigned kOverflowed = intMaxForLayoutUnit + 100; |
| 150 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), | 146 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), |
| 151 saturatedSet(kOverflowed, kFractionBits)); | 147 saturatedSet(kOverflowed, kFractionBits)); |
| 152 | 148 |
| 153 const unsigned kNotOverflowed = intMaxForLayoutUnit - 100; | 149 const unsigned kNotOverflowed = intMaxForLayoutUnit - 100; |
| 154 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, | 150 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, |
| 155 saturatedSet(kNotOverflowed, kFractionBits)); | 151 saturatedSet(kNotOverflowed, kFractionBits)); |
| 156 } | 152 } |
| 157 | 153 |
| 158 } // namespace WTF | 154 } // namespace WTF |
| OLD | NEW |