diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/decimal_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/decimal_test.cc | 1161 |
1 files changed, 1161 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/decimal_test.cc b/chromium/third_party/blink/renderer/platform/decimal_test.cc new file mode 100644 index 00000000000..8bd321acfe1 --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/decimal_test.cc @@ -0,0 +1,1161 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "third_party/blink/renderer/platform/decimal.h" + +#include <float.h> +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/platform/wtf/math_extras.h" +#include "third_party/blink/renderer/platform/wtf/text/cstring.h" + +namespace blink { + +// Simulate core/html/forms/StepRange +class DecimalStepRange { + public: + Decimal maximum; + Decimal minimum; + Decimal step; + + DecimalStepRange(const Decimal& minimum, + const Decimal& maximum, + const Decimal& step) + : maximum(maximum), minimum(minimum), step(step) {} + + Decimal ClampValue(Decimal value) const { + const Decimal result = minimum + ((value - minimum) / step).Round() * step; + DCHECK(result.IsFinite()); + return result > maximum ? result - step : result; + } +}; + +class DecimalTest : public testing::Test { + protected: + using Sign = Decimal::Sign; + static const Sign kPositive = Decimal::kPositive; + static const Sign kNegative = Decimal::kNegative; + + Decimal Encode(uint64_t coefficient, int exponent, Sign sign) { + return Decimal(sign, exponent, coefficient); + } + + Decimal FromString(const String& string) { + return Decimal::FromString(string); + } + + Decimal StepDown(const String& minimum, + const String& maximum, + const String& step, + const String& value_string, + int number_of_step_times) { + DecimalStepRange step_range(FromString(minimum), FromString(maximum), + FromString(step)); + Decimal value = FromString(value_string); + for (int i = 0; i < number_of_step_times; ++i) { + value -= step_range.step; + value = step_range.ClampValue(value); + } + return value; + } + + Decimal StepUp(const String& minimum, + const String& maximum, + const String& step, + const String& value_string, + int number_of_step_times) { + DecimalStepRange step_range(FromString(minimum), FromString(maximum), + FromString(step)); + Decimal value = FromString(value_string); + for (int i = 0; i < number_of_step_times; ++i) { + value += step_range.step; + value = step_range.ClampValue(value); + } + return value; + } +}; + +// FIXME: We should use expectedSign without "Decimal::", however, g++ causes +// undefined references for DecimalTest::Positive and Negative. +#define EXPECT_DECIMAL_ENCODED_DATA_EQ(expectedCoefficient, expectedExponent, \ + expectedSign, decimal) \ + EXPECT_EQ((expectedCoefficient), (decimal).Value().Coefficient()); \ + EXPECT_EQ((expectedExponent), (decimal).Value().Exponent()); \ + EXPECT_EQ(Decimal::expectedSign, (decimal).Value().GetSign()); + +#define EXPECT_DECIMAL_STREQ(expected, decimal) \ + EXPECT_STREQ((expected), (decimal).ToString().Ascii().data()) + +TEST_F(DecimalTest, Abs) { + EXPECT_EQ(Encode(0, 0, kPositive), Encode(0, 0, kPositive).Abs()); + EXPECT_EQ(Encode(0, 0, kPositive), Encode(0, 0, kNegative).Abs()); + + EXPECT_EQ(Encode(0, 10, kPositive), Encode(0, 10, kPositive).Abs()); + EXPECT_EQ(Encode(0, 10, kPositive), Encode(0, 10, kNegative).Abs()); + + EXPECT_EQ(Encode(0, -10, kPositive), Encode(0, -10, kPositive).Abs()); + EXPECT_EQ(Encode(0, -10, kPositive), Encode(0, -10, kNegative).Abs()); + + EXPECT_EQ(Encode(1, 0, kPositive), Encode(1, 0, kPositive).Abs()); + EXPECT_EQ(Encode(1, 0, kPositive), Encode(1, 0, kNegative).Abs()); + + EXPECT_EQ(Encode(1, 10, kPositive), Encode(1, 10, kPositive).Abs()); + EXPECT_EQ(Encode(1, 10, kPositive), Encode(1, 10, kNegative).Abs()); + + EXPECT_EQ(Encode(1, -10, kPositive), Encode(1, -10, kPositive).Abs()); + EXPECT_EQ(Encode(1, -10, kPositive), Encode(1, -10, kNegative).Abs()); +} + +TEST_F(DecimalTest, AbsBigExponent) { + EXPECT_EQ(Encode(1, 1000, kPositive), Encode(1, 1000, kPositive).Abs()); + EXPECT_EQ(Encode(1, 1000, kPositive), Encode(1, 1000, kNegative).Abs()); +} + +TEST_F(DecimalTest, AbsSmallExponent) { + EXPECT_EQ(Encode(1, -1000, kPositive), Encode(1, -1000, kPositive).Abs()); + EXPECT_EQ(Encode(1, -1000, kPositive), Encode(1, -1000, kNegative).Abs()); +} + +TEST_F(DecimalTest, AbsSpecialValues) { + EXPECT_EQ(Decimal::Infinity(kPositive), Decimal::Infinity(kPositive).Abs()); + EXPECT_EQ(Decimal::Infinity(kPositive), Decimal::Infinity(kNegative).Abs()); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Abs()); +} + +TEST_F(DecimalTest, Add) { + EXPECT_EQ(Encode(0, 0, kPositive), Decimal(0) + Decimal(0)); + EXPECT_EQ(Decimal(1), Decimal(2) + Decimal(-1)); + EXPECT_EQ(Decimal(1), Decimal(-1) + Decimal(2)); + EXPECT_EQ(Encode(100, 0, kPositive), Decimal(99) + Decimal(1)); + EXPECT_EQ(Encode(100, 0, kNegative), Decimal(-50) + Decimal(-50)); + EXPECT_EQ(Encode(UINT64_C(1000000000000000), 35, kPositive), + Encode(1, 50, kPositive) + Decimal(1)); + EXPECT_EQ(Encode(UINT64_C(1000000000000000), 35, kPositive), + Decimal(1) + Encode(1, 50, kPositive)); + EXPECT_EQ(Encode(UINT64_C(10000000001), 0, kPositive), + Encode(1, 10, kPositive) + Decimal(1)); + EXPECT_EQ(Encode(UINT64_C(10000000001), 0, kPositive), + Decimal(1) + Encode(1, 10, kPositive)); + EXPECT_EQ(Encode(1, 0, kPositive), + Encode(1, -1022, kPositive) + Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(2, -1022, kPositive), + Encode(1, -1022, kPositive) + Encode(1, -1022, kPositive)); +} + +TEST_F(DecimalTest, AddBigExponent) { + EXPECT_EQ(Encode(1, 1022, kPositive), + Encode(1, 1022, kPositive) + Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(2, 1022, kPositive), + Encode(1, 1022, kPositive) + Encode(1, 1022, kPositive)); + EXPECT_EQ(Decimal::Infinity(kPositive), + Encode(std::numeric_limits<uint64_t>::max(), 1022, kPositive) + + Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(1, 1022, kPositive), + Encode(1, 1022, kPositive) + Encode(1, -1000, kPositive)); +} + +TEST_F(DecimalTest, AddSmallExponent) { + EXPECT_EQ(Encode(1, 0, kPositive), + Encode(1, -1022, kPositive) + Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(2, -1022, kPositive), + Encode(1, -1022, kPositive) + Encode(1, -1022, kPositive)); +} + +TEST_F(DecimalTest, AddSpecialValues) { + const Decimal infinity(Decimal::Infinity(kPositive)); + const Decimal minus_infinity(Decimal::Infinity(kNegative)); + const Decimal na_n(Decimal::Nan()); + const Decimal ten(10); + + EXPECT_EQ(infinity, infinity + infinity); + EXPECT_EQ(na_n, infinity + minus_infinity); + EXPECT_EQ(na_n, minus_infinity + infinity); + EXPECT_EQ(minus_infinity, minus_infinity + minus_infinity); + + EXPECT_EQ(infinity, infinity + ten); + EXPECT_EQ(infinity, ten + infinity); + EXPECT_EQ(minus_infinity, minus_infinity + ten); + EXPECT_EQ(minus_infinity, ten + minus_infinity); + + EXPECT_EQ(na_n, na_n + na_n); + EXPECT_EQ(na_n, na_n + ten); + EXPECT_EQ(na_n, ten + na_n); + + EXPECT_EQ(na_n, na_n - infinity); + EXPECT_EQ(na_n, na_n - minus_infinity); + EXPECT_EQ(na_n, infinity - na_n); + EXPECT_EQ(na_n, minus_infinity - na_n); +} + +TEST_F(DecimalTest, Ceil) { + EXPECT_EQ(Decimal(1), Decimal(1).Ceil()); + EXPECT_EQ(Decimal(1), Encode(1, -10, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(11, -1, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(13, -1, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(15, -1, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(19, -1, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(151, -2, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(101, -2, kPositive).Ceil()); + EXPECT_EQ(Decimal(1), Encode(199, -3, kPositive).Ceil()); + EXPECT_EQ(Decimal(2), Encode(199, -2, kPositive).Ceil()); + EXPECT_EQ(Decimal(3), Encode(209, -2, kPositive).Ceil()); + + EXPECT_EQ(Decimal(-1), Decimal(-1).Ceil()); + EXPECT_EQ(Decimal(0), Encode(1, -10, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(11, -1, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(13, -1, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(15, -1, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(19, -1, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(151, -2, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(101, -2, kNegative).Ceil()); + EXPECT_EQ(Decimal(0), Encode(199, -3, kNegative).Ceil()); + EXPECT_EQ(Decimal(-1), Encode(199, -2, kNegative).Ceil()); + EXPECT_EQ(Decimal(-2), Encode(209, -2, kNegative).Ceil()); + EXPECT_EQ(Decimal(1), + Encode(UINT64_C(123456789012345678), -18, kPositive).Ceil()); +} + +TEST_F(DecimalTest, CeilingBigExponent) { + EXPECT_EQ(Encode(1, 1000, kPositive), Encode(1, 1000, kPositive).Ceil()); + EXPECT_EQ(Encode(1, 1000, kNegative), Encode(1, 1000, kNegative).Ceil()); +} + +TEST_F(DecimalTest, CeilingSmallExponent) { + EXPECT_EQ(Encode(1, 0, kPositive), Encode(1, -1000, kPositive).Ceil()); + EXPECT_EQ(Encode(0, 0, kNegative), Encode(1, -1000, kNegative).Ceil()); +} + +TEST_F(DecimalTest, CeilingSpecialValues) { + EXPECT_EQ(Decimal::Infinity(kPositive), Decimal::Infinity(kPositive).Ceil()); + EXPECT_EQ(Decimal::Infinity(kNegative), Decimal::Infinity(kNegative).Ceil()); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Ceil()); +} + +TEST_F(DecimalTest, Compare) { + EXPECT_TRUE(Decimal(0) == Decimal(0)); + EXPECT_TRUE(Decimal(0) != Decimal(1)); + EXPECT_TRUE(Decimal(0) < Decimal(1)); + EXPECT_TRUE(Decimal(0) <= Decimal(0)); + EXPECT_TRUE(Decimal(0) > Decimal(-1)); + EXPECT_TRUE(Decimal(0) >= Decimal(0)); + + EXPECT_FALSE(Decimal(1) == Decimal(2)); + EXPECT_FALSE(Decimal(1) != Decimal(1)); + EXPECT_FALSE(Decimal(1) < Decimal(0)); + EXPECT_FALSE(Decimal(1) <= Decimal(0)); + EXPECT_FALSE(Decimal(1) > Decimal(2)); + EXPECT_FALSE(Decimal(1) >= Decimal(2)); +} + +TEST_F(DecimalTest, CompareBigExponent) { + EXPECT_TRUE(Encode(1, 1000, kPositive) == Encode(1, 1000, kPositive)); + EXPECT_FALSE(Encode(1, 1000, kPositive) != Encode(1, 1000, kPositive)); + EXPECT_FALSE(Encode(1, 1000, kPositive) < Encode(1, 1000, kPositive)); + EXPECT_TRUE(Encode(1, 1000, kPositive) <= Encode(1, 1000, kPositive)); + EXPECT_FALSE(Encode(1, 1000, kPositive) > Encode(1, 1000, kPositive)); + EXPECT_TRUE(Encode(1, 1000, kPositive) >= Encode(1, 1000, kPositive)); + + EXPECT_TRUE(Encode(1, 1000, kNegative) == Encode(1, 1000, kNegative)); + EXPECT_FALSE(Encode(1, 1000, kNegative) != Encode(1, 1000, kNegative)); + EXPECT_FALSE(Encode(1, 1000, kNegative) < Encode(1, 1000, kNegative)); + EXPECT_TRUE(Encode(1, 1000, kNegative) <= Encode(1, 1000, kNegative)); + EXPECT_FALSE(Encode(1, 1000, kNegative) > Encode(1, 1000, kNegative)); + EXPECT_TRUE(Encode(1, 1000, kNegative) >= Encode(1, 1000, kNegative)); + + EXPECT_FALSE(Encode(2, 1000, kPositive) == Encode(1, 1000, kPositive)); + EXPECT_TRUE(Encode(2, 1000, kPositive) != Encode(1, 1000, kPositive)); + EXPECT_FALSE(Encode(2, 1000, kPositive) < Encode(1, 1000, kPositive)); + EXPECT_FALSE(Encode(2, 1000, kPositive) <= Encode(1, 1000, kPositive)); + EXPECT_TRUE(Encode(2, 1000, kPositive) > Encode(1, 1000, kPositive)); + EXPECT_TRUE(Encode(2, 1000, kPositive) >= Encode(1, 1000, kPositive)); + + EXPECT_FALSE(Encode(2, 1000, kNegative) == Encode(1, 1000, kNegative)); + EXPECT_TRUE(Encode(2, 1000, kNegative) != Encode(1, 1000, kNegative)); + EXPECT_TRUE(Encode(2, 1000, kNegative) < Encode(1, 1000, kNegative)); + EXPECT_TRUE(Encode(2, 1000, kNegative) <= Encode(1, 1000, kNegative)); + EXPECT_FALSE(Encode(2, 1000, kNegative) > Encode(1, 1000, kNegative)); + EXPECT_FALSE(Encode(2, 1000, kNegative) >= Encode(1, 1000, kNegative)); +} + +TEST_F(DecimalTest, CompareSmallExponent) { + EXPECT_TRUE(Encode(1, -1000, kPositive) == Encode(1, -1000, kPositive)); + EXPECT_FALSE(Encode(1, -1000, kPositive) != Encode(1, -1000, kPositive)); + EXPECT_FALSE(Encode(1, -1000, kPositive) < Encode(1, -1000, kPositive)); + EXPECT_TRUE(Encode(1, -1000, kPositive) <= Encode(1, -1000, kPositive)); + EXPECT_FALSE(Encode(1, -1000, kPositive) > Encode(1, -1000, kPositive)); + EXPECT_TRUE(Encode(1, -1000, kPositive) >= Encode(1, -1000, kPositive)); + + EXPECT_TRUE(Encode(1, -1000, kNegative) == Encode(1, -1000, kNegative)); + EXPECT_FALSE(Encode(1, -1000, kNegative) != Encode(1, -1000, kNegative)); + EXPECT_FALSE(Encode(1, -1000, kNegative) < Encode(1, -1000, kNegative)); + EXPECT_TRUE(Encode(1, -1000, kNegative) <= Encode(1, -1000, kNegative)); + EXPECT_FALSE(Encode(1, -1000, kNegative) > Encode(1, -1000, kNegative)); + EXPECT_TRUE(Encode(1, -1000, kNegative) >= Encode(1, -1000, kNegative)); + + EXPECT_FALSE(Encode(2, -1000, kPositive) == Encode(1, -1000, kPositive)); + EXPECT_TRUE(Encode(2, -1000, kPositive) != Encode(1, -1000, kPositive)); + EXPECT_FALSE(Encode(2, -1000, kPositive) < Encode(1, -1000, kPositive)); + EXPECT_FALSE(Encode(2, -1000, kPositive) <= Encode(1, -1000, kPositive)); + EXPECT_TRUE(Encode(2, -1000, kPositive) > Encode(1, -1000, kPositive)); + EXPECT_TRUE(Encode(2, -1000, kPositive) >= Encode(1, -1000, kPositive)); + + EXPECT_FALSE(Encode(2, -1000, kNegative) == Encode(1, -1000, kNegative)); + EXPECT_TRUE(Encode(2, -1000, kNegative) != Encode(1, -1000, kNegative)); + EXPECT_TRUE(Encode(2, -1000, kNegative) < Encode(1, -1000, kNegative)); + EXPECT_TRUE(Encode(2, -1000, kNegative) <= Encode(1, -1000, kNegative)); + EXPECT_FALSE(Encode(2, -1000, kNegative) > Encode(1, -1000, kNegative)); + EXPECT_FALSE(Encode(2, -1000, kNegative) >= Encode(1, -1000, kNegative)); +} + +TEST_F(DecimalTest, CompareSpecialValues) { + const Decimal infinity(Decimal::Infinity(kPositive)); + const Decimal minus_infinity(Decimal::Infinity(kNegative)); + const Decimal na_n(Decimal::Nan()); + const Decimal zero(Decimal::Zero(kPositive)); + const Decimal minus_zero(Decimal::Zero(kNegative)); + const Decimal ten(10); + + EXPECT_TRUE(zero == zero); + EXPECT_FALSE(zero != zero); + EXPECT_FALSE(zero < zero); + EXPECT_TRUE(zero <= zero); + EXPECT_FALSE(zero > zero); + EXPECT_TRUE(zero >= zero); + + EXPECT_TRUE(zero == minus_zero); + EXPECT_FALSE(zero != minus_zero); + EXPECT_FALSE(zero < minus_zero); + EXPECT_TRUE(zero <= minus_zero); + EXPECT_FALSE(zero > minus_zero); + EXPECT_TRUE(zero >= minus_zero); + + EXPECT_TRUE(minus_zero == zero); + EXPECT_FALSE(minus_zero != zero); + EXPECT_FALSE(minus_zero < zero); + EXPECT_TRUE(minus_zero <= zero); + EXPECT_FALSE(minus_zero > zero); + EXPECT_TRUE(minus_zero >= zero); + + EXPECT_TRUE(minus_zero == minus_zero); + EXPECT_FALSE(minus_zero != minus_zero); + EXPECT_FALSE(minus_zero < minus_zero); + EXPECT_TRUE(minus_zero <= minus_zero); + EXPECT_FALSE(minus_zero > minus_zero); + EXPECT_TRUE(minus_zero >= minus_zero); + + EXPECT_TRUE(infinity == infinity); + EXPECT_FALSE(infinity != infinity); + EXPECT_FALSE(infinity < infinity); + EXPECT_TRUE(infinity <= infinity); + EXPECT_FALSE(infinity > infinity); + EXPECT_TRUE(infinity >= infinity); + + EXPECT_FALSE(infinity == ten); + EXPECT_TRUE(infinity != ten); + EXPECT_FALSE(infinity < ten); + EXPECT_FALSE(infinity <= ten); + EXPECT_TRUE(infinity > ten); + EXPECT_TRUE(infinity >= ten); + + EXPECT_FALSE(infinity == minus_infinity); + EXPECT_TRUE(infinity != minus_infinity); + EXPECT_FALSE(infinity < minus_infinity); + EXPECT_FALSE(infinity <= minus_infinity); + EXPECT_TRUE(infinity > minus_infinity); + EXPECT_TRUE(infinity >= minus_infinity); + + EXPECT_FALSE(infinity == na_n); + EXPECT_FALSE(infinity != na_n); + EXPECT_FALSE(infinity < na_n); + EXPECT_FALSE(infinity <= na_n); + EXPECT_FALSE(infinity > na_n); + EXPECT_FALSE(infinity >= na_n); + + EXPECT_FALSE(minus_infinity == infinity); + EXPECT_TRUE(minus_infinity != infinity); + EXPECT_TRUE(minus_infinity < infinity); + EXPECT_TRUE(minus_infinity <= infinity); + EXPECT_FALSE(minus_infinity > infinity); + EXPECT_FALSE(minus_infinity >= infinity); + + EXPECT_FALSE(minus_infinity == ten); + EXPECT_TRUE(minus_infinity != ten); + EXPECT_TRUE(minus_infinity < ten); + EXPECT_TRUE(minus_infinity <= ten); + EXPECT_FALSE(minus_infinity > ten); + EXPECT_FALSE(minus_infinity >= ten); + + EXPECT_TRUE(minus_infinity == minus_infinity); + EXPECT_FALSE(minus_infinity != minus_infinity); + EXPECT_FALSE(minus_infinity < minus_infinity); + EXPECT_TRUE(minus_infinity <= minus_infinity); + EXPECT_FALSE(minus_infinity > minus_infinity); + EXPECT_TRUE(minus_infinity >= minus_infinity); + + EXPECT_FALSE(minus_infinity == na_n); + EXPECT_FALSE(minus_infinity != na_n); + EXPECT_FALSE(minus_infinity < na_n); + EXPECT_FALSE(minus_infinity <= na_n); + EXPECT_FALSE(minus_infinity > na_n); + EXPECT_FALSE(minus_infinity >= na_n); + + EXPECT_FALSE(na_n == infinity); + EXPECT_FALSE(na_n != infinity); + EXPECT_FALSE(na_n < infinity); + EXPECT_FALSE(na_n <= infinity); + EXPECT_FALSE(na_n > infinity); + EXPECT_FALSE(na_n >= infinity); + + EXPECT_FALSE(na_n == ten); + EXPECT_FALSE(na_n != ten); + EXPECT_FALSE(na_n < ten); + EXPECT_FALSE(na_n <= ten); + EXPECT_FALSE(na_n > ten); + EXPECT_FALSE(na_n >= ten); + + EXPECT_FALSE(na_n == minus_infinity); + EXPECT_FALSE(na_n != minus_infinity); + EXPECT_FALSE(na_n < minus_infinity); + EXPECT_FALSE(na_n <= minus_infinity); + EXPECT_FALSE(na_n > minus_infinity); + EXPECT_FALSE(na_n >= minus_infinity); + + EXPECT_TRUE(na_n == na_n); + EXPECT_FALSE(na_n != na_n); + EXPECT_FALSE(na_n < na_n); + EXPECT_TRUE(na_n <= na_n); + EXPECT_FALSE(na_n > na_n); + EXPECT_TRUE(na_n >= na_n); +} + +TEST_F(DecimalTest, Constructor) { + EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, kPositive, Encode(0, 0, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, kNegative, Encode(0, 0, kNegative)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, kPositive, Encode(1, 0, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, kNegative, Encode(1, 0, kNegative)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, kPositive, + Encode(1, 1022, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, kNegative, + Encode(1, 1022, kNegative)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, kPositive, + Encode(1, 1023, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, kNegative, + Encode(1, 1023, kNegative)); + EXPECT_TRUE(Encode(1, 2000, kPositive).IsInfinity()); + EXPECT_TRUE(Encode(1, 2000, kNegative).IsInfinity()); + EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, kPositive, Encode(1, -2000, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, kNegative, Encode(1, -2000, kNegative)); + EXPECT_DECIMAL_ENCODED_DATA_EQ( + UINT64_C(99999999999999998), 0, kPositive, + Encode(UINT64_C(99999999999999998), 0, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ( + UINT64_C(99999999999999998), 0, kNegative, + Encode(UINT64_C(99999999999999998), 0, kNegative)); + EXPECT_DECIMAL_ENCODED_DATA_EQ( + UINT64_C(99999999999999999), 0, kPositive, + Encode(UINT64_C(99999999999999999), 0, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ( + UINT64_C(99999999999999999), 0, kNegative, + Encode(UINT64_C(99999999999999999), 0, kNegative)); + EXPECT_DECIMAL_ENCODED_DATA_EQ( + UINT64_C(100000000000000000), 0, kPositive, + Encode(UINT64_C(100000000000000000), 0, kPositive)); + EXPECT_DECIMAL_ENCODED_DATA_EQ( + UINT64_C(100000000000000000), 0, kNegative, + Encode(UINT64_C(100000000000000000), 0, kNegative)); +} + +TEST_F(DecimalTest, Division) { + EXPECT_EQ(Encode(0, 0, kPositive), Decimal(0) / Decimal(1)); + EXPECT_EQ(Encode(2, 0, kNegative), Decimal(2) / Decimal(-1)); + EXPECT_EQ(Encode(5, -1, kNegative), Decimal(-1) / Decimal(2)); + EXPECT_EQ(Encode(99, 0, kPositive), Decimal(99) / Decimal(1)); + EXPECT_EQ(Decimal(1), Decimal(-50) / Decimal(-50)); + EXPECT_EQ(Encode(UINT64_C(333333333333333333), -18, kPositive), + Decimal(1) / Decimal(3)); + EXPECT_EQ(Encode(UINT64_C(12345678901234), -1, kPositive), + Encode(UINT64_C(12345678901234), 0, kPositive) / Decimal(10)); + EXPECT_EQ(Encode(UINT64_C(500005000050000500), -18, kPositive), + Decimal(50000) / Decimal(99999)); +} + +TEST_F(DecimalTest, DivisionBigExponent) { + EXPECT_EQ(Encode(1, 1022, kPositive), + Encode(1, 1022, kPositive) / Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(1, 0, kPositive), + Encode(1, 1022, kPositive) / Encode(1, 1022, kPositive)); + EXPECT_EQ(Decimal::Infinity(kPositive), + Encode(1, 1022, kPositive) / Encode(1, -1000, kPositive)); +} + +TEST_F(DecimalTest, DivisionSmallExponent) { + EXPECT_EQ(Encode(1, -1022, kPositive), + Encode(1, -1022, kPositive) / Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(1, 0, kPositive), + Encode(1, -1022, kPositive) / Encode(1, -1022, kPositive)); +} + +TEST_F(DecimalTest, DivisionSpecialValues) { + const Decimal infinity(Decimal::Infinity(kPositive)); + const Decimal minus_infinity(Decimal::Infinity(kNegative)); + const Decimal na_n(Decimal::Nan()); + const Decimal zero(Decimal::Zero(kPositive)); + const Decimal minus_zero(Decimal::Zero(kNegative)); + const Decimal ten(10); + const Decimal minus_ten(-10); + + EXPECT_EQ(na_n, zero / zero); + EXPECT_EQ(na_n, zero / minus_zero); + EXPECT_EQ(na_n, minus_zero / zero); + EXPECT_EQ(na_n, minus_zero / minus_zero); + + EXPECT_EQ(infinity, ten / zero); + EXPECT_EQ(minus_infinity, ten / minus_zero); + EXPECT_EQ(minus_infinity, minus_ten / zero); + EXPECT_EQ(infinity, minus_ten / minus_zero); + + EXPECT_EQ(infinity, infinity / zero); + EXPECT_EQ(minus_infinity, infinity / minus_zero); + EXPECT_EQ(minus_infinity, minus_infinity / zero); + EXPECT_EQ(infinity, minus_infinity / minus_zero); + + EXPECT_EQ(na_n, infinity / infinity); + EXPECT_EQ(na_n, infinity / minus_infinity); + EXPECT_EQ(na_n, minus_infinity / infinity); + EXPECT_EQ(na_n, minus_infinity / minus_infinity); + + EXPECT_EQ(zero, ten / infinity); + EXPECT_EQ(minus_zero, ten / minus_infinity); + EXPECT_EQ(minus_zero, minus_ten / infinity); + EXPECT_EQ(zero, minus_ten / minus_infinity); + + EXPECT_EQ(na_n, na_n / na_n); + EXPECT_EQ(na_n, na_n / ten); + EXPECT_EQ(na_n, ten / na_n); + + EXPECT_EQ(na_n, na_n / infinity); + EXPECT_EQ(na_n, na_n / minus_infinity); + EXPECT_EQ(na_n, infinity / na_n); + EXPECT_EQ(na_n, minus_infinity / na_n); +} + +TEST_F(DecimalTest, EncodedData) { + EXPECT_EQ(Encode(0, 0, kPositive), Encode(0, 0, kPositive)); + EXPECT_EQ(Encode(0, 0, kNegative), Encode(0, 0, kNegative)); + EXPECT_EQ(Decimal(1), Decimal(1)); + EXPECT_EQ(Encode(1, 0, kNegative), Encode(1, 0, kNegative)); + EXPECT_EQ(Decimal::Infinity(kPositive), Encode(1, 2000, kPositive)); + EXPECT_EQ(Decimal::Zero(kPositive), Encode(1, -2000, kPositive)); +} + +TEST_F(DecimalTest, Floor) { + EXPECT_EQ(Decimal(1), Decimal(1).Floor()); + EXPECT_EQ(Decimal(0), Encode(1, -10, kPositive).Floor()); + EXPECT_EQ(Decimal(1), Encode(11, -1, kPositive).Floor()); + EXPECT_EQ(Decimal(1), Encode(13, -1, kPositive).Floor()); + EXPECT_EQ(Decimal(1), Encode(15, -1, kPositive).Floor()); + EXPECT_EQ(Decimal(1), Encode(19, -1, kPositive).Floor()); + EXPECT_EQ(Decimal(1), Encode(193332, -5, kPositive).Floor()); + EXPECT_EQ(Decimal(12), Encode(12002, -3, kPositive).Floor()); + + EXPECT_EQ(Decimal(-1), Decimal(-1).Floor()); + EXPECT_EQ(Decimal(-1), Encode(1, -10, kNegative).Floor()); + EXPECT_EQ(Decimal(-2), Encode(11, -1, kNegative).Floor()); + EXPECT_EQ(Decimal(-2), Encode(13, -1, kNegative).Floor()); + EXPECT_EQ(Decimal(-2), Encode(15, -1, kNegative).Floor()); + EXPECT_EQ(Decimal(-2), Encode(19, -1, kNegative).Floor()); + EXPECT_EQ(Decimal(-2), Encode(193332, -5, kNegative).Floor()); + EXPECT_EQ(Decimal(-13), Encode(12002, -3, kNegative).Floor()); + + // crbug.com/572769 + EXPECT_EQ(Decimal(-1), Encode(992971299197409433, -18, kNegative).Floor()); +} + +TEST_F(DecimalTest, FloorBigExponent) { + EXPECT_EQ(Encode(1, 1000, kPositive), Encode(1, 1000, kPositive).Floor()); + EXPECT_EQ(Encode(1, 1000, kNegative), Encode(1, 1000, kNegative).Floor()); +} + +TEST_F(DecimalTest, FloorSmallExponent) { + EXPECT_EQ(Encode(0, 0, kPositive), Encode(1, -1000, kPositive).Floor()); + EXPECT_EQ(Encode(1, 0, kNegative), Encode(1, -1000, kNegative).Floor()); +} + +TEST_F(DecimalTest, FloorSpecialValues) { + EXPECT_EQ(Decimal::Infinity(kPositive), Decimal::Infinity(kPositive).Floor()); + EXPECT_EQ(Decimal::Infinity(kNegative), Decimal::Infinity(kNegative).Floor()); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Floor()); +} + +TEST_F(DecimalTest, FromDouble) { + EXPECT_EQ(Encode(0, 0, kPositive), Decimal::FromDouble(0.0)); + EXPECT_EQ(Encode(0, 0, kNegative), Decimal::FromDouble(-0.0)); + EXPECT_EQ(Encode(1, 0, kPositive), Decimal::FromDouble(1)); + EXPECT_EQ(Encode(1, 0, kNegative), Decimal::FromDouble(-1)); + EXPECT_EQ(Encode(123, 0, kPositive), Decimal::FromDouble(123)); + EXPECT_EQ(Encode(123, 0, kNegative), Decimal::FromDouble(-123)); + EXPECT_EQ(Encode(1, -1, kPositive), Decimal::FromDouble(0.1)); + EXPECT_EQ(Encode(1, -1, kNegative), Decimal::FromDouble(-0.1)); +} + +TEST_F(DecimalTest, FromDoubleLimits) { + EXPECT_EQ(Encode(UINT64_C(2220446049250313), -31, kPositive), + Decimal::FromDouble(std::numeric_limits<double>::epsilon())); + EXPECT_EQ(Encode(UINT64_C(2220446049250313), -31, kNegative), + Decimal::FromDouble(-std::numeric_limits<double>::epsilon())); + EXPECT_EQ(Encode(UINT64_C(17976931348623157), 292, kPositive), + Decimal::FromDouble(std::numeric_limits<double>::max())); + EXPECT_EQ(Encode(UINT64_C(17976931348623157), 292, kNegative), + Decimal::FromDouble(-std::numeric_limits<double>::max())); + EXPECT_EQ(Encode(UINT64_C(22250738585072014), -324, kPositive), + Decimal::FromDouble(std::numeric_limits<double>::min())); + EXPECT_EQ(Encode(UINT64_C(22250738585072014), -324, kNegative), + Decimal::FromDouble(-std::numeric_limits<double>::min())); + EXPECT_TRUE(Decimal::FromDouble(std::numeric_limits<double>::infinity()) + .IsInfinity()); + EXPECT_TRUE(Decimal::FromDouble(-std::numeric_limits<double>::infinity()) + .IsInfinity()); + EXPECT_TRUE( + Decimal::FromDouble(std::numeric_limits<double>::quiet_NaN()).IsNaN()); + EXPECT_TRUE( + Decimal::FromDouble(-std::numeric_limits<double>::quiet_NaN()).IsNaN()); +} + +TEST_F(DecimalTest, FromInt32) { + EXPECT_EQ(Encode(0, 0, kPositive), Decimal(0)); + EXPECT_EQ(Encode(1, 0, kPositive), Decimal(1)); + EXPECT_EQ(Encode(1, 0, kNegative), Decimal(-1)); + EXPECT_EQ(Encode(100, 0, kPositive), Decimal(100)); + EXPECT_EQ(Encode(100, 0, kNegative), Decimal(-100)); + EXPECT_EQ(Encode(0x7FFFFFFF, 0, kPositive), + Decimal(std::numeric_limits<int32_t>::max())); + EXPECT_EQ(Encode(0x80000000u, 0, kNegative), + Decimal(std::numeric_limits<int32_t>::min())); +} + +TEST_F(DecimalTest, FromString) { + EXPECT_EQ(Encode(0, 0, kPositive), FromString("0")); + EXPECT_EQ(Encode(0, 0, kNegative), FromString("-0")); + EXPECT_EQ(Decimal(1), FromString("1")); + EXPECT_EQ(Encode(1, 0, kNegative), FromString("-1")); + EXPECT_EQ(Decimal(1), FromString("01")); + EXPECT_EQ(Encode(3, 0, kPositive), FromString("+3")); + EXPECT_EQ(Encode(0, 3, kPositive), FromString("0E3")); + EXPECT_EQ(Encode(5, -1, kPositive), FromString(".5")); + EXPECT_EQ(Encode(100, 0, kPositive), FromString("100")); + EXPECT_EQ(Encode(100, 0, kNegative), FromString("-100")); + EXPECT_EQ(Encode(123, -2, kPositive), FromString("1.23")); + EXPECT_EQ(Encode(123, -2, kNegative), FromString("-1.23")); + EXPECT_EQ(Encode(123, 8, kPositive), FromString("1.23E10")); + EXPECT_EQ(Encode(123, 8, kNegative), FromString("-1.23E10")); + EXPECT_EQ(Encode(123, 8, kPositive), FromString("1.23E+10")); + EXPECT_EQ(Encode(123, 8, kNegative), FromString("-1.23E+10")); + EXPECT_EQ(Encode(123, -12, kPositive), FromString("1.23E-10")); + EXPECT_EQ(Encode(123, -12, kNegative), FromString("-1.23E-10")); + EXPECT_EQ(Encode(5, -7, kPositive), FromString("0.0000005")); + EXPECT_EQ(Encode(0, 0, kPositive), FromString("0e9999")); + EXPECT_EQ(Encode(123, -3, kPositive), FromString("0.123")); + EXPECT_EQ(Encode(0, -2, kPositive), FromString("00.00")); + EXPECT_EQ(Encode(1, 2, kPositive), FromString("1E2")); + EXPECT_EQ(Decimal::Infinity(kPositive), FromString("1E20000")); + EXPECT_EQ(Decimal::Zero(kPositive), FromString("1E-20000")); + EXPECT_EQ(Encode(1000, 1023, kPositive), FromString("1E1026")); + EXPECT_EQ(Decimal::Zero(kPositive), FromString("1E-1026")); + EXPECT_EQ(Decimal::Infinity(kPositive), FromString("1234567890E1036")); + + // 2^1024 + const uint64_t kLeadingDigitsOf2PowerOf1024 = UINT64_C(17976931348623159); + EXPECT_EQ(Encode(kLeadingDigitsOf2PowerOf1024, 292, kPositive), + FromString("1797693134862315907729305190789024733617976978942306572" + "7343008115773267580550096313270847732240753602112011387" + "9871393357658789768814416622492847430639474124377767893" + "4248654852763022196012460941194530829520850057688381506" + "8234246288147391311054082723716335051068458629823994724" + "5938479716304835356329624224137216")); +} + +// These strings are look like proper number, but we don't accept them. +TEST_F(DecimalTest, FromStringLikeNumber) { + EXPECT_EQ(Decimal::Nan(), FromString(" 123 ")); + EXPECT_EQ(Decimal::Nan(), FromString("1,234")); +} + +// fromString doesn't support infinity and NaN. +TEST_F(DecimalTest, FromStringSpecialValues) { + EXPECT_EQ(Decimal::Nan(), FromString("INF")); + EXPECT_EQ(Decimal::Nan(), FromString("Infinity")); + EXPECT_EQ(Decimal::Nan(), FromString("infinity")); + EXPECT_EQ(Decimal::Nan(), FromString("+Infinity")); + EXPECT_EQ(Decimal::Nan(), FromString("+infinity")); + EXPECT_EQ(Decimal::Nan(), FromString("-Infinity")); + EXPECT_EQ(Decimal::Nan(), FromString("-infinity")); + EXPECT_EQ(Decimal::Nan(), FromString("NaN")); + EXPECT_EQ(Decimal::Nan(), FromString("nan")); + EXPECT_EQ(Decimal::Nan(), FromString("+NaN")); + EXPECT_EQ(Decimal::Nan(), FromString("+nan")); + EXPECT_EQ(Decimal::Nan(), FromString("-NaN")); + EXPECT_EQ(Decimal::Nan(), FromString("-nan")); +} + +TEST_F(DecimalTest, fromStringTruncated) { + EXPECT_EQ(Decimal::Nan(), FromString("x")); + EXPECT_EQ(Decimal::Nan(), FromString("0.")); + EXPECT_EQ(Decimal::Nan(), FromString("1x")); + + EXPECT_EQ(Decimal::Nan(), FromString("1Ex")); + EXPECT_EQ(Decimal::Nan(), FromString("1E2x")); + EXPECT_EQ(Decimal::Nan(), FromString("1E+x")); +} + +TEST_F(DecimalTest, Multiplication) { + EXPECT_EQ(Encode(0, 0, kPositive), Decimal(0) * Decimal(0)); + EXPECT_EQ(Encode(2, 0, kNegative), Decimal(2) * Decimal(-1)); + EXPECT_EQ(Encode(2, 0, kNegative), Decimal(-1) * Decimal(2)); + EXPECT_EQ(Encode(99, 0, kPositive), Decimal(99) * Decimal(1)); + EXPECT_EQ(Encode(2500, 0, kPositive), Decimal(-50) * Decimal(-50)); + EXPECT_EQ(Encode(1, 21, kPositive), + Encode(UINT64_C(10000000000), 0, kPositive) * + Encode(UINT64_C(100000000000), 0, kPositive)); +} + +TEST_F(DecimalTest, MultiplicationBigExponent) { + EXPECT_EQ(Encode(1, 1022, kPositive), + Encode(1, 1022, kPositive) * Encode(1, 0, kPositive)); + EXPECT_EQ(Decimal::Infinity(kPositive), + Encode(1, 1022, kPositive) * Encode(1, 1022, kPositive)); + EXPECT_EQ(Encode(1, 22, kPositive), + Encode(1, 1022, kPositive) * Encode(1, -1000, kPositive)); +} + +TEST_F(DecimalTest, MultiplicationSmallExponent) { + EXPECT_EQ(Encode(1, -1022, kPositive), + Encode(1, -1022, kPositive) * Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(0, 0, kPositive), + Encode(1, -1022, kPositive) * Encode(1, -1022, kPositive)); +} + +TEST_F(DecimalTest, MultiplicationSpecialValues) { + const Decimal infinity(Decimal::Infinity(kPositive)); + const Decimal minus_infinity(Decimal::Infinity(kNegative)); + const Decimal na_n(Decimal::Nan()); + const Decimal ten(10); + const Decimal minus_ten(-10); + const Decimal zero(Decimal::Zero(kPositive)); + const Decimal minus_zero(Decimal::Zero(kNegative)); + + EXPECT_EQ(infinity, infinity * infinity); + EXPECT_EQ(minus_infinity, infinity * minus_infinity); + EXPECT_EQ(minus_infinity, minus_infinity * infinity); + EXPECT_EQ(infinity, minus_infinity * minus_infinity); + + EXPECT_EQ(na_n, infinity * zero); + EXPECT_EQ(na_n, zero * minus_infinity); + EXPECT_EQ(na_n, minus_infinity * zero); + EXPECT_EQ(na_n, minus_infinity * zero); + + EXPECT_EQ(na_n, infinity * minus_zero); + EXPECT_EQ(na_n, minus_zero * minus_infinity); + EXPECT_EQ(na_n, minus_infinity * minus_zero); + EXPECT_EQ(na_n, minus_infinity * minus_zero); + + EXPECT_EQ(infinity, infinity * ten); + EXPECT_EQ(infinity, ten * infinity); + EXPECT_EQ(minus_infinity, minus_infinity * ten); + EXPECT_EQ(minus_infinity, ten * minus_infinity); + + EXPECT_EQ(minus_infinity, infinity * minus_ten); + EXPECT_EQ(minus_infinity, minus_ten * infinity); + EXPECT_EQ(infinity, minus_infinity * minus_ten); + EXPECT_EQ(infinity, minus_ten * minus_infinity); + + EXPECT_EQ(na_n, na_n * na_n); + EXPECT_EQ(na_n, na_n * ten); + EXPECT_EQ(na_n, ten * na_n); + + EXPECT_EQ(na_n, na_n * infinity); + EXPECT_EQ(na_n, na_n * minus_infinity); + EXPECT_EQ(na_n, infinity * na_n); + EXPECT_EQ(na_n, minus_infinity * na_n); +} + +TEST_F(DecimalTest, Negate) { + EXPECT_EQ(Encode(0, 0, kNegative), -Encode(0, 0, kPositive)); + EXPECT_EQ(Encode(0, 0, kPositive), -Encode(0, 0, kNegative)); + + EXPECT_EQ(Encode(0, 10, kNegative), -Encode(0, 10, kPositive)); + EXPECT_EQ(Encode(0, 10, kPositive), -Encode(0, 10, kNegative)); + + EXPECT_EQ(Encode(0, -10, kNegative), -Encode(0, -10, kPositive)); + EXPECT_EQ(Encode(0, -10, kPositive), -Encode(0, -10, kNegative)); + + EXPECT_EQ(Encode(1, 0, kNegative), -Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(1, 0, kPositive), -Encode(1, 0, kNegative)); + + EXPECT_EQ(Encode(1, 10, kNegative), -Encode(1, 10, kPositive)); + EXPECT_EQ(Encode(1, 10, kPositive), -Encode(1, 10, kNegative)); + + EXPECT_EQ(Encode(1, -10, kNegative), -Encode(1, -10, kPositive)); + EXPECT_EQ(Encode(1, -10, kPositive), -Encode(1, -10, kNegative)); +} + +TEST_F(DecimalTest, NegateBigExponent) { + EXPECT_EQ(Encode(1, 1000, kNegative), -Encode(1, 1000, kPositive)); + EXPECT_EQ(Encode(1, 1000, kPositive), -Encode(1, 1000, kNegative)); +} + +TEST_F(DecimalTest, NegateSmallExponent) { + EXPECT_EQ(Encode(1, -1000, kNegative), -Encode(1, -1000, kPositive)); + EXPECT_EQ(Encode(1, -1000, kPositive), -Encode(1, -1000, kNegative)); +} + +TEST_F(DecimalTest, NegateSpecialValues) { + EXPECT_EQ(Decimal::Infinity(kNegative), -Decimal::Infinity(kPositive)); + EXPECT_EQ(Decimal::Infinity(kPositive), -Decimal::Infinity(kNegative)); + EXPECT_EQ(Decimal::Nan(), -Decimal::Nan()); +} + +TEST_F(DecimalTest, Predicates) { + EXPECT_TRUE(Decimal::Zero(kPositive).IsFinite()); + EXPECT_FALSE(Decimal::Zero(kPositive).IsInfinity()); + EXPECT_FALSE(Decimal::Zero(kPositive).IsNaN()); + EXPECT_TRUE(Decimal::Zero(kPositive).IsPositive()); + EXPECT_FALSE(Decimal::Zero(kPositive).IsNegative()); + EXPECT_FALSE(Decimal::Zero(kPositive).IsSpecial()); + EXPECT_TRUE(Decimal::Zero(kPositive).IsZero()); + + EXPECT_TRUE(Decimal::Zero(kNegative).IsFinite()); + EXPECT_FALSE(Decimal::Zero(kNegative).IsInfinity()); + EXPECT_FALSE(Decimal::Zero(kNegative).IsNaN()); + EXPECT_FALSE(Decimal::Zero(kNegative).IsPositive()); + EXPECT_TRUE(Decimal::Zero(kNegative).IsNegative()); + EXPECT_FALSE(Decimal::Zero(kNegative).IsSpecial()); + EXPECT_TRUE(Decimal::Zero(kNegative).IsZero()); + + EXPECT_TRUE(Decimal(123).IsFinite()); + EXPECT_FALSE(Decimal(123).IsInfinity()); + EXPECT_FALSE(Decimal(123).IsNaN()); + EXPECT_TRUE(Decimal(123).IsPositive()); + EXPECT_FALSE(Decimal(123).IsNegative()); + EXPECT_FALSE(Decimal(123).IsSpecial()); + EXPECT_FALSE(Decimal(123).IsZero()); + + EXPECT_TRUE(Decimal(-123).IsFinite()); + EXPECT_FALSE(Decimal(-123).IsInfinity()); + EXPECT_FALSE(Decimal(-123).IsNaN()); + EXPECT_FALSE(Decimal(-123).IsPositive()); + EXPECT_TRUE(Decimal(-123).IsNegative()); + EXPECT_FALSE(Decimal(-123).IsSpecial()); + EXPECT_FALSE(Decimal(-123).IsZero()); +} + +TEST_F(DecimalTest, PredicatesSpecialValues) { + EXPECT_FALSE(Decimal::Infinity(kPositive).IsFinite()); + EXPECT_TRUE(Decimal::Infinity(kPositive).IsInfinity()); + EXPECT_FALSE(Decimal::Infinity(kPositive).IsNaN()); + EXPECT_TRUE(Decimal::Infinity(kPositive).IsPositive()); + EXPECT_FALSE(Decimal::Infinity(kPositive).IsNegative()); + EXPECT_TRUE(Decimal::Infinity(kPositive).IsSpecial()); + EXPECT_FALSE(Decimal::Infinity(kPositive).IsZero()); + + EXPECT_FALSE(Decimal::Infinity(kNegative).IsFinite()); + EXPECT_TRUE(Decimal::Infinity(kNegative).IsInfinity()); + EXPECT_FALSE(Decimal::Infinity(kNegative).IsNaN()); + EXPECT_FALSE(Decimal::Infinity(kNegative).IsPositive()); + EXPECT_TRUE(Decimal::Infinity(kNegative).IsNegative()); + EXPECT_TRUE(Decimal::Infinity(kNegative).IsSpecial()); + EXPECT_FALSE(Decimal::Infinity(kNegative).IsZero()); + + EXPECT_FALSE(Decimal::Nan().IsFinite()); + EXPECT_FALSE(Decimal::Nan().IsInfinity()); + EXPECT_TRUE(Decimal::Nan().IsNaN()); + EXPECT_TRUE(Decimal::Nan().IsSpecial()); + EXPECT_FALSE(Decimal::Nan().IsZero()); +} + +// LayoutTests/fast/forms/number/number-stepup-stepdown-from-renderer +TEST_F(DecimalTest, RealWorldExampleNumberStepUpStepDownFromRenderer) { + EXPECT_DECIMAL_STREQ("10", StepDown("0", "100", "10", "19", 1)); + EXPECT_DECIMAL_STREQ("90", StepUp("0", "99", "10", "89", 1)); + EXPECT_DECIMAL_STREQ( + "1", StepUp("0", "1", "0.33333333333333333", "0", 3)); // step=1/3 + EXPECT_DECIMAL_STREQ("0.01", StepUp("0", "0.01", "0.0033333333333333333", "0", + 3)); // step=1/300 + EXPECT_DECIMAL_STREQ( + "1", StepUp("0", "1", "0.003921568627450980", "0", 255)); // step=1/255 + EXPECT_DECIMAL_STREQ("1", StepUp("0", "1", "0.1", "0", 10)); +} + +TEST_F(DecimalTest, RealWorldExampleNumberStepUpStepDownFromRendererRounding) { + EXPECT_DECIMAL_STREQ("5.015", StepUp("0", "100", "0.005", "5.005", 2)); + EXPECT_DECIMAL_STREQ("5.06", StepUp("0", "100", "0.005", "5.005", 11)); + EXPECT_DECIMAL_STREQ("5.065", StepUp("0", "100", "0.005", "5.005", 12)); + + EXPECT_DECIMAL_STREQ("5.015", StepUp("4", "9", "0.005", "5.005", 2)); + EXPECT_DECIMAL_STREQ("5.06", StepUp("4", "9", "0.005", "5.005", 11)); + EXPECT_DECIMAL_STREQ("5.065", StepUp("4", "9", "0.005", "5.005", 12)); +} + +TEST_F(DecimalTest, RealWorldExampleRangeStepUpStepDown) { + EXPECT_DECIMAL_STREQ("1e+38", StepUp("0", "1E38", "1", "1E38", 9)); + EXPECT_DECIMAL_STREQ("1e+38", StepDown("0", "1E38", "1", "1E38", 9)); +} + +TEST_F(DecimalTest, Remainder) { + EXPECT_EQ(Encode(21, -1, kPositive), Encode(21, -1, kPositive).Remainder(3)); + EXPECT_EQ(Decimal(1), Decimal(10).Remainder(3)); + EXPECT_EQ(Decimal(1), Decimal(10).Remainder(-3)); + EXPECT_EQ(Encode(1, 0, kNegative), Decimal(-10).Remainder(3)); + EXPECT_EQ(Decimal(-1), Decimal(-10).Remainder(-3)); + EXPECT_EQ(Encode(2, -1, kPositive), Encode(102, -1, kPositive).Remainder(1)); + EXPECT_EQ(Encode(1, -1, kPositive), + Decimal(10).Remainder(Encode(3, -1, kPositive))); + EXPECT_EQ(Decimal(1), + Encode(36, -1, kPositive).Remainder(Encode(13, -1, kPositive))); + EXPECT_EQ(Encode(1, 86, kPositive), + (Encode(1234, 100, kPositive).Remainder(Decimal(3)))); + EXPECT_EQ(Decimal(500), (Decimal(500).Remainder(1000))); + EXPECT_EQ(Decimal(-500), (Decimal(-500).Remainder(1000))); +} + +TEST_F(DecimalTest, RemainderBigExponent) { + EXPECT_EQ(Encode(0, 1022, kPositive), + Encode(1, 1022, kPositive).Remainder(Encode(1, 0, kPositive))); + EXPECT_EQ(Encode(0, 1022, kPositive), + Encode(1, 1022, kPositive).Remainder(Encode(1, 1022, kPositive))); + EXPECT_EQ(Decimal::Infinity(kPositive), + Encode(1, 1022, kPositive).Remainder(Encode(1, -1000, kPositive))); +} + +TEST_F(DecimalTest, RemainderSmallExponent) { + EXPECT_EQ(Encode(1, -1022, kPositive), + Encode(1, -1022, kPositive).Remainder(Encode(1, 0, kPositive))); + EXPECT_EQ(Encode(0, -1022, kPositive), + Encode(1, -1022, kPositive).Remainder(Encode(1, -1022, kPositive))); +} + +TEST_F(DecimalTest, RemainderSpecialValues) { + EXPECT_EQ(Decimal::Infinity(kPositive), + Decimal::Infinity(kPositive).Remainder(1)); + EXPECT_EQ(Decimal::Infinity(kNegative), + Decimal::Infinity(kNegative).Remainder(1)); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Remainder(1)); + + EXPECT_EQ(Decimal::Infinity(kNegative), + Decimal::Infinity(kPositive).Remainder(-1)); + EXPECT_EQ(Decimal::Infinity(kPositive), + Decimal::Infinity(kNegative).Remainder(-1)); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Remainder(-1)); + + EXPECT_EQ(Decimal::Infinity(kPositive), + Decimal::Infinity(kPositive).Remainder(3)); + EXPECT_EQ(Decimal::Infinity(kNegative), + Decimal::Infinity(kNegative).Remainder(3)); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Remainder(3)); + + EXPECT_EQ(Decimal::Infinity(kNegative), + Decimal::Infinity(kPositive).Remainder(-1)); + EXPECT_EQ(Decimal::Infinity(kPositive), + Decimal::Infinity(kNegative).Remainder(-1)); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Remainder(-1)); + + EXPECT_EQ(Decimal::Nan(), Decimal(1).Remainder(Decimal::Infinity(kPositive))); + EXPECT_EQ(Decimal::Nan(), Decimal(1).Remainder(Decimal::Infinity(kNegative))); + EXPECT_EQ(Decimal::Nan(), Decimal(1).Remainder(Decimal::Nan())); +} + +TEST_F(DecimalTest, Round) { + EXPECT_EQ(Decimal(1), (Decimal(9) / Decimal(10)).Round()); + EXPECT_EQ(Decimal(25), (Decimal(5) / FromString("0.200")).Round()); + EXPECT_EQ(Decimal(3), (Decimal(5) / Decimal(2)).Round()); + EXPECT_EQ(Decimal(1), (Decimal(2) / Decimal(3)).Round()); + EXPECT_EQ(Decimal(3), (Decimal(10) / Decimal(3)).Round()); + EXPECT_EQ(Decimal(3), (Decimal(1) / FromString("0.3")).Round()); + EXPECT_EQ(Decimal(10), (Decimal(1) / FromString("0.1")).Round()); + EXPECT_EQ(Decimal(5), (Decimal(1) / FromString("0.2")).Round()); + EXPECT_EQ(Decimal(10), (FromString("10.2") / 1).Round()); + EXPECT_EQ(Encode(1234, 100, kPositive), Encode(1234, 100, kPositive).Round()); + + EXPECT_EQ(Decimal(2), Encode(190002, -5, kPositive).Round()); + EXPECT_EQ(Decimal(2), Encode(150002, -5, kPositive).Round()); + EXPECT_EQ(Decimal(2), Encode(150000, -5, kPositive).Round()); + EXPECT_EQ(Decimal(12), Encode(12492, -3, kPositive).Round()); + EXPECT_EQ(Decimal(13), Encode(12502, -3, kPositive).Round()); + + EXPECT_EQ(Decimal(-2), Encode(190002, -5, kNegative).Round()); + EXPECT_EQ(Decimal(-2), Encode(150002, -5, kNegative).Round()); + EXPECT_EQ(Decimal(-2), Encode(150000, -5, kNegative).Round()); + EXPECT_EQ(Decimal(-12), Encode(12492, -3, kNegative).Round()); + EXPECT_EQ(Decimal(-13), Encode(12502, -3, kNegative).Round()); +} + +TEST_F(DecimalTest, RoundSpecialValues) { + EXPECT_EQ(Decimal::Infinity(kPositive), Decimal::Infinity(kPositive).Round()); + EXPECT_EQ(Decimal::Infinity(kNegative), Decimal::Infinity(kNegative).Round()); + EXPECT_EQ(Decimal::Nan(), Decimal::Nan().Round()); +} + +TEST_F(DecimalTest, Subtract) { + EXPECT_EQ(Encode(0, 0, kPositive), Decimal(0) - Decimal(0)); + EXPECT_EQ(Encode(3, 0, kPositive), Decimal(2) - Decimal(-1)); + EXPECT_EQ(Encode(3, 0, kNegative), Decimal(-1) - Decimal(2)); + EXPECT_EQ(Encode(98, 0, kPositive), Decimal(99) - Decimal(1)); + EXPECT_EQ(Encode(0, 0, kPositive), Decimal(-50) - Decimal(-50)); + EXPECT_EQ(Encode(UINT64_C(1000000000000000), 35, kPositive), + Encode(1, 50, kPositive) - Decimal(1)); + EXPECT_EQ(Encode(UINT64_C(1000000000000000), 35, kNegative), + Decimal(1) - Encode(1, 50, kPositive)); +} + +TEST_F(DecimalTest, SubtractBigExponent) { + EXPECT_EQ(Encode(1, 1022, kPositive), + Encode(1, 1022, kPositive) - Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(0, 0, kPositive), + Encode(1, 1022, kPositive) - Encode(1, 1022, kPositive)); + EXPECT_EQ(Encode(1, 1022, kPositive), + Encode(1, 1022, kPositive) + Encode(1, -1000, kPositive)); +} + +TEST_F(DecimalTest, SubtractSmallExponent) { + EXPECT_EQ(Encode(UINT64_C(10000000000000000), -16, kNegative), + Encode(1, -1022, kPositive) - Encode(1, 0, kPositive)); + EXPECT_EQ(Encode(0, 0, kPositive), + Encode(1, -1022, kPositive) - Encode(1, -1022, kPositive)); +} + +TEST_F(DecimalTest, SubtractSpecialValues) { + const Decimal infinity(Decimal::Infinity(kPositive)); + const Decimal minus_infinity(Decimal::Infinity(kNegative)); + const Decimal na_n(Decimal::Nan()); + const Decimal ten(10); + + EXPECT_EQ(na_n, infinity - infinity); + EXPECT_EQ(infinity, infinity - minus_infinity); + EXPECT_EQ(minus_infinity, minus_infinity - infinity); + EXPECT_EQ(na_n, minus_infinity - minus_infinity); + + EXPECT_EQ(infinity, infinity - ten); + EXPECT_EQ(minus_infinity, ten - infinity); + EXPECT_EQ(minus_infinity, minus_infinity - ten); + EXPECT_EQ(infinity, ten - minus_infinity); + + EXPECT_EQ(na_n, na_n - na_n); + EXPECT_EQ(na_n, na_n - ten); + EXPECT_EQ(na_n, ten - na_n); + + EXPECT_EQ(na_n, na_n - infinity); + EXPECT_EQ(na_n, na_n - minus_infinity); + EXPECT_EQ(na_n, infinity - na_n); + EXPECT_EQ(na_n, minus_infinity - na_n); +} + +TEST_F(DecimalTest, ToDouble) { + EXPECT_EQ(0.0, Encode(0, 0, kPositive).ToDouble()); + EXPECT_EQ(-0.0, Encode(0, 0, kNegative).ToDouble()); + + EXPECT_EQ(1.0, Encode(1, 0, kPositive).ToDouble()); + EXPECT_EQ(-1.0, Encode(1, 0, kNegative).ToDouble()); + + EXPECT_EQ(0.1, Encode(1, -1, kPositive).ToDouble()); + EXPECT_EQ(-0.1, Encode(1, -1, kNegative).ToDouble()); + EXPECT_EQ(0.3, Encode(3, -1, kPositive).ToDouble()); + EXPECT_EQ(-0.3, Encode(3, -1, kNegative).ToDouble()); + EXPECT_EQ(0.6, Encode(6, -1, kPositive).ToDouble()); + EXPECT_EQ(-0.6, Encode(6, -1, kNegative).ToDouble()); + EXPECT_EQ(0.7, Encode(7, -1, kPositive).ToDouble()); + EXPECT_EQ(-0.7, Encode(7, -1, kNegative).ToDouble()); + + EXPECT_EQ(0.01, Encode(1, -2, kPositive).ToDouble()); + EXPECT_EQ(0.001, Encode(1, -3, kPositive).ToDouble()); + EXPECT_EQ(0.0001, Encode(1, -4, kPositive).ToDouble()); + EXPECT_EQ(0.00001, Encode(1, -5, kPositive).ToDouble()); + + EXPECT_EQ(1e+308, Encode(1, 308, kPositive).ToDouble()); + EXPECT_EQ(1e-307, Encode(1, -307, kPositive).ToDouble()); + + EXPECT_TRUE(std::isinf(Encode(1, 1000, kPositive).ToDouble())); + EXPECT_EQ(0.0, Encode(1, -1000, kPositive).ToDouble()); +} + +TEST_F(DecimalTest, ToDoubleSpecialValues) { + EXPECT_TRUE(std::isinf(Decimal::Infinity(Decimal::kPositive).ToDouble())); + EXPECT_TRUE(std::isinf(Decimal::Infinity(Decimal::kNegative).ToDouble())); + EXPECT_TRUE(std::isnan(Decimal::Nan().ToDouble())); +} + +TEST_F(DecimalTest, ToString) { + EXPECT_DECIMAL_STREQ("0", Decimal::Zero(kPositive)); + EXPECT_DECIMAL_STREQ("-0", Decimal::Zero(kNegative)); + EXPECT_DECIMAL_STREQ("1", Decimal(1)); + EXPECT_DECIMAL_STREQ("-1", Decimal(-1)); + EXPECT_DECIMAL_STREQ("1234567", Decimal(1234567)); + EXPECT_DECIMAL_STREQ("-1234567", Decimal(-1234567)); + EXPECT_DECIMAL_STREQ("0.5", Encode(5, -1, kPositive)); + EXPECT_DECIMAL_STREQ("-0.5", Encode(5, -1, kNegative)); + EXPECT_DECIMAL_STREQ("12.345", Encode(12345, -3, kPositive)); + EXPECT_DECIMAL_STREQ("-12.345", Encode(12345, -3, kNegative)); + EXPECT_DECIMAL_STREQ("0.12345", Encode(12345, -5, kPositive)); + EXPECT_DECIMAL_STREQ("-0.12345", Encode(12345, -5, kNegative)); + EXPECT_DECIMAL_STREQ("50", Encode(50, 0, kPositive)); + EXPECT_DECIMAL_STREQ("-50", Encode(50, 0, kNegative)); + EXPECT_DECIMAL_STREQ("5e+1", Encode(5, 1, kPositive)); + EXPECT_DECIMAL_STREQ("-5e+1", Encode(5, 1, kNegative)); + EXPECT_DECIMAL_STREQ("5.678e+103", Encode(5678, 100, kPositive)); + EXPECT_DECIMAL_STREQ("-5.678e+103", Encode(5678, 100, kNegative)); + EXPECT_DECIMAL_STREQ("5.678e-97", Encode(5678, -100, kPositive)); + EXPECT_DECIMAL_STREQ("-5.678e-97", Encode(5678, -100, kNegative)); + EXPECT_DECIMAL_STREQ("8639999913600001", + Encode(UINT64_C(8639999913600001), 0, kPositive)); + EXPECT_DECIMAL_STREQ( + "9007199254740991", + Encode((static_cast<uint64_t>(1) << DBL_MANT_DIG) - 1, 0, kPositive)); + EXPECT_DECIMAL_STREQ("99999999999999999", + Encode(UINT64_C(99999999999999999), 0, kPositive)); + EXPECT_DECIMAL_STREQ("9.9999999999999999e+17", + Encode(UINT64_C(99999999999999999), 1, kPositive)); + EXPECT_DECIMAL_STREQ("9.9999999999999999e+18", + Encode(UINT64_C(99999999999999999), 2, kPositive)); + EXPECT_DECIMAL_STREQ("1e+16", + Encode(UINT64_C(99999999999999999), -1, kPositive)); + EXPECT_DECIMAL_STREQ("1000000000000000", + Encode(UINT64_C(99999999999999999), -2, kPositive)); + EXPECT_DECIMAL_STREQ("1", + Encode(UINT64_C(99999999999999999), -17, kPositive)); + EXPECT_DECIMAL_STREQ("0.001", + Encode(UINT64_C(99999999999999999), -20, kPositive)); + EXPECT_DECIMAL_STREQ("1e-83", + Encode(UINT64_C(99999999999999999), -100, kPositive)); +} + +TEST_F(DecimalTest, ToStringSpecialValues) { + EXPECT_DECIMAL_STREQ("Infinity", Decimal::Infinity(kPositive)); + EXPECT_DECIMAL_STREQ("-Infinity", Decimal::Infinity(kNegative)); + EXPECT_DECIMAL_STREQ("NaN", Decimal::Nan()); +} + +} // namespace blink |