blob: d5c50b5c9456de2febd8decbbb4ee0daf569cf3e [file] [log] [blame]
/*
* 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 "platform/Decimal.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "wtf/MathExtras.h"
#include "wtf/text/CString.h"
#include <float.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;
ASSERT(result.isFinite());
return result > maximum ? result - step : result;
}
};
class DecimalTest : public ::testing::Test {
protected:
using Sign = Decimal::Sign;
static const Sign Positive = Decimal::Positive;
static const Sign Negative = Decimal::Negative;
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& valueString,
int numberOfStepTimes) {
DecimalStepRange stepRange(fromString(minimum), fromString(maximum),
fromString(step));
Decimal value = fromString(valueString);
for (int i = 0; i < numberOfStepTimes; ++i) {
value -= stepRange.step;
value = stepRange.clampValue(value);
}
return value;
}
Decimal stepUp(const String& minimum,
const String& maximum,
const String& step,
const String& valueString,
int numberOfStepTimes) {
DecimalStepRange stepRange(fromString(minimum), fromString(maximum),
fromString(step));
Decimal value = fromString(valueString);
for (int i = 0; i < numberOfStepTimes; ++i) {
value += stepRange.step;
value = stepRange.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, Positive), encode(0, 0, Positive).abs());
EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Negative).abs());
EXPECT_EQ(encode(0, 10, Positive), encode(0, 10, Positive).abs());
EXPECT_EQ(encode(0, 10, Positive), encode(0, 10, Negative).abs());
EXPECT_EQ(encode(0, -10, Positive), encode(0, -10, Positive).abs());
EXPECT_EQ(encode(0, -10, Positive), encode(0, -10, Negative).abs());
EXPECT_EQ(encode(1, 0, Positive), encode(1, 0, Positive).abs());
EXPECT_EQ(encode(1, 0, Positive), encode(1, 0, Negative).abs());
EXPECT_EQ(encode(1, 10, Positive), encode(1, 10, Positive).abs());
EXPECT_EQ(encode(1, 10, Positive), encode(1, 10, Negative).abs());
EXPECT_EQ(encode(1, -10, Positive), encode(1, -10, Positive).abs());
EXPECT_EQ(encode(1, -10, Positive), encode(1, -10, Negative).abs());
}
TEST_F(DecimalTest, AbsBigExponent) {
EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).abs());
EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Negative).abs());
}
TEST_F(DecimalTest, AbsSmallExponent) {
EXPECT_EQ(encode(1, -1000, Positive), encode(1, -1000, Positive).abs());
EXPECT_EQ(encode(1, -1000, Positive), encode(1, -1000, Negative).abs());
}
TEST_F(DecimalTest, AbsSpecialValues) {
EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).abs());
EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).abs());
EXPECT_EQ(Decimal::nan(), Decimal::nan().abs());
}
TEST_F(DecimalTest, Add) {
EXPECT_EQ(encode(0, 0, Positive), 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, Positive), Decimal(99) + Decimal(1));
EXPECT_EQ(encode(100, 0, Negative), Decimal(-50) + Decimal(-50));
EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive),
encode(1, 50, Positive) + Decimal(1));
EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive),
Decimal(1) + encode(1, 50, Positive));
EXPECT_EQ(encode(UINT64_C(10000000001), 0, Positive),
encode(1, 10, Positive) + Decimal(1));
EXPECT_EQ(encode(UINT64_C(10000000001), 0, Positive),
Decimal(1) + encode(1, 10, Positive));
EXPECT_EQ(encode(1, 0, Positive),
encode(1, -1022, Positive) + encode(1, 0, Positive));
EXPECT_EQ(encode(2, -1022, Positive),
encode(1, -1022, Positive) + encode(1, -1022, Positive));
}
TEST_F(DecimalTest, AddBigExponent) {
EXPECT_EQ(encode(1, 1022, Positive),
encode(1, 1022, Positive) + encode(1, 0, Positive));
EXPECT_EQ(encode(2, 1022, Positive),
encode(1, 1022, Positive) + encode(1, 1022, Positive));
EXPECT_EQ(Decimal::infinity(Positive),
encode(std::numeric_limits<uint64_t>::max(), 1022, Positive) +
encode(1, 0, Positive));
EXPECT_EQ(encode(1, 1022, Positive),
encode(1, 1022, Positive) + encode(1, -1000, Positive));
}
TEST_F(DecimalTest, AddSmallExponent) {
EXPECT_EQ(encode(1, 0, Positive),
encode(1, -1022, Positive) + encode(1, 0, Positive));
EXPECT_EQ(encode(2, -1022, Positive),
encode(1, -1022, Positive) + encode(1, -1022, Positive));
}
TEST_F(DecimalTest, AddSpecialValues) {
const Decimal Infinity(Decimal::infinity(Positive));
const Decimal MinusInfinity(Decimal::infinity(Negative));
const Decimal NaN(Decimal::nan());
const Decimal Ten(10);
EXPECT_EQ(Infinity, Infinity + Infinity);
EXPECT_EQ(NaN, Infinity + MinusInfinity);
EXPECT_EQ(NaN, MinusInfinity + Infinity);
EXPECT_EQ(MinusInfinity, MinusInfinity + MinusInfinity);
EXPECT_EQ(Infinity, Infinity + Ten);
EXPECT_EQ(Infinity, Ten + Infinity);
EXPECT_EQ(MinusInfinity, MinusInfinity + Ten);
EXPECT_EQ(MinusInfinity, Ten + MinusInfinity);
EXPECT_EQ(NaN, NaN + NaN);
EXPECT_EQ(NaN, NaN + Ten);
EXPECT_EQ(NaN, Ten + NaN);
EXPECT_EQ(NaN, NaN - Infinity);
EXPECT_EQ(NaN, NaN - MinusInfinity);
EXPECT_EQ(NaN, Infinity - NaN);
EXPECT_EQ(NaN, MinusInfinity - NaN);
}
TEST_F(DecimalTest, Ceil) {
EXPECT_EQ(Decimal(1), Decimal(1).ceil());
EXPECT_EQ(Decimal(1), encode(1, -10, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(11, -1, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(13, -1, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(15, -1, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(19, -1, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(151, -2, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(101, -2, Positive).ceil());
EXPECT_EQ(Decimal(1), encode(199, -3, Positive).ceil());
EXPECT_EQ(Decimal(2), encode(199, -2, Positive).ceil());
EXPECT_EQ(Decimal(3), encode(209, -2, Positive).ceil());
EXPECT_EQ(Decimal(-1), Decimal(-1).ceil());
EXPECT_EQ(Decimal(0), encode(1, -10, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(11, -1, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(13, -1, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(15, -1, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(19, -1, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(151, -2, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(101, -2, Negative).ceil());
EXPECT_EQ(Decimal(0), encode(199, -3, Negative).ceil());
EXPECT_EQ(Decimal(-1), encode(199, -2, Negative).ceil());
EXPECT_EQ(Decimal(-2), encode(209, -2, Negative).ceil());
EXPECT_EQ(Decimal(1),
encode(UINT64_C(123456789012345678), -18, Positive).ceil());
}
TEST_F(DecimalTest, CeilingBigExponent) {
EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).ceil());
EXPECT_EQ(encode(1, 1000, Negative), encode(1, 1000, Negative).ceil());
}
TEST_F(DecimalTest, CeilingSmallExponent) {
EXPECT_EQ(encode(1, 0, Positive), encode(1, -1000, Positive).ceil());
EXPECT_EQ(encode(0, 0, Negative), encode(1, -1000, Negative).ceil());
}
TEST_F(DecimalTest, CeilingSpecialValues) {
EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).ceil());
EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).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, Positive) == encode(1, 1000, Positive));
EXPECT_FALSE(encode(1, 1000, Positive) != encode(1, 1000, Positive));
EXPECT_FALSE(encode(1, 1000, Positive) < encode(1, 1000, Positive));
EXPECT_TRUE(encode(1, 1000, Positive) <= encode(1, 1000, Positive));
EXPECT_FALSE(encode(1, 1000, Positive) > encode(1, 1000, Positive));
EXPECT_TRUE(encode(1, 1000, Positive) >= encode(1, 1000, Positive));
EXPECT_TRUE(encode(1, 1000, Negative) == encode(1, 1000, Negative));
EXPECT_FALSE(encode(1, 1000, Negative) != encode(1, 1000, Negative));
EXPECT_FALSE(encode(1, 1000, Negative) < encode(1, 1000, Negative));
EXPECT_TRUE(encode(1, 1000, Negative) <= encode(1, 1000, Negative));
EXPECT_FALSE(encode(1, 1000, Negative) > encode(1, 1000, Negative));
EXPECT_TRUE(encode(1, 1000, Negative) >= encode(1, 1000, Negative));
EXPECT_FALSE(encode(2, 1000, Positive) == encode(1, 1000, Positive));
EXPECT_TRUE(encode(2, 1000, Positive) != encode(1, 1000, Positive));
EXPECT_FALSE(encode(2, 1000, Positive) < encode(1, 1000, Positive));
EXPECT_FALSE(encode(2, 1000, Positive) <= encode(1, 1000, Positive));
EXPECT_TRUE(encode(2, 1000, Positive) > encode(1, 1000, Positive));
EXPECT_TRUE(encode(2, 1000, Positive) >= encode(1, 1000, Positive));
EXPECT_FALSE(encode(2, 1000, Negative) == encode(1, 1000, Negative));
EXPECT_TRUE(encode(2, 1000, Negative) != encode(1, 1000, Negative));
EXPECT_TRUE(encode(2, 1000, Negative) < encode(1, 1000, Negative));
EXPECT_TRUE(encode(2, 1000, Negative) <= encode(1, 1000, Negative));
EXPECT_FALSE(encode(2, 1000, Negative) > encode(1, 1000, Negative));
EXPECT_FALSE(encode(2, 1000, Negative) >= encode(1, 1000, Negative));
}
TEST_F(DecimalTest, CompareSmallExponent) {
EXPECT_TRUE(encode(1, -1000, Positive) == encode(1, -1000, Positive));
EXPECT_FALSE(encode(1, -1000, Positive) != encode(1, -1000, Positive));
EXPECT_FALSE(encode(1, -1000, Positive) < encode(1, -1000, Positive));
EXPECT_TRUE(encode(1, -1000, Positive) <= encode(1, -1000, Positive));
EXPECT_FALSE(encode(1, -1000, Positive) > encode(1, -1000, Positive));
EXPECT_TRUE(encode(1, -1000, Positive) >= encode(1, -1000, Positive));
EXPECT_TRUE(encode(1, -1000, Negative) == encode(1, -1000, Negative));
EXPECT_FALSE(encode(1, -1000, Negative) != encode(1, -1000, Negative));
EXPECT_FALSE(encode(1, -1000, Negative) < encode(1, -1000, Negative));
EXPECT_TRUE(encode(1, -1000, Negative) <= encode(1, -1000, Negative));
EXPECT_FALSE(encode(1, -1000, Negative) > encode(1, -1000, Negative));
EXPECT_TRUE(encode(1, -1000, Negative) >= encode(1, -1000, Negative));
EXPECT_FALSE(encode(2, -1000, Positive) == encode(1, -1000, Positive));
EXPECT_TRUE(encode(2, -1000, Positive) != encode(1, -1000, Positive));
EXPECT_FALSE(encode(2, -1000, Positive) < encode(1, -1000, Positive));
EXPECT_FALSE(encode(2, -1000, Positive) <= encode(1, -1000, Positive));
EXPECT_TRUE(encode(2, -1000, Positive) > encode(1, -1000, Positive));
EXPECT_TRUE(encode(2, -1000, Positive) >= encode(1, -1000, Positive));
EXPECT_FALSE(encode(2, -1000, Negative) == encode(1, -1000, Negative));
EXPECT_TRUE(encode(2, -1000, Negative) != encode(1, -1000, Negative));
EXPECT_TRUE(encode(2, -1000, Negative) < encode(1, -1000, Negative));
EXPECT_TRUE(encode(2, -1000, Negative) <= encode(1, -1000, Negative));
EXPECT_FALSE(encode(2, -1000, Negative) > encode(1, -1000, Negative));
EXPECT_FALSE(encode(2, -1000, Negative) >= encode(1, -1000, Negative));
}
TEST_F(DecimalTest, CompareSpecialValues) {
const Decimal Infinity(Decimal::infinity(Positive));
const Decimal MinusInfinity(Decimal::infinity(Negative));
const Decimal NaN(Decimal::nan());
const Decimal Zero(Decimal::zero(Positive));
const Decimal MinusZero(Decimal::zero(Negative));
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 == MinusZero);
EXPECT_FALSE(Zero != MinusZero);
EXPECT_FALSE(Zero < MinusZero);
EXPECT_TRUE(Zero <= MinusZero);
EXPECT_FALSE(Zero > MinusZero);
EXPECT_TRUE(Zero >= MinusZero);
EXPECT_TRUE(MinusZero == Zero);
EXPECT_FALSE(MinusZero != Zero);
EXPECT_FALSE(MinusZero < Zero);
EXPECT_TRUE(MinusZero <= Zero);
EXPECT_FALSE(MinusZero > Zero);
EXPECT_TRUE(MinusZero >= Zero);
EXPECT_TRUE(MinusZero == MinusZero);
EXPECT_FALSE(MinusZero != MinusZero);
EXPECT_FALSE(MinusZero < MinusZero);
EXPECT_TRUE(MinusZero <= MinusZero);
EXPECT_FALSE(MinusZero > MinusZero);
EXPECT_TRUE(MinusZero >= MinusZero);
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 == MinusInfinity);
EXPECT_TRUE(Infinity != MinusInfinity);
EXPECT_FALSE(Infinity < MinusInfinity);
EXPECT_FALSE(Infinity <= MinusInfinity);
EXPECT_TRUE(Infinity > MinusInfinity);
EXPECT_TRUE(Infinity >= MinusInfinity);
EXPECT_FALSE(Infinity == NaN);
EXPECT_FALSE(Infinity != NaN);
EXPECT_FALSE(Infinity < NaN);
EXPECT_FALSE(Infinity <= NaN);
EXPECT_FALSE(Infinity > NaN);
EXPECT_FALSE(Infinity >= NaN);
EXPECT_FALSE(MinusInfinity == Infinity);
EXPECT_TRUE(MinusInfinity != Infinity);
EXPECT_TRUE(MinusInfinity < Infinity);
EXPECT_TRUE(MinusInfinity <= Infinity);
EXPECT_FALSE(MinusInfinity > Infinity);
EXPECT_FALSE(MinusInfinity >= Infinity);
EXPECT_FALSE(MinusInfinity == Ten);
EXPECT_TRUE(MinusInfinity != Ten);
EXPECT_TRUE(MinusInfinity < Ten);
EXPECT_TRUE(MinusInfinity <= Ten);
EXPECT_FALSE(MinusInfinity > Ten);
EXPECT_FALSE(MinusInfinity >= Ten);
EXPECT_TRUE(MinusInfinity == MinusInfinity);
EXPECT_FALSE(MinusInfinity != MinusInfinity);
EXPECT_FALSE(MinusInfinity < MinusInfinity);
EXPECT_TRUE(MinusInfinity <= MinusInfinity);
EXPECT_FALSE(MinusInfinity > MinusInfinity);
EXPECT_TRUE(MinusInfinity >= MinusInfinity);
EXPECT_FALSE(MinusInfinity == NaN);
EXPECT_FALSE(MinusInfinity != NaN);
EXPECT_FALSE(MinusInfinity < NaN);
EXPECT_FALSE(MinusInfinity <= NaN);
EXPECT_FALSE(MinusInfinity > NaN);
EXPECT_FALSE(MinusInfinity >= NaN);
EXPECT_FALSE(NaN == Infinity);
EXPECT_FALSE(NaN != Infinity);
EXPECT_FALSE(NaN < Infinity);
EXPECT_FALSE(NaN <= Infinity);
EXPECT_FALSE(NaN > Infinity);
EXPECT_FALSE(NaN >= Infinity);
EXPECT_FALSE(NaN == Ten);
EXPECT_FALSE(NaN != Ten);
EXPECT_FALSE(NaN < Ten);
EXPECT_FALSE(NaN <= Ten);
EXPECT_FALSE(NaN > Ten);
EXPECT_FALSE(NaN >= Ten);
EXPECT_FALSE(NaN == MinusInfinity);
EXPECT_FALSE(NaN != MinusInfinity);
EXPECT_FALSE(NaN < MinusInfinity);
EXPECT_FALSE(NaN <= MinusInfinity);
EXPECT_FALSE(NaN > MinusInfinity);
EXPECT_FALSE(NaN >= MinusInfinity);
EXPECT_TRUE(NaN == NaN);
EXPECT_FALSE(NaN != NaN);
EXPECT_FALSE(NaN < NaN);
EXPECT_TRUE(NaN <= NaN);
EXPECT_FALSE(NaN > NaN);
EXPECT_TRUE(NaN >= NaN);
}
TEST_F(DecimalTest, Constructor) {
EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Positive, encode(0, 0, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Negative, encode(0, 0, Negative));
EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, Positive, encode(1, 0, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, Negative, encode(1, 0, Negative));
EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, Positive, encode(1, 1022, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, Negative, encode(1, 1022, Negative));
EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, Positive, encode(1, 1023, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, Negative, encode(1, 1023, Negative));
EXPECT_TRUE(encode(1, 2000, Positive).isInfinity());
EXPECT_TRUE(encode(1, 2000, Negative).isInfinity());
EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Positive, encode(1, -2000, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Negative, encode(1, -2000, Negative));
EXPECT_DECIMAL_ENCODED_DATA_EQ(
UINT64_C(99999999999999998), 0, Positive,
encode(UINT64_C(99999999999999998), 0, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(
UINT64_C(99999999999999998), 0, Negative,
encode(UINT64_C(99999999999999998), 0, Negative));
EXPECT_DECIMAL_ENCODED_DATA_EQ(
UINT64_C(99999999999999999), 0, Positive,
encode(UINT64_C(99999999999999999), 0, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(
UINT64_C(99999999999999999), 0, Negative,
encode(UINT64_C(99999999999999999), 0, Negative));
EXPECT_DECIMAL_ENCODED_DATA_EQ(
UINT64_C(100000000000000000), 0, Positive,
encode(UINT64_C(100000000000000000), 0, Positive));
EXPECT_DECIMAL_ENCODED_DATA_EQ(
UINT64_C(100000000000000000), 0, Negative,
encode(UINT64_C(100000000000000000), 0, Negative));
}
TEST_F(DecimalTest, Division) {
EXPECT_EQ(encode(0, 0, Positive), Decimal(0) / Decimal(1));
EXPECT_EQ(encode(2, 0, Negative), Decimal(2) / Decimal(-1));
EXPECT_EQ(encode(5, -1, Negative), Decimal(-1) / Decimal(2));
EXPECT_EQ(encode(99, 0, Positive), Decimal(99) / Decimal(1));
EXPECT_EQ(Decimal(1), Decimal(-50) / Decimal(-50));
EXPECT_EQ(encode(UINT64_C(333333333333333333), -18, Positive),
Decimal(1) / Decimal(3));
EXPECT_EQ(encode(UINT64_C(12345678901234), -1, Positive),
encode(UINT64_C(12345678901234), 0, Positive) / Decimal(10));
EXPECT_EQ(encode(UINT64_C(500005000050000500), -18, Positive),
Decimal(50000) / Decimal(99999));
}
TEST_F(DecimalTest, DivisionBigExponent) {
EXPECT_EQ(encode(1, 1022, Positive),
encode(1, 1022, Positive) / encode(1, 0, Positive));
EXPECT_EQ(encode(1, 0, Positive),
encode(1, 1022, Positive) / encode(1, 1022, Positive));
EXPECT_EQ(Decimal::infinity(Positive),
encode(1, 1022, Positive) / encode(1, -1000, Positive));
}
TEST_F(DecimalTest, DivisionSmallExponent) {
EXPECT_EQ(encode(1, -1022, Positive),
encode(1, -1022, Positive) / encode(1, 0, Positive));
EXPECT_EQ(encode(1, 0, Positive),
encode(1, -1022, Positive) / encode(1, -1022, Positive));
}
TEST_F(DecimalTest, DivisionSpecialValues) {
const Decimal Infinity(Decimal::infinity(Positive));
const Decimal MinusInfinity(Decimal::infinity(Negative));
const Decimal NaN(Decimal::nan());
const Decimal Zero(Decimal::zero(Positive));
const Decimal MinusZero(Decimal::zero(Negative));
const Decimal Ten(10);
const Decimal MinusTen(-10);
EXPECT_EQ(NaN, Zero / Zero);
EXPECT_EQ(NaN, Zero / MinusZero);
EXPECT_EQ(NaN, MinusZero / Zero);
EXPECT_EQ(NaN, MinusZero / MinusZero);
EXPECT_EQ(Infinity, Ten / Zero);
EXPECT_EQ(MinusInfinity, Ten / MinusZero);
EXPECT_EQ(MinusInfinity, MinusTen / Zero);
EXPECT_EQ(Infinity, MinusTen / MinusZero);
EXPECT_EQ(Infinity, Infinity / Zero);
EXPECT_EQ(MinusInfinity, Infinity / MinusZero);
EXPECT_EQ(MinusInfinity, MinusInfinity / Zero);
EXPECT_EQ(Infinity, MinusInfinity / MinusZero);
EXPECT_EQ(NaN, Infinity / Infinity);
EXPECT_EQ(NaN, Infinity / MinusInfinity);
EXPECT_EQ(NaN, MinusInfinity / Infinity);
EXPECT_EQ(NaN, MinusInfinity / MinusInfinity);
EXPECT_EQ(Zero, Ten / Infinity);
EXPECT_EQ(MinusZero, Ten / MinusInfinity);
EXPECT_EQ(MinusZero, MinusTen / Infinity);
EXPECT_EQ(Zero, MinusTen / MinusInfinity);
EXPECT_EQ(NaN, NaN / NaN);
EXPECT_EQ(NaN, NaN / Ten);
EXPECT_EQ(NaN, Ten / NaN);
EXPECT_EQ(NaN, NaN / Infinity);
EXPECT_EQ(NaN, NaN / MinusInfinity);
EXPECT_EQ(NaN, Infinity / NaN);
EXPECT_EQ(NaN, MinusInfinity / NaN);
}
TEST_F(DecimalTest, EncodedData) {
EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Positive));
EXPECT_EQ(encode(0, 0, Negative), encode(0, 0, Negative));
EXPECT_EQ(Decimal(1), Decimal(1));
EXPECT_EQ(encode(1, 0, Negative), encode(1, 0, Negative));
EXPECT_EQ(Decimal::infinity(Positive), encode(1, 2000, Positive));
EXPECT_EQ(Decimal::zero(Positive), encode(1, -2000, Positive));
}
TEST_F(DecimalTest, Floor) {
EXPECT_EQ(Decimal(1), Decimal(1).floor());
EXPECT_EQ(Decimal(0), encode(1, -10, Positive).floor());
EXPECT_EQ(Decimal(1), encode(11, -1, Positive).floor());
EXPECT_EQ(Decimal(1), encode(13, -1, Positive).floor());
EXPECT_EQ(Decimal(1), encode(15, -1, Positive).floor());
EXPECT_EQ(Decimal(1), encode(19, -1, Positive).floor());
EXPECT_EQ(Decimal(1), encode(193332, -5, Positive).floor());
EXPECT_EQ(Decimal(12), encode(12002, -3, Positive).floor());
EXPECT_EQ(Decimal(-1), Decimal(-1).floor());
EXPECT_EQ(Decimal(-1), encode(1, -10, Negative).floor());
EXPECT_EQ(Decimal(-2), encode(11, -1, Negative).floor());
EXPECT_EQ(Decimal(-2), encode(13, -1, Negative).floor());
EXPECT_EQ(Decimal(-2), encode(15, -1, Negative).floor());
EXPECT_EQ(Decimal(-2), encode(19, -1, Negative).floor());
EXPECT_EQ(Decimal(-2), encode(193332, -5, Negative).floor());
EXPECT_EQ(Decimal(-13), encode(12002, -3, Negative).floor());
// crbug.com/572769
EXPECT_EQ(Decimal(-1), encode(992971299197409433, -18, Negative).floor());
}
TEST_F(DecimalTest, FloorBigExponent) {
EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).floor());
EXPECT_EQ(encode(1, 1000, Negative), encode(1, 1000, Negative).floor());
}
TEST_F(DecimalTest, FloorSmallExponent) {
EXPECT_EQ(encode(0, 0, Positive), encode(1, -1000, Positive).floor());
EXPECT_EQ(encode(1, 0, Negative), encode(1, -1000, Negative).floor());
}
TEST_F(DecimalTest, FloorSpecialValues) {
EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).floor());
EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).floor());
EXPECT_EQ(Decimal::nan(), Decimal::nan().floor());
}
TEST_F(DecimalTest, FromDouble) {
EXPECT_EQ(encode(0, 0, Positive), Decimal::fromDouble(0.0));
EXPECT_EQ(encode(0, 0, Negative), Decimal::fromDouble(-0.0));
EXPECT_EQ(encode(1, 0, Positive), Decimal::fromDouble(1));
EXPECT_EQ(encode(1, 0, Negative), Decimal::fromDouble(-1));
EXPECT_EQ(encode(123, 0, Positive), Decimal::fromDouble(123));
EXPECT_EQ(encode(123, 0, Negative), Decimal::fromDouble(-123));
EXPECT_EQ(encode(1, -1, Positive), Decimal::fromDouble(0.1));
EXPECT_EQ(encode(1, -1, Negative), Decimal::fromDouble(-0.1));
}
TEST_F(DecimalTest, FromDoubleLimits) {
EXPECT_EQ(encode(UINT64_C(2220446049250313), -31, Positive),
Decimal::fromDouble(std::numeric_limits<double>::epsilon()));
EXPECT_EQ(encode(UINT64_C(2220446049250313), -31, Negative),
Decimal::fromDouble(-std::numeric_limits<double>::epsilon()));
EXPECT_EQ(encode(UINT64_C(17976931348623157), 292, Positive),
Decimal::fromDouble(std::numeric_limits<double>::max()));
EXPECT_EQ(encode(UINT64_C(17976931348623157), 292, Negative),
Decimal::fromDouble(-std::numeric_limits<double>::max()));
EXPECT_EQ(encode(UINT64_C(22250738585072014), -324, Positive),
Decimal::fromDouble(std::numeric_limits<double>::min()));
EXPECT_EQ(encode(UINT64_C(22250738585072014), -324, Negative),
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, Positive), Decimal(0));
EXPECT_EQ(encode(1, 0, Positive), Decimal(1));
EXPECT_EQ(encode(1, 0, Negative), Decimal(-1));
EXPECT_EQ(encode(100, 0, Positive), Decimal(100));
EXPECT_EQ(encode(100, 0, Negative), Decimal(-100));
EXPECT_EQ(encode(0x7FFFFFFF, 0, Positive),
Decimal(std::numeric_limits<int32_t>::max()));
EXPECT_EQ(encode(0x80000000u, 0, Negative),
Decimal(std::numeric_limits<int32_t>::min()));
}
TEST_F(DecimalTest, FromString) {
EXPECT_EQ(encode(0, 0, Positive), fromString("0"));
EXPECT_EQ(encode(0, 0, Negative), fromString("-0"));
EXPECT_EQ(Decimal(1), fromString("1"));
EXPECT_EQ(encode(1, 0, Negative), fromString("-1"));
EXPECT_EQ(Decimal(1), fromString("01"));
EXPECT_EQ(encode(3, 0, Positive), fromString("+3"));
EXPECT_EQ(encode(0, 3, Positive), fromString("0E3"));
EXPECT_EQ(encode(5, -1, Positive), fromString(".5"));
EXPECT_EQ(encode(100, 0, Positive), fromString("100"));
EXPECT_EQ(encode(100, 0, Negative), fromString("-100"));
EXPECT_EQ(encode(123, -2, Positive), fromString("1.23"));
EXPECT_EQ(encode(123, -2, Negative), fromString("-1.23"));
EXPECT_EQ(encode(123, 8, Positive), fromString("1.23E10"));
EXPECT_EQ(encode(123, 8, Negative), fromString("-1.23E10"));
EXPECT_EQ(encode(123, 8, Positive), fromString("1.23E+10"));
EXPECT_EQ(encode(123, 8, Negative), fromString("-1.23E+10"));
EXPECT_EQ(encode(123, -12, Positive), fromString("1.23E-10"));
EXPECT_EQ(encode(123, -12, Negative), fromString("-1.23E-10"));
EXPECT_EQ(encode(5, -7, Positive), fromString("0.0000005"));
EXPECT_EQ(encode(0, 0, Positive), fromString("0e9999"));
EXPECT_EQ(encode(123, -3, Positive), fromString("0.123"));
EXPECT_EQ(encode(0, -2, Positive), fromString("00.00"));
EXPECT_EQ(encode(1, 2, Positive), fromString("1E2"));
EXPECT_EQ(Decimal::infinity(Positive), fromString("1E20000"));
EXPECT_EQ(Decimal::zero(Positive), fromString("1E-20000"));
EXPECT_EQ(encode(1000, 1023, Positive), fromString("1E1026"));
EXPECT_EQ(Decimal::zero(Positive), fromString("1E-1026"));
EXPECT_EQ(Decimal::infinity(Positive), fromString("1234567890E1036"));
// 2^1024
const uint64_t leadingDigitsOf2PowerOf1024 = UINT64_C(17976931348623159);
EXPECT_EQ(encode(leadingDigitsOf2PowerOf1024, 292, Positive),
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, Positive), Decimal(0) * Decimal(0));
EXPECT_EQ(encode(2, 0, Negative), Decimal(2) * Decimal(-1));
EXPECT_EQ(encode(2, 0, Negative), Decimal(-1) * Decimal(2));
EXPECT_EQ(encode(99, 0, Positive), Decimal(99) * Decimal(1));
EXPECT_EQ(encode(2500, 0, Positive), Decimal(-50) * Decimal(-50));
EXPECT_EQ(encode(1, 21, Positive),
encode(UINT64_C(10000000000), 0, Positive) *
encode(UINT64_C(100000000000), 0, Positive));
}
TEST_F(DecimalTest, MultiplicationBigExponent) {
EXPECT_EQ(encode(1, 1022, Positive),
encode(1, 1022, Positive) * encode(1, 0, Positive));
EXPECT_EQ(Decimal::infinity(Positive),
encode(1, 1022, Positive) * encode(1, 1022, Positive));
EXPECT_EQ(encode(1, 22, Positive),
encode(1, 1022, Positive) * encode(1, -1000, Positive));
}
TEST_F(DecimalTest, MultiplicationSmallExponent) {
EXPECT_EQ(encode(1, -1022, Positive),
encode(1, -1022, Positive) * encode(1, 0, Positive));
EXPECT_EQ(encode(0, 0, Positive),
encode(1, -1022, Positive) * encode(1, -1022, Positive));
}
TEST_F(DecimalTest, MultiplicationSpecialValues) {
const Decimal Infinity(Decimal::infinity(Positive));
const Decimal MinusInfinity(Decimal::infinity(Negative));
const Decimal NaN(Decimal::nan());
const Decimal Ten(10);
const Decimal MinusTen(-10);
const Decimal Zero(Decimal::zero(Positive));
const Decimal MinusZero(Decimal::zero(Negative));
EXPECT_EQ(Infinity, Infinity * Infinity);
EXPECT_EQ(MinusInfinity, Infinity * MinusInfinity);
EXPECT_EQ(MinusInfinity, MinusInfinity * Infinity);
EXPECT_EQ(Infinity, MinusInfinity * MinusInfinity);
EXPECT_EQ(NaN, Infinity * Zero);
EXPECT_EQ(NaN, Zero * MinusInfinity);
EXPECT_EQ(NaN, MinusInfinity * Zero);
EXPECT_EQ(NaN, MinusInfinity * Zero);
EXPECT_EQ(NaN, Infinity * MinusZero);
EXPECT_EQ(NaN, MinusZero * MinusInfinity);
EXPECT_EQ(NaN, MinusInfinity * MinusZero);
EXPECT_EQ(NaN, MinusInfinity * MinusZero);
EXPECT_EQ(Infinity, Infinity * Ten);
EXPECT_EQ(Infinity, Ten * Infinity);
EXPECT_EQ(MinusInfinity, MinusInfinity * Ten);
EXPECT_EQ(MinusInfinity, Ten * MinusInfinity);
EXPECT_EQ(MinusInfinity, Infinity * MinusTen);
EXPECT_EQ(MinusInfinity, MinusTen * Infinity);
EXPECT_EQ(Infinity, MinusInfinity * MinusTen);
EXPECT_EQ(Infinity, MinusTen * MinusInfinity);
EXPECT_EQ(NaN, NaN * NaN);
EXPECT_EQ(NaN, NaN * Ten);
EXPECT_EQ(NaN, Ten * NaN);
EXPECT_EQ(NaN, NaN * Infinity);
EXPECT_EQ(NaN, NaN * MinusInfinity);
EXPECT_EQ(NaN, Infinity * NaN);
EXPECT_EQ(NaN, MinusInfinity * NaN);
}
TEST_F(DecimalTest, Negate) {
EXPECT_EQ(encode(0, 0, Negative), -encode(0, 0, Positive));
EXPECT_EQ(encode(0, 0, Positive), -encode(0, 0, Negative));
EXPECT_EQ(encode(0, 10, Negative), -encode(0, 10, Positive));
EXPECT_EQ(encode(0, 10, Positive), -encode(0, 10, Negative));
EXPECT_EQ(encode(0, -10, Negative), -encode(0, -10, Positive));
EXPECT_EQ(encode(0, -10, Positive), -encode(0, -10, Negative));
EXPECT_EQ(encode(1, 0, Negative), -encode(1, 0, Positive));
EXPECT_EQ(encode(1, 0, Positive), -encode(1, 0, Negative));
EXPECT_EQ(encode(1, 10, Negative), -encode(1, 10, Positive));
EXPECT_EQ(encode(1, 10, Positive), -encode(1, 10, Negative));
EXPECT_EQ(encode(1, -10, Negative), -encode(1, -10, Positive));
EXPECT_EQ(encode(1, -10, Positive), -encode(1, -10, Negative));
}
TEST_F(DecimalTest, NegateBigExponent) {
EXPECT_EQ(encode(1, 1000, Negative), -encode(1, 1000, Positive));
EXPECT_EQ(encode(1, 1000, Positive), -encode(1, 1000, Negative));
}
TEST_F(DecimalTest, NegateSmallExponent) {
EXPECT_EQ(encode(1, -1000, Negative), -encode(1, -1000, Positive));
EXPECT_EQ(encode(1, -1000, Positive), -encode(1, -1000, Negative));
}
TEST_F(DecimalTest, NegateSpecialValues) {
EXPECT_EQ(Decimal::infinity(Negative), -Decimal::infinity(Positive));
EXPECT_EQ(Decimal::infinity(Positive), -Decimal::infinity(Negative));
EXPECT_EQ(Decimal::nan(), -Decimal::nan());
}
TEST_F(DecimalTest, Predicates) {
EXPECT_TRUE(Decimal::zero(Positive).isFinite());
EXPECT_FALSE(Decimal::zero(Positive).isInfinity());
EXPECT_FALSE(Decimal::zero(Positive).isNaN());
EXPECT_TRUE(Decimal::zero(Positive).isPositive());
EXPECT_FALSE(Decimal::zero(Positive).isNegative());
EXPECT_FALSE(Decimal::zero(Positive).isSpecial());
EXPECT_TRUE(Decimal::zero(Positive).isZero());
EXPECT_TRUE(Decimal::zero(Negative).isFinite());
EXPECT_FALSE(Decimal::zero(Negative).isInfinity());
EXPECT_FALSE(Decimal::zero(Negative).isNaN());
EXPECT_FALSE(Decimal::zero(Negative).isPositive());
EXPECT_TRUE(Decimal::zero(Negative).isNegative());
EXPECT_FALSE(Decimal::zero(Negative).isSpecial());
EXPECT_TRUE(Decimal::zero(Negative).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(Positive).isFinite());
EXPECT_TRUE(Decimal::infinity(Positive).isInfinity());
EXPECT_FALSE(Decimal::infinity(Positive).isNaN());
EXPECT_TRUE(Decimal::infinity(Positive).isPositive());
EXPECT_FALSE(Decimal::infinity(Positive).isNegative());
EXPECT_TRUE(Decimal::infinity(Positive).isSpecial());
EXPECT_FALSE(Decimal::infinity(Positive).isZero());
EXPECT_FALSE(Decimal::infinity(Negative).isFinite());
EXPECT_TRUE(Decimal::infinity(Negative).isInfinity());
EXPECT_FALSE(Decimal::infinity(Negative).isNaN());
EXPECT_FALSE(Decimal::infinity(Negative).isPositive());
EXPECT_TRUE(Decimal::infinity(Negative).isNegative());
EXPECT_TRUE(Decimal::infinity(Negative).isSpecial());
EXPECT_FALSE(Decimal::infinity(Negative).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, Positive), encode(21, -1, Positive).remainder(3));
EXPECT_EQ(Decimal(1), Decimal(10).remainder(3));
EXPECT_EQ(Decimal(1), Decimal(10).remainder(-3));
EXPECT_EQ(encode(1, 0, Negative), Decimal(-10).remainder(3));
EXPECT_EQ(Decimal(-1), Decimal(-10).remainder(-3));
EXPECT_EQ(encode(2, -1, Positive), encode(102, -1, Positive).remainder(1));
EXPECT_EQ(encode(1, -1, Positive),
Decimal(10).remainder(encode(3, -1, Positive)));
EXPECT_EQ(Decimal(1),
encode(36, -1, Positive).remainder(encode(13, -1, Positive)));
EXPECT_EQ(encode(1, 86, Positive),
(encode(1234, 100, Positive).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, Positive),
encode(1, 1022, Positive).remainder(encode(1, 0, Positive)));
EXPECT_EQ(encode(0, 1022, Positive),
encode(1, 1022, Positive).remainder(encode(1, 1022, Positive)));
EXPECT_EQ(Decimal::infinity(Positive),
encode(1, 1022, Positive).remainder(encode(1, -1000, Positive)));
}
TEST_F(DecimalTest, RemainderSmallExponent) {
EXPECT_EQ(encode(1, -1022, Positive),
encode(1, -1022, Positive).remainder(encode(1, 0, Positive)));
EXPECT_EQ(encode(0, -1022, Positive),
encode(1, -1022, Positive).remainder(encode(1, -1022, Positive)));
}
TEST_F(DecimalTest, RemainderSpecialValues) {
EXPECT_EQ(Decimal::infinity(Positive),
Decimal::infinity(Positive).remainder(1));
EXPECT_EQ(Decimal::infinity(Negative),
Decimal::infinity(Negative).remainder(1));
EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(1));
EXPECT_EQ(Decimal::infinity(Negative),
Decimal::infinity(Positive).remainder(-1));
EXPECT_EQ(Decimal::infinity(Positive),
Decimal::infinity(Negative).remainder(-1));
EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(-1));
EXPECT_EQ(Decimal::infinity(Positive),
Decimal::infinity(Positive).remainder(3));
EXPECT_EQ(Decimal::infinity(Negative),
Decimal::infinity(Negative).remainder(3));
EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(3));
EXPECT_EQ(Decimal::infinity(Negative),
Decimal::infinity(Positive).remainder(-1));
EXPECT_EQ(Decimal::infinity(Positive),
Decimal::infinity(Negative).remainder(-1));
EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(-1));
EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::infinity(Positive)));
EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::infinity(Negative)));
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, Positive), encode(1234, 100, Positive).round());
EXPECT_EQ(Decimal(2), encode(190002, -5, Positive).round());
EXPECT_EQ(Decimal(2), encode(150002, -5, Positive).round());
EXPECT_EQ(Decimal(2), encode(150000, -5, Positive).round());
EXPECT_EQ(Decimal(12), encode(12492, -3, Positive).round());
EXPECT_EQ(Decimal(13), encode(12502, -3, Positive).round());
EXPECT_EQ(Decimal(-2), encode(190002, -5, Negative).round());
EXPECT_EQ(Decimal(-2), encode(150002, -5, Negative).round());
EXPECT_EQ(Decimal(-2), encode(150000, -5, Negative).round());
EXPECT_EQ(Decimal(-12), encode(12492, -3, Negative).round());
EXPECT_EQ(Decimal(-13), encode(12502, -3, Negative).round());
}
TEST_F(DecimalTest, RoundSpecialValues) {
EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).round());
EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).round());
EXPECT_EQ(Decimal::nan(), Decimal::nan().round());
}
TEST_F(DecimalTest, Subtract) {
EXPECT_EQ(encode(0, 0, Positive), Decimal(0) - Decimal(0));
EXPECT_EQ(encode(3, 0, Positive), Decimal(2) - Decimal(-1));
EXPECT_EQ(encode(3, 0, Negative), Decimal(-1) - Decimal(2));
EXPECT_EQ(encode(98, 0, Positive), Decimal(99) - Decimal(1));
EXPECT_EQ(encode(0, 0, Positive), Decimal(-50) - Decimal(-50));
EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive),
encode(1, 50, Positive) - Decimal(1));
EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Negative),
Decimal(1) - encode(1, 50, Positive));
}
TEST_F(DecimalTest, SubtractBigExponent) {
EXPECT_EQ(encode(1, 1022, Positive),
encode(1, 1022, Positive) - encode(1, 0, Positive));
EXPECT_EQ(encode(0, 0, Positive),
encode(1, 1022, Positive) - encode(1, 1022, Positive));
EXPECT_EQ(encode(1, 1022, Positive),
encode(1, 1022, Positive) + encode(1, -1000, Positive));
}
TEST_F(DecimalTest, SubtractSmallExponent) {
EXPECT_EQ(encode(UINT64_C(10000000000000000), -16, Negative),
encode(1, -1022, Positive) - encode(1, 0, Positive));
EXPECT_EQ(encode(0, 0, Positive),
encode(1, -1022, Positive) - encode(1, -1022, Positive));
}
TEST_F(DecimalTest, SubtractSpecialValues) {
const Decimal Infinity(Decimal::infinity(Positive));
const Decimal MinusInfinity(Decimal::infinity(Negative));
const Decimal NaN(Decimal::nan());
const Decimal Ten(10);
EXPECT_EQ(NaN, Infinity - Infinity);
EXPECT_EQ(Infinity, Infinity - MinusInfinity);
EXPECT_EQ(MinusInfinity, MinusInfinity - Infinity);
EXPECT_EQ(NaN, MinusInfinity - MinusInfinity);
EXPECT_EQ(Infinity, Infinity - Ten);
EXPECT_EQ(MinusInfinity, Ten - Infinity);
EXPECT_EQ(MinusInfinity, MinusInfinity - Ten);
EXPECT_EQ(Infinity, Ten - MinusInfinity);
EXPECT_EQ(NaN, NaN - NaN);
EXPECT_EQ(NaN, NaN - Ten);
EXPECT_EQ(NaN, Ten - NaN);
EXPECT_EQ(NaN, NaN - Infinity);
EXPECT_EQ(NaN, NaN - MinusInfinity);
EXPECT_EQ(NaN, Infinity - NaN);
EXPECT_EQ(NaN, MinusInfinity - NaN);
}
TEST_F(DecimalTest, ToDouble) {
EXPECT_EQ(0.0, encode(0, 0, Positive).toDouble());
EXPECT_EQ(-0.0, encode(0, 0, Negative).toDouble());
EXPECT_EQ(1.0, encode(1, 0, Positive).toDouble());
EXPECT_EQ(-1.0, encode(1, 0, Negative).toDouble());
EXPECT_EQ(0.1, encode(1, -1, Positive).toDouble());
EXPECT_EQ(-0.1, encode(1, -1, Negative).toDouble());
EXPECT_EQ(0.3, encode(3, -1, Positive).toDouble());
EXPECT_EQ(-0.3, encode(3, -1, Negative).toDouble());
EXPECT_EQ(0.6, encode(6, -1, Positive).toDouble());
EXPECT_EQ(-0.6, encode(6, -1, Negative).toDouble());
EXPECT_EQ(0.7, encode(7, -1, Positive).toDouble());
EXPECT_EQ(-0.7, encode(7, -1, Negative).toDouble());
EXPECT_EQ(0.01, encode(1, -2, Positive).toDouble());
EXPECT_EQ(0.001, encode(1, -3, Positive).toDouble());
EXPECT_EQ(0.0001, encode(1, -4, Positive).toDouble());
EXPECT_EQ(0.00001, encode(1, -5, Positive).toDouble());
EXPECT_EQ(1e+308, encode(1, 308, Positive).toDouble());
EXPECT_EQ(1e-307, encode(1, -307, Positive).toDouble());
EXPECT_TRUE(std::isinf(encode(1, 1000, Positive).toDouble()));
EXPECT_EQ(0.0, encode(1, -1000, Positive).toDouble());
}
TEST_F(DecimalTest, ToDoubleSpecialValues) {
EXPECT_TRUE(std::isinf(Decimal::infinity(Decimal::Positive).toDouble()));
EXPECT_TRUE(std::isinf(Decimal::infinity(Decimal::Negative).toDouble()));
EXPECT_TRUE(std::isnan(Decimal::nan().toDouble()));
}
TEST_F(DecimalTest, ToString) {
EXPECT_DECIMAL_STREQ("0", Decimal::zero(Positive));
EXPECT_DECIMAL_STREQ("-0", Decimal::zero(Negative));
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, Positive));
EXPECT_DECIMAL_STREQ("-0.5", encode(5, -1, Negative));
EXPECT_DECIMAL_STREQ("12.345", encode(12345, -3, Positive));
EXPECT_DECIMAL_STREQ("-12.345", encode(12345, -3, Negative));
EXPECT_DECIMAL_STREQ("0.12345", encode(12345, -5, Positive));
EXPECT_DECIMAL_STREQ("-0.12345", encode(12345, -5, Negative));
EXPECT_DECIMAL_STREQ("50", encode(50, 0, Positive));
EXPECT_DECIMAL_STREQ("-50", encode(50, 0, Negative));
EXPECT_DECIMAL_STREQ("5e+1", encode(5, 1, Positive));
EXPECT_DECIMAL_STREQ("-5e+1", encode(5, 1, Negative));
EXPECT_DECIMAL_STREQ("5.678e+103", encode(5678, 100, Positive));
EXPECT_DECIMAL_STREQ("-5.678e+103", encode(5678, 100, Negative));
EXPECT_DECIMAL_STREQ("5.678e-97", encode(5678, -100, Positive));
EXPECT_DECIMAL_STREQ("-5.678e-97", encode(5678, -100, Negative));
EXPECT_DECIMAL_STREQ("8639999913600001",
encode(UINT64_C(8639999913600001), 0, Positive));
EXPECT_DECIMAL_STREQ(
"9007199254740991",
encode((static_cast<uint64_t>(1) << DBL_MANT_DIG) - 1, 0, Positive));
EXPECT_DECIMAL_STREQ("99999999999999999",
encode(UINT64_C(99999999999999999), 0, Positive));
EXPECT_DECIMAL_STREQ("9.9999999999999999e+17",
encode(UINT64_C(99999999999999999), 1, Positive));
EXPECT_DECIMAL_STREQ("9.9999999999999999e+18",
encode(UINT64_C(99999999999999999), 2, Positive));
EXPECT_DECIMAL_STREQ("1e+16",
encode(UINT64_C(99999999999999999), -1, Positive));
EXPECT_DECIMAL_STREQ("1000000000000000",
encode(UINT64_C(99999999999999999), -2, Positive));
EXPECT_DECIMAL_STREQ("1", encode(UINT64_C(99999999999999999), -17, Positive));
EXPECT_DECIMAL_STREQ("0.001",
encode(UINT64_C(99999999999999999), -20, Positive));
EXPECT_DECIMAL_STREQ("1e-83",
encode(UINT64_C(99999999999999999), -100, Positive));
}
TEST_F(DecimalTest, ToStringSpecialValues) {
EXPECT_DECIMAL_STREQ("Infinity", Decimal::infinity(Positive));
EXPECT_DECIMAL_STREQ("-Infinity", Decimal::infinity(Negative));
EXPECT_DECIMAL_STREQ("NaN", Decimal::nan());
}
} // namespace blink