Home | History | Annotate | Download | only in platform
      1 /*
      2  * Copyright (C) 2012 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 #include "platform/Decimal.h"
     33 
     34 #include "wtf/MathExtras.h"
     35 #include "wtf/text/CString.h"
     36 #include <float.h>
     37 #include <gtest/gtest.h>
     38 
     39 namespace WebCore {
     40 
     41 std::ostream& operator<<(std::ostream& os, const Decimal& decimal)
     42 {
     43     Decimal::EncodedData data = decimal.value();
     44     return os
     45         << "encode(" << String::number(data.coefficient()).ascii().data()
     46         << ", " << String::number(data.exponent()).ascii().data()
     47         << ", " << (data.sign() == Decimal::Negative ? "Negative" : "Positive")
     48         << ")=" << decimal.toString().ascii().data();
     49 }
     50 
     51 } // namespace WebCore
     52 
     53 using namespace WebCore;
     54 
     55 // Simulate WebCore/html/StepRange
     56 class DecimalStepRange {
     57 public:
     58     Decimal maximum;
     59     Decimal minimum;
     60     Decimal step;
     61 
     62     DecimalStepRange(const Decimal& minimum, const Decimal& maximum, const Decimal& step)
     63         : maximum(maximum)
     64         , minimum(minimum)
     65         , step(step)
     66     {
     67     }
     68 
     69     Decimal clampValue(Decimal value) const
     70     {
     71         const Decimal result = minimum + ((value - minimum) / step).round() * step;
     72         ASSERT(result.isFinite());
     73         return result > maximum ? result - step : result;
     74     }
     75 };
     76 
     77 class DecimalTest : public ::testing::Test {
     78 protected:
     79     typedef Decimal::Sign Sign;
     80     protected: static const Sign Positive = Decimal::Positive;
     81     protected: static const Sign Negative = Decimal::Negative;
     82 
     83     Decimal encode(uint64_t coefficient, int exponent, Sign sign)
     84     {
     85         return Decimal(sign, exponent, coefficient);
     86     }
     87 
     88     protected: Decimal fromString(const String& string)
     89     {
     90         return Decimal::fromString(string);
     91     }
     92 
     93     protected: Decimal stepDown(const String& minimum, const String& maximum, const String& step, const String& valueString, int numberOfStepTimes)
     94     {
     95         DecimalStepRange stepRange(fromString(minimum), fromString(maximum), fromString(step));
     96         Decimal value = fromString(valueString);
     97         for (int i = 0; i < numberOfStepTimes; ++i) {
     98             value -= stepRange.step;
     99             value = stepRange.clampValue(value);
    100         }
    101         return value;
    102     }
    103 
    104     protected: Decimal stepUp(const String& minimum, const String& maximum, const String& step, const String& valueString, int numberOfStepTimes)
    105     {
    106         DecimalStepRange stepRange(fromString(minimum), fromString(maximum), fromString(step));
    107         Decimal value = fromString(valueString);
    108         for (int i = 0; i < numberOfStepTimes; ++i) {
    109             value += stepRange.step;
    110             value = stepRange.clampValue(value);
    111         }
    112         return value;
    113     }
    114 };
    115 
    116 // FIXME: We should use expectedSign without "Decimal::", however, g++ causes undefined references for DecimalTest::Positive and Negative.
    117 #define EXPECT_DECIMAL_ENCODED_DATA_EQ(expectedCoefficient, expectedExponent,  expectedSign, decimal) \
    118     EXPECT_EQ((expectedCoefficient), (decimal).value().coefficient()); \
    119     EXPECT_EQ((expectedExponent), (decimal).value().exponent()); \
    120     EXPECT_EQ(Decimal::expectedSign, (decimal).value().sign());
    121 
    122 #define EXPECT_DECIMAL_STREQ(expected, decimal) EXPECT_STREQ((expected), (decimal).toString().ascii().data())
    123 
    124 TEST_F(DecimalTest, Abs)
    125 {
    126     EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Positive).abs());
    127     EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Negative).abs());
    128 
    129     EXPECT_EQ(encode(0, 10, Positive), encode(0, 10, Positive).abs());
    130     EXPECT_EQ(encode(0, 10, Positive), encode(0, 10, Negative).abs());
    131 
    132     EXPECT_EQ(encode(0, -10, Positive), encode(0, -10, Positive).abs());
    133     EXPECT_EQ(encode(0, -10, Positive), encode(0, -10, Negative).abs());
    134 
    135     EXPECT_EQ(encode(1, 0, Positive), encode(1, 0, Positive).abs());
    136     EXPECT_EQ(encode(1, 0, Positive), encode(1, 0, Negative).abs());
    137 
    138     EXPECT_EQ(encode(1, 10, Positive), encode(1, 10, Positive).abs());
    139     EXPECT_EQ(encode(1, 10, Positive), encode(1, 10, Negative).abs());
    140 
    141     EXPECT_EQ(encode(1, -10, Positive), encode(1, -10, Positive).abs());
    142     EXPECT_EQ(encode(1, -10, Positive), encode(1, -10, Negative).abs());
    143 }
    144 
    145 TEST_F(DecimalTest, AbsBigExponent)
    146 {
    147     EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).abs());
    148     EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Negative).abs());
    149 }
    150 
    151 TEST_F(DecimalTest, AbsSmallExponent)
    152 {
    153     EXPECT_EQ(encode(1, -1000, Positive), encode(1, -1000, Positive).abs());
    154     EXPECT_EQ(encode(1, -1000, Positive), encode(1, -1000, Negative).abs());
    155 }
    156 
    157 TEST_F(DecimalTest, AbsSpecialValues)
    158 {
    159     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).abs());
    160     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).abs());
    161     EXPECT_EQ(Decimal::nan(), Decimal::nan().abs());
    162 }
    163 
    164 TEST_F(DecimalTest, Add)
    165 {
    166     EXPECT_EQ(encode(0, 0, Positive), Decimal(0) + Decimal(0));
    167     EXPECT_EQ(Decimal(1), Decimal(2) + Decimal(-1));
    168     EXPECT_EQ(Decimal(1), Decimal(-1) + Decimal(2));
    169     EXPECT_EQ(encode(100, 0, Positive), Decimal(99) + Decimal(1));
    170     EXPECT_EQ(encode(100, 0, Negative), Decimal(-50) + Decimal(-50));
    171     EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive), encode(1, 50, Positive) + Decimal(1));
    172     EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive), Decimal(1) + encode(1, 50, Positive));
    173     EXPECT_EQ(encode(UINT64_C(10000000001), 0, Positive), encode(1, 10, Positive) + Decimal(1));
    174     EXPECT_EQ(encode(UINT64_C(10000000001), 0, Positive), Decimal(1) + encode(1, 10, Positive));
    175     EXPECT_EQ(encode(1, 0, Positive), encode(1, -1022, Positive) + encode(1, 0, Positive));
    176     EXPECT_EQ(encode(2, -1022, Positive), encode(1, -1022, Positive) + encode(1, -1022, Positive));
    177 }
    178 
    179 TEST_F(DecimalTest, AddBigExponent)
    180 {
    181     EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) + encode(1, 0, Positive));
    182     EXPECT_EQ(encode(2, 1022, Positive), encode(1, 1022, Positive) + encode(1, 1022, Positive));
    183     EXPECT_EQ(Decimal::infinity(Positive), encode(std::numeric_limits<uint64_t>::max(), 1022, Positive) + encode(1, 0, Positive));
    184     EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) + encode(1, -1000, Positive));
    185 }
    186 
    187 TEST_F(DecimalTest, AddSmallExponent)
    188 {
    189     EXPECT_EQ(encode(1, 0, Positive), encode(1, -1022, Positive) + encode(1, 0, Positive));
    190     EXPECT_EQ(encode(2, -1022, Positive), encode(1, -1022, Positive) + encode(1, -1022, Positive));
    191 }
    192 
    193 TEST_F(DecimalTest, AddSpecialValues)
    194 {
    195     const Decimal Infinity(Decimal::infinity(Positive));
    196     const Decimal MinusInfinity(Decimal::infinity(Negative));
    197     const Decimal NaN(Decimal::nan());
    198     const Decimal Ten(10);
    199 
    200     EXPECT_EQ(Infinity, Infinity + Infinity);
    201     EXPECT_EQ(NaN, Infinity + MinusInfinity);
    202     EXPECT_EQ(NaN, MinusInfinity + Infinity);
    203     EXPECT_EQ(MinusInfinity, MinusInfinity + MinusInfinity);
    204 
    205     EXPECT_EQ(Infinity, Infinity + Ten);
    206     EXPECT_EQ(Infinity, Ten + Infinity);
    207     EXPECT_EQ(MinusInfinity, MinusInfinity + Ten);
    208     EXPECT_EQ(MinusInfinity, Ten + MinusInfinity);
    209 
    210     EXPECT_EQ(NaN, NaN + NaN);
    211     EXPECT_EQ(NaN, NaN + Ten);
    212     EXPECT_EQ(NaN, Ten + NaN);
    213 
    214     EXPECT_EQ(NaN, NaN - Infinity);
    215     EXPECT_EQ(NaN, NaN - MinusInfinity);
    216     EXPECT_EQ(NaN, Infinity - NaN);
    217     EXPECT_EQ(NaN, MinusInfinity - NaN);
    218 }
    219 
    220 TEST_F(DecimalTest, Ceiling)
    221 {
    222     EXPECT_EQ(Decimal(1), Decimal(1).ceiling());
    223     EXPECT_EQ(Decimal(1), encode(1, -10, Positive).ceiling());
    224     EXPECT_EQ(Decimal(2), encode(11, -1, Positive).ceiling());
    225     EXPECT_EQ(Decimal(2), encode(13, -1, Positive).ceiling());
    226     EXPECT_EQ(Decimal(2), encode(15, -1, Positive).ceiling());
    227     EXPECT_EQ(Decimal(2), encode(19, -1, Positive).ceiling());
    228     EXPECT_EQ(Decimal(2), encode(151, -2, Positive).ceiling());
    229     EXPECT_EQ(Decimal(2), encode(101, -2, Positive).ceiling());
    230     EXPECT_EQ(Decimal(1), encode(199, -3, Positive).ceiling());
    231     EXPECT_EQ(Decimal(2), encode(199, -2, Positive).ceiling());
    232     EXPECT_EQ(Decimal(3), encode(209, -2, Positive).ceiling());
    233 
    234     EXPECT_EQ(Decimal(-1), Decimal(-1).ceiling());
    235     EXPECT_EQ(Decimal(0), encode(1, -10, Negative).ceiling());
    236     EXPECT_EQ(Decimal(-1), encode(11, -1, Negative).ceiling());
    237     EXPECT_EQ(Decimal(-1), encode(13, -1, Negative).ceiling());
    238     EXPECT_EQ(Decimal(-1), encode(15, -1, Negative).ceiling());
    239     EXPECT_EQ(Decimal(-1), encode(19, -1, Negative).ceiling());
    240     EXPECT_EQ(Decimal(-1), encode(151, -2, Negative).ceiling());
    241     EXPECT_EQ(Decimal(-1), encode(101, -2, Negative).ceiling());
    242     EXPECT_EQ(Decimal(0), encode(199, -3, Negative).ceiling());
    243     EXPECT_EQ(Decimal(-1), encode(199, -2, Negative).ceiling());
    244     EXPECT_EQ(Decimal(-2), encode(209, -2, Negative).ceiling());
    245 }
    246 
    247 TEST_F(DecimalTest, CeilingBigExponent)
    248 {
    249     EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).ceiling());
    250     EXPECT_EQ(encode(1, 1000, Negative), encode(1, 1000, Negative).ceiling());
    251 }
    252 
    253 TEST_F(DecimalTest, CeilingSmallExponent)
    254 {
    255     EXPECT_EQ(encode(1, 0, Positive), encode(1, -1000, Positive).ceiling());
    256     EXPECT_EQ(encode(0, 0, Negative), encode(1, -1000, Negative).ceiling());
    257 }
    258 
    259 TEST_F(DecimalTest, CeilingSpecialValues)
    260 {
    261     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).ceiling());
    262     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).ceiling());
    263     EXPECT_EQ(Decimal::nan(), Decimal::nan().ceiling());
    264 }
    265 
    266 TEST_F(DecimalTest, Compare)
    267 {
    268     EXPECT_TRUE(Decimal(0) == Decimal(0));
    269     EXPECT_TRUE(Decimal(0) != Decimal(1));
    270     EXPECT_TRUE(Decimal(0) < Decimal(1));
    271     EXPECT_TRUE(Decimal(0) <= Decimal(0));
    272     EXPECT_TRUE(Decimal(0) > Decimal(-1));
    273     EXPECT_TRUE(Decimal(0) >= Decimal(0));
    274 
    275     EXPECT_FALSE(Decimal(1) == Decimal(2));
    276     EXPECT_FALSE(Decimal(1) != Decimal(1));
    277     EXPECT_FALSE(Decimal(1) < Decimal(0));
    278     EXPECT_FALSE(Decimal(1) <= Decimal(0));
    279     EXPECT_FALSE(Decimal(1) > Decimal(2));
    280     EXPECT_FALSE(Decimal(1) >= Decimal(2));
    281 }
    282 
    283 TEST_F(DecimalTest, CompareBigExponent)
    284 {
    285     EXPECT_TRUE(encode(1, 1000, Positive) == encode(1, 1000, Positive));
    286     EXPECT_FALSE(encode(1, 1000, Positive) != encode(1, 1000, Positive));
    287     EXPECT_FALSE(encode(1, 1000, Positive) < encode(1, 1000, Positive));
    288     EXPECT_TRUE(encode(1, 1000, Positive) <= encode(1, 1000, Positive));
    289     EXPECT_FALSE(encode(1, 1000, Positive) > encode(1, 1000, Positive));
    290     EXPECT_TRUE(encode(1, 1000, Positive) >= encode(1, 1000, Positive));
    291 
    292     EXPECT_TRUE(encode(1, 1000, Negative) == encode(1, 1000, Negative));
    293     EXPECT_FALSE(encode(1, 1000, Negative) != encode(1, 1000, Negative));
    294     EXPECT_FALSE(encode(1, 1000, Negative) < encode(1, 1000, Negative));
    295     EXPECT_TRUE(encode(1, 1000, Negative) <= encode(1, 1000, Negative));
    296     EXPECT_FALSE(encode(1, 1000, Negative) > encode(1, 1000, Negative));
    297     EXPECT_TRUE(encode(1, 1000, Negative) >= encode(1, 1000, Negative));
    298 
    299     EXPECT_FALSE(encode(2, 1000, Positive) == encode(1, 1000, Positive));
    300     EXPECT_TRUE(encode(2, 1000, Positive) != encode(1, 1000, Positive));
    301     EXPECT_FALSE(encode(2, 1000, Positive) < encode(1, 1000, Positive));
    302     EXPECT_FALSE(encode(2, 1000, Positive) <= encode(1, 1000, Positive));
    303     EXPECT_TRUE(encode(2, 1000, Positive) > encode(1, 1000, Positive));
    304     EXPECT_TRUE(encode(2, 1000, Positive) >= encode(1, 1000, Positive));
    305 
    306     EXPECT_FALSE(encode(2, 1000, Negative) == encode(1, 1000, Negative));
    307     EXPECT_TRUE(encode(2, 1000, Negative) != encode(1, 1000, Negative));
    308     EXPECT_TRUE(encode(2, 1000, Negative) < encode(1, 1000, Negative));
    309     EXPECT_TRUE(encode(2, 1000, Negative) <= encode(1, 1000, Negative));
    310     EXPECT_FALSE(encode(2, 1000, Negative) > encode(1, 1000, Negative));
    311     EXPECT_FALSE(encode(2, 1000, Negative) >= encode(1, 1000, Negative));
    312 }
    313 
    314 TEST_F(DecimalTest, CompareSmallExponent)
    315 {
    316     EXPECT_TRUE(encode(1, -1000, Positive) == encode(1, -1000, Positive));
    317     EXPECT_FALSE(encode(1, -1000, Positive) != encode(1, -1000, Positive));
    318     EXPECT_FALSE(encode(1, -1000, Positive) < encode(1, -1000, Positive));
    319     EXPECT_TRUE(encode(1, -1000, Positive) <= encode(1, -1000, Positive));
    320     EXPECT_FALSE(encode(1, -1000, Positive) > encode(1, -1000, Positive));
    321     EXPECT_TRUE(encode(1, -1000, Positive) >= encode(1, -1000, Positive));
    322 
    323     EXPECT_TRUE(encode(1, -1000, Negative) == encode(1, -1000, Negative));
    324     EXPECT_FALSE(encode(1, -1000, Negative) != encode(1, -1000, Negative));
    325     EXPECT_FALSE(encode(1, -1000, Negative) < encode(1, -1000, Negative));
    326     EXPECT_TRUE(encode(1, -1000, Negative) <= encode(1, -1000, Negative));
    327     EXPECT_FALSE(encode(1, -1000, Negative) > encode(1, -1000, Negative));
    328     EXPECT_TRUE(encode(1, -1000, Negative) >= encode(1, -1000, Negative));
    329 
    330     EXPECT_FALSE(encode(2, -1000, Positive) == encode(1, -1000, Positive));
    331     EXPECT_TRUE(encode(2, -1000, Positive) != encode(1, -1000, Positive));
    332     EXPECT_FALSE(encode(2, -1000, Positive) < encode(1, -1000, Positive));
    333     EXPECT_FALSE(encode(2, -1000, Positive) <= encode(1, -1000, Positive));
    334     EXPECT_TRUE(encode(2, -1000, Positive) > encode(1, -1000, Positive));
    335     EXPECT_TRUE(encode(2, -1000, Positive) >= encode(1, -1000, Positive));
    336 
    337     EXPECT_FALSE(encode(2, -1000, Negative) == encode(1, -1000, Negative));
    338     EXPECT_TRUE(encode(2, -1000, Negative) != encode(1, -1000, Negative));
    339     EXPECT_TRUE(encode(2, -1000, Negative) < encode(1, -1000, Negative));
    340     EXPECT_TRUE(encode(2, -1000, Negative) <= encode(1, -1000, Negative));
    341     EXPECT_FALSE(encode(2, -1000, Negative) > encode(1, -1000, Negative));
    342     EXPECT_FALSE(encode(2, -1000, Negative) >= encode(1, -1000, Negative));
    343 }
    344 
    345 TEST_F(DecimalTest, CompareSpecialValues)
    346 {
    347     const Decimal Infinity(Decimal::infinity(Positive));
    348     const Decimal MinusInfinity(Decimal::infinity(Negative));
    349     const Decimal NaN(Decimal::nan());
    350     const Decimal Zero(Decimal::zero(Positive));
    351     const Decimal MinusZero(Decimal::zero(Negative));
    352     const Decimal Ten(10);
    353 
    354     EXPECT_TRUE(Zero == Zero);
    355     EXPECT_FALSE(Zero != Zero);
    356     EXPECT_FALSE(Zero < Zero);
    357     EXPECT_TRUE(Zero <= Zero);
    358     EXPECT_FALSE(Zero > Zero);
    359     EXPECT_TRUE(Zero >= Zero);
    360 
    361     EXPECT_TRUE(Zero == MinusZero);
    362     EXPECT_FALSE(Zero != MinusZero);
    363     EXPECT_FALSE(Zero < MinusZero);
    364     EXPECT_TRUE(Zero <= MinusZero);
    365     EXPECT_FALSE(Zero > MinusZero);
    366     EXPECT_TRUE(Zero >= MinusZero);
    367 
    368     EXPECT_TRUE(MinusZero == Zero);
    369     EXPECT_FALSE(MinusZero != Zero);
    370     EXPECT_FALSE(MinusZero < Zero);
    371     EXPECT_TRUE(MinusZero <= Zero);
    372     EXPECT_FALSE(MinusZero > Zero);
    373     EXPECT_TRUE(MinusZero >= Zero);
    374 
    375     EXPECT_TRUE(MinusZero == MinusZero);
    376     EXPECT_FALSE(MinusZero != MinusZero);
    377     EXPECT_FALSE(MinusZero < MinusZero);
    378     EXPECT_TRUE(MinusZero <= MinusZero);
    379     EXPECT_FALSE(MinusZero > MinusZero);
    380     EXPECT_TRUE(MinusZero >= MinusZero);
    381 
    382     EXPECT_TRUE(Infinity == Infinity);
    383     EXPECT_FALSE(Infinity != Infinity);
    384     EXPECT_FALSE(Infinity < Infinity);
    385     EXPECT_TRUE(Infinity <= Infinity);
    386     EXPECT_FALSE(Infinity > Infinity);
    387     EXPECT_TRUE(Infinity >= Infinity);
    388 
    389     EXPECT_FALSE(Infinity == Ten);
    390     EXPECT_TRUE(Infinity != Ten);
    391     EXPECT_FALSE(Infinity < Ten);
    392     EXPECT_FALSE(Infinity <= Ten);
    393     EXPECT_TRUE(Infinity > Ten);
    394     EXPECT_TRUE(Infinity >= Ten);
    395 
    396     EXPECT_FALSE(Infinity == MinusInfinity);
    397     EXPECT_TRUE(Infinity != MinusInfinity);
    398     EXPECT_FALSE(Infinity < MinusInfinity);
    399     EXPECT_FALSE(Infinity <= MinusInfinity);
    400     EXPECT_TRUE(Infinity > MinusInfinity);
    401     EXPECT_TRUE(Infinity >= MinusInfinity);
    402 
    403     EXPECT_FALSE(Infinity == NaN);
    404     EXPECT_FALSE(Infinity != NaN);
    405     EXPECT_FALSE(Infinity < NaN);
    406     EXPECT_FALSE(Infinity <= NaN);
    407     EXPECT_FALSE(Infinity > NaN);
    408     EXPECT_FALSE(Infinity >= NaN);
    409 
    410     EXPECT_FALSE(MinusInfinity == Infinity);
    411     EXPECT_TRUE(MinusInfinity != Infinity);
    412     EXPECT_TRUE(MinusInfinity < Infinity);
    413     EXPECT_TRUE(MinusInfinity <= Infinity);
    414     EXPECT_FALSE(MinusInfinity > Infinity);
    415     EXPECT_FALSE(MinusInfinity >= Infinity);
    416 
    417     EXPECT_FALSE(MinusInfinity == Ten);
    418     EXPECT_TRUE(MinusInfinity != Ten);
    419     EXPECT_TRUE(MinusInfinity < Ten);
    420     EXPECT_TRUE(MinusInfinity <= Ten);
    421     EXPECT_FALSE(MinusInfinity > Ten);
    422     EXPECT_FALSE(MinusInfinity >= Ten);
    423 
    424     EXPECT_TRUE(MinusInfinity == MinusInfinity);
    425     EXPECT_FALSE(MinusInfinity != MinusInfinity);
    426     EXPECT_FALSE(MinusInfinity < MinusInfinity);
    427     EXPECT_TRUE(MinusInfinity <= MinusInfinity);
    428     EXPECT_FALSE(MinusInfinity > MinusInfinity);
    429     EXPECT_TRUE(MinusInfinity >= MinusInfinity);
    430 
    431     EXPECT_FALSE(MinusInfinity == NaN);
    432     EXPECT_FALSE(MinusInfinity != NaN);
    433     EXPECT_FALSE(MinusInfinity < NaN);
    434     EXPECT_FALSE(MinusInfinity <= NaN);
    435     EXPECT_FALSE(MinusInfinity > NaN);
    436     EXPECT_FALSE(MinusInfinity >= NaN);
    437 
    438     EXPECT_FALSE(NaN == Infinity);
    439     EXPECT_FALSE(NaN != Infinity);
    440     EXPECT_FALSE(NaN < Infinity);
    441     EXPECT_FALSE(NaN <= Infinity);
    442     EXPECT_FALSE(NaN > Infinity);
    443     EXPECT_FALSE(NaN >= Infinity);
    444 
    445     EXPECT_FALSE(NaN == Ten);
    446     EXPECT_FALSE(NaN != Ten);
    447     EXPECT_FALSE(NaN < Ten);
    448     EXPECT_FALSE(NaN <= Ten);
    449     EXPECT_FALSE(NaN > Ten);
    450     EXPECT_FALSE(NaN >= Ten);
    451 
    452     EXPECT_FALSE(NaN == MinusInfinity);
    453     EXPECT_FALSE(NaN != MinusInfinity);
    454     EXPECT_FALSE(NaN < MinusInfinity);
    455     EXPECT_FALSE(NaN <= MinusInfinity);
    456     EXPECT_FALSE(NaN > MinusInfinity);
    457     EXPECT_FALSE(NaN >= MinusInfinity);
    458 
    459     EXPECT_TRUE(NaN == NaN);
    460     EXPECT_FALSE(NaN != NaN);
    461     EXPECT_FALSE(NaN < NaN);
    462     EXPECT_TRUE(NaN <= NaN);
    463     EXPECT_FALSE(NaN > NaN);
    464     EXPECT_TRUE(NaN >= NaN);
    465 }
    466 
    467 TEST_F(DecimalTest, Constructor)
    468 {
    469     EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Positive, encode(0, 0, Positive));
    470     EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Negative, encode(0, 0, Negative));
    471     EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, Positive, encode(1, 0, Positive));
    472     EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, Negative, encode(1, 0, Negative));
    473     EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, Positive, encode(1, 1022, Positive));
    474     EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, Negative, encode(1, 1022, Negative));
    475     EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, Positive, encode(1, 1023, Positive));
    476     EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, Negative, encode(1, 1023, Negative));
    477     EXPECT_TRUE(encode(1, 2000, Positive).isInfinity());
    478     EXPECT_TRUE(encode(1, 2000, Negative).isInfinity());
    479     EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Positive, encode(1, -2000, Positive));
    480     EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Negative, encode(1, -2000, Negative));
    481     EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999998), 0, Positive, encode(UINT64_C(99999999999999998), 0, Positive));
    482     EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999998), 0, Negative, encode(UINT64_C(99999999999999998), 0, Negative));
    483     EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999999), 0, Positive, encode(UINT64_C(99999999999999999), 0, Positive));
    484     EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999999), 0, Negative, encode(UINT64_C(99999999999999999), 0, Negative));
    485     EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(100000000000000000), 0, Positive, encode(UINT64_C(100000000000000000), 0, Positive));
    486     EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(100000000000000000), 0, Negative, encode(UINT64_C(100000000000000000), 0, Negative));
    487 }
    488 
    489 TEST_F(DecimalTest, Division)
    490 {
    491     EXPECT_EQ(encode(0, 0, Positive), Decimal(0) / Decimal(1));
    492     EXPECT_EQ(encode(2, 0, Negative), Decimal(2) / Decimal(-1));
    493     EXPECT_EQ(encode(5, -1, Negative), Decimal(-1) / Decimal(2));
    494     EXPECT_EQ(encode(99, 0, Positive), Decimal(99) / Decimal(1));
    495     EXPECT_EQ(Decimal(1), Decimal(-50) / Decimal(-50));
    496     EXPECT_EQ(encode(UINT64_C(33333333333333333), -17, Positive), Decimal(1) / Decimal(3));
    497     EXPECT_EQ(encode(UINT64_C(12345678901234), -1, Positive), encode(UINT64_C(12345678901234), 0, Positive) / Decimal(10));
    498 }
    499 
    500 TEST_F(DecimalTest, DivisionBigExponent)
    501 {
    502     EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) / encode(1, 0, Positive));
    503     EXPECT_EQ(encode(1, 0, Positive), encode(1, 1022, Positive) / encode(1, 1022, Positive));
    504     EXPECT_EQ(Decimal::infinity(Positive), encode(1, 1022, Positive) / encode(1, -1000, Positive));
    505 }
    506 
    507 TEST_F(DecimalTest, DivisionSmallExponent)
    508 {
    509     EXPECT_EQ(encode(1, -1022, Positive), encode(1, -1022, Positive) / encode(1, 0, Positive));
    510     EXPECT_EQ(encode(1, 0, Positive), encode(1, -1022, Positive) / encode(1, -1022, Positive));
    511 }
    512 
    513 TEST_F(DecimalTest, DivisionSpecialValues)
    514 {
    515     const Decimal Infinity(Decimal::infinity(Positive));
    516     const Decimal MinusInfinity(Decimal::infinity(Negative));
    517     const Decimal NaN(Decimal::nan());
    518     const Decimal Zero(Decimal::zero(Positive));
    519     const Decimal MinusZero(Decimal::zero(Negative));
    520     const Decimal Ten(10);
    521     const Decimal MinusTen(-10);
    522 
    523     EXPECT_EQ(NaN, Zero / Zero);
    524     EXPECT_EQ(NaN, Zero / MinusZero);
    525     EXPECT_EQ(NaN, MinusZero / Zero);
    526     EXPECT_EQ(NaN, MinusZero / MinusZero);
    527 
    528     EXPECT_EQ(Infinity, Ten / Zero);
    529     EXPECT_EQ(MinusInfinity, Ten / MinusZero);
    530     EXPECT_EQ(MinusInfinity, MinusTen / Zero);
    531     EXPECT_EQ(Infinity, MinusTen / MinusZero);
    532 
    533     EXPECT_EQ(Infinity, Infinity / Zero);
    534     EXPECT_EQ(MinusInfinity, Infinity / MinusZero);
    535     EXPECT_EQ(MinusInfinity, MinusInfinity / Zero);
    536     EXPECT_EQ(Infinity, MinusInfinity / MinusZero);
    537 
    538     EXPECT_EQ(NaN, Infinity / Infinity);
    539     EXPECT_EQ(NaN, Infinity / MinusInfinity);
    540     EXPECT_EQ(NaN, MinusInfinity / Infinity);
    541     EXPECT_EQ(NaN, MinusInfinity / MinusInfinity);
    542 
    543     EXPECT_EQ(Zero, Ten / Infinity);
    544     EXPECT_EQ(MinusZero, Ten / MinusInfinity);
    545     EXPECT_EQ(MinusZero, MinusTen / Infinity);
    546     EXPECT_EQ(Zero, MinusTen / MinusInfinity);
    547 
    548     EXPECT_EQ(NaN, NaN / NaN);
    549     EXPECT_EQ(NaN, NaN / Ten);
    550     EXPECT_EQ(NaN, Ten / NaN);
    551 
    552     EXPECT_EQ(NaN, NaN / Infinity);
    553     EXPECT_EQ(NaN, NaN / MinusInfinity);
    554     EXPECT_EQ(NaN, Infinity / NaN);
    555     EXPECT_EQ(NaN, MinusInfinity / NaN);
    556 }
    557 
    558 TEST_F(DecimalTest, EncodedData)
    559 {
    560     EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Positive));
    561     EXPECT_EQ(encode(0, 0, Negative), encode(0, 0, Negative));
    562     EXPECT_EQ(Decimal(1), Decimal(1));
    563     EXPECT_EQ(encode(1, 0, Negative), encode(1, 0, Negative));
    564     EXPECT_EQ(Decimal::infinity(Positive), encode(1, 2000, Positive));
    565     EXPECT_EQ(Decimal::zero(Positive), encode(1, -2000, Positive));
    566 }
    567 
    568 TEST_F(DecimalTest, Floor)
    569 {
    570     EXPECT_EQ(Decimal(1), Decimal(1).floor());
    571     EXPECT_EQ(Decimal(0), encode(1, -10, Positive).floor());
    572     EXPECT_EQ(Decimal(1), encode(11, -1, Positive).floor());
    573     EXPECT_EQ(Decimal(1), encode(13, -1, Positive).floor());
    574     EXPECT_EQ(Decimal(1), encode(15, -1, Positive).floor());
    575     EXPECT_EQ(Decimal(1), encode(19, -1, Positive).floor());
    576     EXPECT_EQ(Decimal(1), encode(193332, -5, Positive).floor());
    577     EXPECT_EQ(Decimal(12), encode(12002, -3, Positive).floor());
    578 
    579     EXPECT_EQ(Decimal(-1), Decimal(-1).floor());
    580     EXPECT_EQ(Decimal(-1), encode(1, -10, Negative).floor());
    581     EXPECT_EQ(Decimal(-2), encode(11, -1, Negative).floor());
    582     EXPECT_EQ(Decimal(-2), encode(13, -1, Negative).floor());
    583     EXPECT_EQ(Decimal(-2), encode(15, -1, Negative).floor());
    584     EXPECT_EQ(Decimal(-2), encode(19, -1, Negative).floor());
    585     EXPECT_EQ(Decimal(-2), encode(193332, -5, Negative).floor());
    586     EXPECT_EQ(Decimal(-13), encode(12002, -3, Negative).floor());
    587 }
    588 
    589 TEST_F(DecimalTest, FloorBigExponent)
    590 {
    591     EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).floor());
    592     EXPECT_EQ(encode(1, 1000, Negative), encode(1, 1000, Negative).floor());
    593 }
    594 
    595 TEST_F(DecimalTest, FloorSmallExponent)
    596 {
    597     EXPECT_EQ(encode(0, 0, Positive), encode(1, -1000, Positive).floor());
    598     EXPECT_EQ(encode(1, 0, Negative), encode(1, -1000, Negative).floor());
    599 }
    600 
    601 TEST_F(DecimalTest, FloorSpecialValues)
    602 {
    603     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).floor());
    604     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).floor());
    605     EXPECT_EQ(Decimal::nan(), Decimal::nan().floor());
    606 }
    607 
    608 TEST_F(DecimalTest, FromDouble)
    609 {
    610     EXPECT_EQ(encode(0, 0, Positive), Decimal::fromDouble(0.0));
    611     EXPECT_EQ(encode(0, 0, Negative), Decimal::fromDouble(-0.0));
    612     EXPECT_EQ(encode(1, 0, Positive), Decimal::fromDouble(1));
    613     EXPECT_EQ(encode(1, 0, Negative), Decimal::fromDouble(-1));
    614     EXPECT_EQ(encode(123, 0, Positive), Decimal::fromDouble(123));
    615     EXPECT_EQ(encode(123, 0, Negative), Decimal::fromDouble(-123));
    616     EXPECT_EQ(encode(1, -1, Positive), Decimal::fromDouble(0.1));
    617     EXPECT_EQ(encode(1, -1, Negative), Decimal::fromDouble(-0.1));
    618 }
    619 
    620 TEST_F(DecimalTest, FromDoubleLimits)
    621 {
    622     EXPECT_EQ(encode(UINT64_C(2220446049250313), -31, Positive), Decimal::fromDouble(std::numeric_limits<double>::epsilon()));
    623     EXPECT_EQ(encode(UINT64_C(2220446049250313), -31, Negative), Decimal::fromDouble(-std::numeric_limits<double>::epsilon()));
    624     EXPECT_EQ(encode(UINT64_C(17976931348623157), 292, Positive), Decimal::fromDouble(std::numeric_limits<double>::max()));
    625     EXPECT_EQ(encode(UINT64_C(17976931348623157), 292, Negative), Decimal::fromDouble(-std::numeric_limits<double>::max()));
    626     EXPECT_EQ(encode(UINT64_C(22250738585072014), -324, Positive), Decimal::fromDouble(std::numeric_limits<double>::min()));
    627     EXPECT_EQ(encode(UINT64_C(22250738585072014), -324, Negative), Decimal::fromDouble(-std::numeric_limits<double>::min()));
    628     EXPECT_TRUE(Decimal::fromDouble(std::numeric_limits<double>::infinity()).isInfinity());
    629     EXPECT_TRUE(Decimal::fromDouble(-std::numeric_limits<double>::infinity()).isInfinity());
    630     EXPECT_TRUE(Decimal::fromDouble(std::numeric_limits<double>::quiet_NaN()).isNaN());
    631     EXPECT_TRUE(Decimal::fromDouble(-std::numeric_limits<double>::quiet_NaN()).isNaN());
    632 }
    633 
    634 TEST_F(DecimalTest, FromInt32)
    635 {
    636     EXPECT_EQ(encode(0, 0, Positive), Decimal(0));
    637     EXPECT_EQ(encode(1, 0, Positive), Decimal(1));
    638     EXPECT_EQ(encode(1, 0, Negative), Decimal(-1));
    639     EXPECT_EQ(encode(100, 0, Positive), Decimal(100));
    640     EXPECT_EQ(encode(100, 0, Negative), Decimal(-100));
    641     EXPECT_EQ(encode(0x7FFFFFFF, 0, Positive), Decimal(std::numeric_limits<int32_t>::max()));
    642     EXPECT_EQ(encode(0x80000000u, 0, Negative), Decimal(std::numeric_limits<int32_t>::min()));
    643 }
    644 
    645 TEST_F(DecimalTest, FromString)
    646 {
    647     EXPECT_EQ(encode(0, 0, Positive), fromString("0"));
    648     EXPECT_EQ(encode(0, 0, Negative), fromString("-0"));
    649     EXPECT_EQ(Decimal(1), fromString("1"));
    650     EXPECT_EQ(encode(1, 0, Negative), fromString("-1"));
    651     EXPECT_EQ(Decimal(1), fromString("01"));
    652     EXPECT_EQ(encode(3, 0, Positive), fromString("+3"));
    653     EXPECT_EQ(encode(0, 3, Positive), fromString("0E3"));
    654     EXPECT_EQ(encode(5, -1, Positive), fromString(".5"));
    655     EXPECT_EQ(encode(100, 0, Positive), fromString("100"));
    656     EXPECT_EQ(encode(100, 0, Negative), fromString("-100"));
    657     EXPECT_EQ(encode(123, -2, Positive), fromString("1.23"));
    658     EXPECT_EQ(encode(123, -2, Negative), fromString("-1.23"));
    659     EXPECT_EQ(encode(123, 8, Positive), fromString("1.23E10"));
    660     EXPECT_EQ(encode(123, 8, Negative), fromString("-1.23E10"));
    661     EXPECT_EQ(encode(123, 8, Positive), fromString("1.23E+10"));
    662     EXPECT_EQ(encode(123, 8, Negative), fromString("-1.23E+10"));
    663     EXPECT_EQ(encode(123, -12, Positive), fromString("1.23E-10"));
    664     EXPECT_EQ(encode(123, -12, Negative), fromString("-1.23E-10"));
    665     EXPECT_EQ(encode(5, -7, Positive), fromString("0.0000005"));
    666     EXPECT_EQ(encode(0, 0, Positive), fromString("0e9999"));
    667     EXPECT_EQ(encode(123, -3, Positive), fromString("0.123"));
    668     EXPECT_EQ(encode(0, -2, Positive), fromString("00.00"));
    669     EXPECT_EQ(encode(1, 2, Positive), fromString("1E2"));
    670     EXPECT_EQ(Decimal::infinity(Positive), fromString("1E20000"));
    671     EXPECT_EQ(Decimal::zero(Positive), fromString("1E-20000"));
    672     EXPECT_EQ(encode(1000, 1023, Positive), fromString("1E1026"));
    673     EXPECT_EQ(Decimal::zero(Positive), fromString("1E-1026"));
    674     EXPECT_EQ(Decimal::infinity(Positive), fromString("1234567890E1036"));
    675 
    676     // 2^1024
    677     const uint64_t leadingDigitsOf2PowerOf1024 = UINT64_C(17976931348623159);
    678     EXPECT_EQ(encode(leadingDigitsOf2PowerOf1024, 292, Positive), fromString("179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216"));
    679 }
    680 
    681 // These strings are look like proper number, but we don't accept them.
    682 TEST_F(DecimalTest, FromStringLikeNumber)
    683 {
    684     EXPECT_EQ(Decimal::nan(), fromString(" 123 "));
    685     EXPECT_EQ(Decimal::nan(), fromString("1,234"));
    686 }
    687 
    688 // fromString doesn't support infinity and NaN.
    689 TEST_F(DecimalTest, FromStringSpecialValues)
    690 {
    691     EXPECT_EQ(Decimal::nan(), fromString("INF"));
    692     EXPECT_EQ(Decimal::nan(), fromString("Infinity"));
    693     EXPECT_EQ(Decimal::nan(), fromString("infinity"));
    694     EXPECT_EQ(Decimal::nan(), fromString("+Infinity"));
    695     EXPECT_EQ(Decimal::nan(), fromString("+infinity"));
    696     EXPECT_EQ(Decimal::nan(), fromString("-Infinity"));
    697     EXPECT_EQ(Decimal::nan(), fromString("-infinity"));
    698     EXPECT_EQ(Decimal::nan(), fromString("NaN"));
    699     EXPECT_EQ(Decimal::nan(), fromString("nan"));
    700     EXPECT_EQ(Decimal::nan(), fromString("+NaN"));
    701     EXPECT_EQ(Decimal::nan(), fromString("+nan"));
    702     EXPECT_EQ(Decimal::nan(), fromString("-NaN"));
    703     EXPECT_EQ(Decimal::nan(), fromString("-nan"));
    704 }
    705 
    706 TEST_F(DecimalTest, fromStringTruncated)
    707 {
    708     EXPECT_EQ(Decimal::nan(), fromString("x"));
    709     EXPECT_EQ(Decimal::nan(), fromString("0."));
    710     EXPECT_EQ(Decimal::nan(), fromString("1x"));
    711 
    712     EXPECT_EQ(Decimal::nan(), fromString("1Ex"));
    713     EXPECT_EQ(Decimal::nan(), fromString("1E2x"));
    714     EXPECT_EQ(Decimal::nan(), fromString("1E+x"));
    715 }
    716 
    717 TEST_F(DecimalTest, Multiplication)
    718 {
    719     EXPECT_EQ(encode(0, 0, Positive), Decimal(0) * Decimal(0));
    720     EXPECT_EQ(encode(2, 0, Negative), Decimal(2) * Decimal(-1));
    721     EXPECT_EQ(encode(2, 0, Negative), Decimal(-1) * Decimal(2));
    722     EXPECT_EQ(encode(99, 0, Positive), Decimal(99) * Decimal(1));
    723     EXPECT_EQ(encode(2500, 0, Positive), Decimal(-50) * Decimal(-50));
    724     EXPECT_EQ(encode(1, 21, Positive), encode(UINT64_C(10000000000), 0, Positive) * encode(UINT64_C(100000000000), 0, Positive));
    725 }
    726 
    727 TEST_F(DecimalTest, MultiplicationBigExponent)
    728 {
    729     EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) * encode(1, 0, Positive));
    730     EXPECT_EQ(Decimal::infinity(Positive), encode(1, 1022, Positive) * encode(1, 1022, Positive));
    731     EXPECT_EQ(encode(1, 22, Positive), encode(1, 1022, Positive) * encode(1, -1000, Positive));
    732 }
    733 
    734 TEST_F(DecimalTest, MultiplicationSmallExponent)
    735 {
    736     EXPECT_EQ(encode(1, -1022, Positive), encode(1, -1022, Positive) * encode(1, 0, Positive));
    737     EXPECT_EQ(encode(0, 0, Positive), encode(1, -1022, Positive) * encode(1, -1022, Positive));
    738 }
    739 
    740 TEST_F(DecimalTest, MultiplicationSpecialValues)
    741 {
    742     const Decimal Infinity(Decimal::infinity(Positive));
    743     const Decimal MinusInfinity(Decimal::infinity(Negative));
    744     const Decimal NaN(Decimal::nan());
    745     const Decimal Ten(10);
    746     const Decimal MinusTen(-10);
    747     const Decimal Zero(Decimal::zero(Positive));
    748     const Decimal MinusZero(Decimal::zero(Negative));
    749 
    750     EXPECT_EQ(Infinity, Infinity * Infinity);
    751     EXPECT_EQ(MinusInfinity, Infinity * MinusInfinity);
    752     EXPECT_EQ(MinusInfinity, MinusInfinity * Infinity);
    753     EXPECT_EQ(Infinity, MinusInfinity * MinusInfinity);
    754 
    755     EXPECT_EQ(NaN, Infinity * Zero);
    756     EXPECT_EQ(NaN, Zero * MinusInfinity);
    757     EXPECT_EQ(NaN, MinusInfinity * Zero);
    758     EXPECT_EQ(NaN, MinusInfinity * Zero);
    759 
    760     EXPECT_EQ(NaN, Infinity * MinusZero);
    761     EXPECT_EQ(NaN, MinusZero * MinusInfinity);
    762     EXPECT_EQ(NaN, MinusInfinity * MinusZero);
    763     EXPECT_EQ(NaN, MinusInfinity * MinusZero);
    764 
    765     EXPECT_EQ(Infinity, Infinity * Ten);
    766     EXPECT_EQ(Infinity, Ten * Infinity);
    767     EXPECT_EQ(MinusInfinity, MinusInfinity * Ten);
    768     EXPECT_EQ(MinusInfinity, Ten * MinusInfinity);
    769 
    770     EXPECT_EQ(MinusInfinity, Infinity * MinusTen);
    771     EXPECT_EQ(MinusInfinity, MinusTen * Infinity);
    772     EXPECT_EQ(Infinity, MinusInfinity * MinusTen);
    773     EXPECT_EQ(Infinity, MinusTen * MinusInfinity);
    774 
    775     EXPECT_EQ(NaN, NaN * NaN);
    776     EXPECT_EQ(NaN, NaN * Ten);
    777     EXPECT_EQ(NaN, Ten * NaN);
    778 
    779     EXPECT_EQ(NaN, NaN * Infinity);
    780     EXPECT_EQ(NaN, NaN * MinusInfinity);
    781     EXPECT_EQ(NaN, Infinity * NaN);
    782     EXPECT_EQ(NaN, MinusInfinity * NaN);
    783 }
    784 
    785 TEST_F(DecimalTest, Negate)
    786 {
    787     EXPECT_EQ(encode(0, 0, Negative), -encode(0, 0, Positive));
    788     EXPECT_EQ(encode(0, 0, Positive), -encode(0, 0, Negative));
    789 
    790     EXPECT_EQ(encode(0, 10, Negative), -encode(0, 10, Positive));
    791     EXPECT_EQ(encode(0, 10, Positive), -encode(0, 10, Negative));
    792 
    793     EXPECT_EQ(encode(0, -10, Negative), -encode(0, -10, Positive));
    794     EXPECT_EQ(encode(0, -10, Positive), -encode(0, -10, Negative));
    795 
    796     EXPECT_EQ(encode(1, 0, Negative), -encode(1, 0, Positive));
    797     EXPECT_EQ(encode(1, 0, Positive), -encode(1, 0, Negative));
    798 
    799     EXPECT_EQ(encode(1, 10, Negative), -encode(1, 10, Positive));
    800     EXPECT_EQ(encode(1, 10, Positive), -encode(1, 10, Negative));
    801 
    802     EXPECT_EQ(encode(1, -10, Negative), -encode(1, -10, Positive));
    803     EXPECT_EQ(encode(1, -10, Positive), -encode(1, -10, Negative));
    804 }
    805 
    806 TEST_F(DecimalTest, NegateBigExponent)
    807 {
    808     EXPECT_EQ(encode(1, 1000, Negative), -encode(1, 1000, Positive));
    809     EXPECT_EQ(encode(1, 1000, Positive), -encode(1, 1000, Negative));
    810 }
    811 
    812 TEST_F(DecimalTest, NegateSmallExponent)
    813 {
    814     EXPECT_EQ(encode(1, -1000, Negative), -encode(1, -1000, Positive));
    815     EXPECT_EQ(encode(1, -1000, Positive), -encode(1, -1000, Negative));
    816 }
    817 
    818 TEST_F(DecimalTest, NegateSpecialValues)
    819 {
    820     EXPECT_EQ(Decimal::infinity(Negative), -Decimal::infinity(Positive));
    821     EXPECT_EQ(Decimal::infinity(Positive), -Decimal::infinity(Negative));
    822     EXPECT_EQ(Decimal::nan(), -Decimal::nan());
    823 }
    824 
    825 TEST_F(DecimalTest, Predicates)
    826 {
    827     EXPECT_TRUE(Decimal::zero(Positive).isFinite());
    828     EXPECT_FALSE(Decimal::zero(Positive).isInfinity());
    829     EXPECT_FALSE(Decimal::zero(Positive).isNaN());
    830     EXPECT_TRUE(Decimal::zero(Positive).isPositive());
    831     EXPECT_FALSE(Decimal::zero(Positive).isNegative());
    832     EXPECT_FALSE(Decimal::zero(Positive).isSpecial());
    833     EXPECT_TRUE(Decimal::zero(Positive).isZero());
    834 
    835     EXPECT_TRUE(Decimal::zero(Negative).isFinite());
    836     EXPECT_FALSE(Decimal::zero(Negative).isInfinity());
    837     EXPECT_FALSE(Decimal::zero(Negative).isNaN());
    838     EXPECT_FALSE(Decimal::zero(Negative).isPositive());
    839     EXPECT_TRUE(Decimal::zero(Negative).isNegative());
    840     EXPECT_FALSE(Decimal::zero(Negative).isSpecial());
    841     EXPECT_TRUE(Decimal::zero(Negative).isZero());
    842 
    843     EXPECT_TRUE(Decimal(123).isFinite());
    844     EXPECT_FALSE(Decimal(123).isInfinity());
    845     EXPECT_FALSE(Decimal(123).isNaN());
    846     EXPECT_TRUE(Decimal(123).isPositive());
    847     EXPECT_FALSE(Decimal(123).isNegative());
    848     EXPECT_FALSE(Decimal(123).isSpecial());
    849     EXPECT_FALSE(Decimal(123).isZero());
    850 
    851     EXPECT_TRUE(Decimal(-123).isFinite());
    852     EXPECT_FALSE(Decimal(-123).isInfinity());
    853     EXPECT_FALSE(Decimal(-123).isNaN());
    854     EXPECT_FALSE(Decimal(-123).isPositive());
    855     EXPECT_TRUE(Decimal(-123).isNegative());
    856     EXPECT_FALSE(Decimal(-123).isSpecial());
    857     EXPECT_FALSE(Decimal(-123).isZero());
    858 }
    859 
    860 TEST_F(DecimalTest, PredicatesSpecialValues)
    861 {
    862     EXPECT_FALSE(Decimal::infinity(Positive).isFinite());
    863     EXPECT_TRUE(Decimal::infinity(Positive).isInfinity());
    864     EXPECT_FALSE(Decimal::infinity(Positive).isNaN());
    865     EXPECT_TRUE(Decimal::infinity(Positive).isPositive());
    866     EXPECT_FALSE(Decimal::infinity(Positive).isNegative());
    867     EXPECT_TRUE(Decimal::infinity(Positive).isSpecial());
    868     EXPECT_FALSE(Decimal::infinity(Positive).isZero());
    869 
    870     EXPECT_FALSE(Decimal::infinity(Negative).isFinite());
    871     EXPECT_TRUE(Decimal::infinity(Negative).isInfinity());
    872     EXPECT_FALSE(Decimal::infinity(Negative).isNaN());
    873     EXPECT_FALSE(Decimal::infinity(Negative).isPositive());
    874     EXPECT_TRUE(Decimal::infinity(Negative).isNegative());
    875     EXPECT_TRUE(Decimal::infinity(Negative).isSpecial());
    876     EXPECT_FALSE(Decimal::infinity(Negative).isZero());
    877 
    878     EXPECT_FALSE(Decimal::nan().isFinite());
    879     EXPECT_FALSE(Decimal::nan().isInfinity());
    880     EXPECT_TRUE(Decimal::nan().isNaN());
    881     EXPECT_TRUE(Decimal::nan().isSpecial());
    882     EXPECT_FALSE(Decimal::nan().isZero());
    883 }
    884 
    885 // LayoutTests/fast/forms/number/number-stepup-stepdown-from-renderer
    886 TEST_F(DecimalTest, RealWorldExampleNumberStepUpStepDownFromRenderer)
    887 {
    888     EXPECT_DECIMAL_STREQ("10", stepDown("0", "100", "10", "19", 1));
    889     EXPECT_DECIMAL_STREQ("90", stepUp("0", "99", "10", "89", 1));
    890     EXPECT_DECIMAL_STREQ("1", stepUp("0", "1", "0.33333333333333333", "0", 3)); // step=1/3
    891     EXPECT_DECIMAL_STREQ("0.01", stepUp("0", "0.01", "0.0033333333333333333", "0", 3)); // step=1/300
    892     EXPECT_DECIMAL_STREQ("1", stepUp("0", "1", "0.003921568627450980", "0", 255)); // step=1/255
    893     EXPECT_DECIMAL_STREQ("1", stepUp("0", "1", "0.1", "0", 10));
    894 }
    895 
    896 TEST_F(DecimalTest, RealWorldExampleNumberStepUpStepDownFromRendererRounding)
    897 {
    898     EXPECT_DECIMAL_STREQ("5.015", stepUp("0", "100", "0.005", "5.005", 2));
    899     EXPECT_DECIMAL_STREQ("5.06", stepUp("0", "100", "0.005", "5.005", 11));
    900     EXPECT_DECIMAL_STREQ("5.065", stepUp("0", "100", "0.005", "5.005", 12));
    901 
    902     EXPECT_DECIMAL_STREQ("5.015", stepUp("4", "9", "0.005", "5.005", 2));
    903     EXPECT_DECIMAL_STREQ("5.06", stepUp("4", "9", "0.005", "5.005", 11));
    904     EXPECT_DECIMAL_STREQ("5.065", stepUp("4", "9", "0.005", "5.005", 12));
    905 }
    906 
    907 TEST_F(DecimalTest, RealWorldExampleRangeStepUpStepDown)
    908 {
    909     EXPECT_DECIMAL_STREQ("1e+38", stepUp("0", "1E38", "1", "1E38", 9));
    910     EXPECT_DECIMAL_STREQ("1e+38", stepDown("0", "1E38", "1", "1E38", 9));
    911 }
    912 
    913 TEST_F(DecimalTest, Remainder)
    914 {
    915     EXPECT_EQ(encode(21, -1, Positive), encode(21, -1, Positive).remainder(3));
    916     EXPECT_EQ(Decimal(1), Decimal(10).remainder(3));
    917     EXPECT_EQ(Decimal(1), Decimal(10).remainder(-3));
    918     EXPECT_EQ(encode(1, 0, Negative), Decimal(-10).remainder(3));
    919     EXPECT_EQ(Decimal(-1), Decimal(-10).remainder(-3));
    920     EXPECT_EQ(encode(2, -1, Positive), encode(102, -1, Positive).remainder(1));
    921     EXPECT_EQ(encode(1, -1, Positive), Decimal(10).remainder(encode(3, -1, Positive)));
    922     EXPECT_EQ(Decimal(1), encode(36, -1, Positive).remainder(encode(13, -1, Positive)));
    923     EXPECT_EQ(encode(1, 86, Positive), (encode(1234, 100, Positive).remainder(Decimal(3))));
    924     EXPECT_EQ(Decimal(500), (Decimal(500).remainder(1000)));
    925     EXPECT_EQ(Decimal(-500), (Decimal(-500).remainder(1000)));
    926 }
    927 
    928 TEST_F(DecimalTest, RemainderBigExponent)
    929 {
    930     EXPECT_EQ(encode(0, 1022, Positive), encode(1, 1022, Positive).remainder(encode(1, 0, Positive)));
    931     EXPECT_EQ(encode(0, 1022, Positive), encode(1, 1022, Positive).remainder(encode(1, 1022, Positive)));
    932     EXPECT_EQ(Decimal::infinity(Positive), encode(1, 1022, Positive).remainder(encode(1, -1000, Positive)));
    933 }
    934 
    935 TEST_F(DecimalTest, RemainderSmallExponent)
    936 {
    937     EXPECT_EQ(encode(1, -1022, Positive), encode(1, -1022, Positive).remainder(encode(1, 0, Positive)));
    938     EXPECT_EQ(encode(0, -1022, Positive), encode(1, -1022, Positive).remainder(encode(1, -1022, Positive)));
    939 }
    940 
    941 TEST_F(DecimalTest, RemainderSpecialValues)
    942 {
    943     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).remainder(1));
    944     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).remainder(1));
    945     EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(1));
    946 
    947     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Positive).remainder(-1));
    948     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).remainder(-1));
    949     EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(-1));
    950 
    951     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).remainder(3));
    952     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).remainder(3));
    953     EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(3));
    954 
    955     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Positive).remainder(-1));
    956     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).remainder(-1));
    957     EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(-1));
    958 
    959     EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::infinity(Positive)));
    960     EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::infinity(Negative)));
    961     EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::nan()));
    962 }
    963 
    964 TEST_F(DecimalTest, Round)
    965 {
    966     EXPECT_EQ(Decimal(1), (Decimal(9) / Decimal(10)).round());
    967     EXPECT_EQ(Decimal(25), (Decimal(5) / fromString("0.200")).round());
    968     EXPECT_EQ(Decimal(3), (Decimal(5) / Decimal(2)).round());
    969     EXPECT_EQ(Decimal(1), (Decimal(2) / Decimal(3)).round());
    970     EXPECT_EQ(Decimal(3), (Decimal(10) / Decimal(3)).round());
    971     EXPECT_EQ(Decimal(3), (Decimal(1) / fromString("0.3")).round());
    972     EXPECT_EQ(Decimal(10), (Decimal(1) / fromString("0.1")).round());
    973     EXPECT_EQ(Decimal(5), (Decimal(1) / fromString("0.2")).round());
    974     EXPECT_EQ(Decimal(10), (fromString("10.2") / 1).round());
    975     EXPECT_EQ(encode(1234, 100, Positive), encode(1234, 100, Positive).round());
    976 
    977     EXPECT_EQ(Decimal(2), encode(190002, -5, Positive).round());
    978     EXPECT_EQ(Decimal(2), encode(150002, -5, Positive).round());
    979     EXPECT_EQ(Decimal(2), encode(150000, -5, Positive).round());
    980     EXPECT_EQ(Decimal(12), encode(12492, -3, Positive).round());
    981     EXPECT_EQ(Decimal(13), encode(12502, -3, Positive).round());
    982 
    983     EXPECT_EQ(Decimal(-2), encode(190002, -5, Negative).round());
    984     EXPECT_EQ(Decimal(-2), encode(150002, -5, Negative).round());
    985     EXPECT_EQ(Decimal(-2), encode(150000, -5, Negative).round());
    986     EXPECT_EQ(Decimal(-12), encode(12492, -3, Negative).round());
    987     EXPECT_EQ(Decimal(-13), encode(12502, -3, Negative).round());
    988 }
    989 
    990 TEST_F(DecimalTest, RoundSpecialValues)
    991 {
    992     EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).round());
    993     EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).round());
    994     EXPECT_EQ(Decimal::nan(), Decimal::nan().round());
    995 }
    996 
    997 TEST_F(DecimalTest, Subtract)
    998 {
    999     EXPECT_EQ(encode(0, 0, Positive), Decimal(0) - Decimal(0));
   1000     EXPECT_EQ(encode(3, 0, Positive), Decimal(2) - Decimal(-1));
   1001     EXPECT_EQ(encode(3, 0, Negative), Decimal(-1) - Decimal(2));
   1002     EXPECT_EQ(encode(98, 0, Positive), Decimal(99) - Decimal(1));
   1003     EXPECT_EQ(encode(0, 0, Positive), Decimal(-50) - Decimal(-50));
   1004     EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive), encode(1, 50, Positive) - Decimal(1));
   1005     EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Negative), Decimal(1) - encode(1, 50, Positive));
   1006 }
   1007 
   1008 TEST_F(DecimalTest, SubtractBigExponent)
   1009 {
   1010     EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) - encode(1, 0, Positive));
   1011     EXPECT_EQ(encode(0, 0, Positive), encode(1, 1022, Positive) - encode(1, 1022, Positive));
   1012     EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) + encode(1, -1000, Positive));
   1013 }
   1014 
   1015 TEST_F(DecimalTest, SubtractSmallExponent)
   1016 {
   1017     EXPECT_EQ(encode(UINT64_C(10000000000000000), -16, Negative), encode(1, -1022, Positive) - encode(1, 0, Positive));
   1018     EXPECT_EQ(encode(0, 0, Positive), encode(1, -1022, Positive) - encode(1, -1022, Positive));
   1019 }
   1020 
   1021 TEST_F(DecimalTest, SubtractSpecialValues)
   1022 {
   1023     const Decimal Infinity(Decimal::infinity(Positive));
   1024     const Decimal MinusInfinity(Decimal::infinity(Negative));
   1025     const Decimal NaN(Decimal::nan());
   1026     const Decimal Ten(10);
   1027 
   1028     EXPECT_EQ(NaN, Infinity - Infinity);
   1029     EXPECT_EQ(Infinity, Infinity - MinusInfinity);
   1030     EXPECT_EQ(MinusInfinity, MinusInfinity - Infinity);
   1031     EXPECT_EQ(NaN, MinusInfinity - MinusInfinity);
   1032 
   1033     EXPECT_EQ(Infinity, Infinity - Ten);
   1034     EXPECT_EQ(MinusInfinity, Ten - Infinity);
   1035     EXPECT_EQ(MinusInfinity, MinusInfinity - Ten);
   1036     EXPECT_EQ(Infinity, Ten - MinusInfinity);
   1037 
   1038     EXPECT_EQ(NaN, NaN - NaN);
   1039     EXPECT_EQ(NaN, NaN - Ten);
   1040     EXPECT_EQ(NaN, Ten - NaN);
   1041 
   1042     EXPECT_EQ(NaN, NaN - Infinity);
   1043     EXPECT_EQ(NaN, NaN - MinusInfinity);
   1044     EXPECT_EQ(NaN, Infinity - NaN);
   1045     EXPECT_EQ(NaN, MinusInfinity - NaN);
   1046 }
   1047 
   1048 TEST_F(DecimalTest, ToDouble)
   1049 {
   1050     EXPECT_EQ(0.0, encode(0, 0, Positive).toDouble());
   1051     EXPECT_EQ(-0.0, encode(0, 0, Negative).toDouble());
   1052 
   1053     EXPECT_EQ(1.0, encode(1, 0, Positive).toDouble());
   1054     EXPECT_EQ(-1.0, encode(1, 0, Negative).toDouble());
   1055 
   1056     EXPECT_EQ(0.1, encode(1, -1, Positive).toDouble());
   1057     EXPECT_EQ(-0.1, encode(1, -1, Negative).toDouble());
   1058     EXPECT_EQ(0.3, encode(3, -1, Positive).toDouble());
   1059     EXPECT_EQ(-0.3, encode(3, -1, Negative).toDouble());
   1060     EXPECT_EQ(0.6, encode(6, -1, Positive).toDouble());
   1061     EXPECT_EQ(-0.6, encode(6, -1, Negative).toDouble());
   1062     EXPECT_EQ(0.7, encode(7, -1, Positive).toDouble());
   1063     EXPECT_EQ(-0.7, encode(7, -1, Negative).toDouble());
   1064 
   1065     EXPECT_EQ(0.01, encode(1, -2, Positive).toDouble());
   1066     EXPECT_EQ(0.001, encode(1, -3, Positive).toDouble());
   1067     EXPECT_EQ(0.0001, encode(1, -4, Positive).toDouble());
   1068     EXPECT_EQ(0.00001, encode(1, -5, Positive).toDouble());
   1069 
   1070     EXPECT_EQ(1e+308, encode(1, 308, Positive).toDouble());
   1071     EXPECT_EQ(1e-307, encode(1, -307, Positive).toDouble());
   1072 
   1073     EXPECT_TRUE(std::isinf(encode(1, 1000, Positive).toDouble()));
   1074     EXPECT_EQ(0.0, encode(1, -1000, Positive).toDouble());
   1075 }
   1076 
   1077 TEST_F(DecimalTest, ToDoubleSpecialValues)
   1078 {
   1079     EXPECT_TRUE(std::isinf(Decimal::infinity(Decimal::Positive).toDouble()));
   1080     EXPECT_TRUE(std::isinf(Decimal::infinity(Decimal::Negative).toDouble()));
   1081     EXPECT_TRUE(std::isnan(Decimal::nan().toDouble()));
   1082 }
   1083 
   1084 TEST_F(DecimalTest, ToString)
   1085 {
   1086     EXPECT_DECIMAL_STREQ("0", Decimal::zero(Positive));
   1087     EXPECT_DECIMAL_STREQ("-0", Decimal::zero(Negative));
   1088     EXPECT_DECIMAL_STREQ("1", Decimal(1));
   1089     EXPECT_DECIMAL_STREQ("-1", Decimal(-1));
   1090     EXPECT_DECIMAL_STREQ("1234567", Decimal(1234567));
   1091     EXPECT_DECIMAL_STREQ("-1234567", Decimal(-1234567));
   1092     EXPECT_DECIMAL_STREQ("0.5", encode(5, -1, Positive));
   1093     EXPECT_DECIMAL_STREQ("-0.5", encode(5, -1, Negative));
   1094     EXPECT_DECIMAL_STREQ("12.345", encode(12345, -3, Positive));
   1095     EXPECT_DECIMAL_STREQ("-12.345", encode(12345, -3, Negative));
   1096     EXPECT_DECIMAL_STREQ("0.12345", encode(12345, -5, Positive));
   1097     EXPECT_DECIMAL_STREQ("-0.12345", encode(12345, -5, Negative));
   1098     EXPECT_DECIMAL_STREQ("50", encode(50, 0, Positive));
   1099     EXPECT_DECIMAL_STREQ("-50", encode(50, 0, Negative));
   1100     EXPECT_DECIMAL_STREQ("5e+1", encode(5, 1, Positive));
   1101     EXPECT_DECIMAL_STREQ("-5e+1", encode(5, 1, Negative));
   1102     EXPECT_DECIMAL_STREQ("5.678e+103", encode(5678, 100, Positive));
   1103     EXPECT_DECIMAL_STREQ("-5.678e+103", encode(5678, 100, Negative));
   1104     EXPECT_DECIMAL_STREQ("5.678e-97", encode(5678, -100, Positive));
   1105     EXPECT_DECIMAL_STREQ("-5.678e-97", encode(5678, -100, Negative));
   1106     EXPECT_DECIMAL_STREQ("8639999913600001", encode(UINT64_C(8639999913600001), 0, Positive));
   1107     EXPECT_DECIMAL_STREQ("9007199254740991", encode((static_cast<uint64_t>(1) << DBL_MANT_DIG) - 1, 0, Positive));
   1108     EXPECT_DECIMAL_STREQ("99999999999999999", encode(UINT64_C(99999999999999999), 0, Positive));
   1109     EXPECT_DECIMAL_STREQ("9.9999999999999999e+17", encode(UINT64_C(99999999999999999), 1, Positive));
   1110     EXPECT_DECIMAL_STREQ("9.9999999999999999e+18", encode(UINT64_C(99999999999999999), 2, Positive));
   1111     EXPECT_DECIMAL_STREQ("1e+16", encode(UINT64_C(99999999999999999), -1, Positive));
   1112     EXPECT_DECIMAL_STREQ("1000000000000000", encode(UINT64_C(99999999999999999), -2, Positive));
   1113     EXPECT_DECIMAL_STREQ("1", encode(UINT64_C(99999999999999999), -17, Positive));
   1114     EXPECT_DECIMAL_STREQ("0.001", encode(UINT64_C(99999999999999999), -20, Positive));
   1115     EXPECT_DECIMAL_STREQ("1e-83", encode(UINT64_C(99999999999999999), -100, Positive));
   1116 }
   1117 
   1118 TEST_F(DecimalTest, ToStringSpecialValues)
   1119 {
   1120     EXPECT_DECIMAL_STREQ("Infinity", Decimal::infinity(Positive));
   1121     EXPECT_DECIMAL_STREQ("-Infinity", Decimal::infinity(Negative));
   1122     EXPECT_DECIMAL_STREQ("NaN", Decimal::nan());
   1123 }
   1124