15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Decimal.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/MathExtras.h"
3581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/text/CString.h"
368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include <float.h>
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <gtest/gtest.h>
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)std::ostream& operator<<(std::ostream& os, const Decimal& decimal)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Decimal::EncodedData data = decimal.value();
4481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    return os
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        << "encode(" << String::number(data.coefficient()).ascii().data()
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        << ", " << String::number(data.exponent()).ascii().data()
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        << ", " << (data.sign() == Decimal::Negative ? "Negative" : "Positive")
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        << ")=" << decimal.toString().ascii().data();
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Simulate WebCore/html/StepRange
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DecimalStepRange {
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Decimal maximum;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Decimal minimum;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Decimal step;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DecimalStepRange(const Decimal& minimum, const Decimal& maximum, const Decimal& step)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : maximum(maximum)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , minimum(minimum)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , step(step)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Decimal clampValue(Decimal value) const
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Decimal result = minimum + ((value - minimum) / step).round() * step;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(result.isFinite());
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result > maximum ? result - step : result;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DecimalTest : public ::testing::Test {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef Decimal::Sign Sign;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    protected: static const Sign Positive = Decimal::Positive;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    protected: static const Sign Negative = Decimal::Negative;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Decimal encode(uint64_t coefficient, int exponent, Sign sign)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Decimal(sign, exponent, coefficient);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    protected: Decimal fromString(const String& string)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Decimal::fromString(string);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    protected: Decimal stepDown(const String& minimum, const String& maximum, const String& step, const String& valueString, int numberOfStepTimes)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DecimalStepRange stepRange(fromString(minimum), fromString(maximum), fromString(step));
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Decimal value = fromString(valueString);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int i = 0; i < numberOfStepTimes; ++i) {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            value -= stepRange.step;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            value = stepRange.clampValue(value);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    protected: Decimal stepUp(const String& minimum, const String& maximum, const String& step, const String& valueString, int numberOfStepTimes)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DecimalStepRange stepRange(fromString(minimum), fromString(maximum), fromString(step));
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Decimal value = fromString(valueString);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int i = 0; i < numberOfStepTimes; ++i) {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            value += stepRange.step;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            value = stepRange.clampValue(value);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: We should use expectedSign without "Decimal::", however, g++ causes undefined references for DecimalTest::Positive and Negative.
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define EXPECT_DECIMAL_ENCODED_DATA_EQ(expectedCoefficient, expectedExponent,  expectedSign, decimal) \
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ((expectedCoefficient), (decimal).value().coefficient()); \
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ((expectedExponent), (decimal).value().exponent()); \
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::expectedSign, (decimal).value().sign());
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define EXPECT_DECIMAL_STREQ(expected, decimal) EXPECT_STREQ((expected), (decimal).toString().ascii().data())
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Abs)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Positive).abs());
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Negative).abs());
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 10, Positive), encode(0, 10, Positive).abs());
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 10, Positive), encode(0, 10, Negative).abs());
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, -10, Positive), encode(0, -10, Positive).abs());
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, -10, Positive), encode(0, -10, Negative).abs());
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, 0, Positive).abs());
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, 0, Negative).abs());
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 10, Positive), encode(1, 10, Positive).abs());
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 10, Positive), encode(1, 10, Negative).abs());
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -10, Positive), encode(1, -10, Positive).abs());
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -10, Positive), encode(1, -10, Negative).abs());
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, AbsBigExponent)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).abs());
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Negative).abs());
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, AbsSmallExponent)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1000, Positive), encode(1, -1000, Positive).abs());
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1000, Positive), encode(1, -1000, Negative).abs());
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, AbsSpecialValues)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).abs());
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).abs());
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().abs());
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Add)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal(0) + Decimal(0));
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(2) + Decimal(-1));
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(-1) + Decimal(2));
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(100, 0, Positive), Decimal(99) + Decimal(1));
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(100, 0, Negative), Decimal(-50) + Decimal(-50));
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive), encode(1, 50, Positive) + Decimal(1));
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive), Decimal(1) + encode(1, 50, Positive));
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(10000000001), 0, Positive), encode(1, 10, Positive) + Decimal(1));
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(10000000001), 0, Positive), Decimal(1) + encode(1, 10, Positive));
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, -1022, Positive) + encode(1, 0, Positive));
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, -1022, Positive), encode(1, -1022, Positive) + encode(1, -1022, Positive));
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, AddBigExponent)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) + encode(1, 0, Positive));
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, 1022, Positive), encode(1, 1022, Positive) + encode(1, 1022, Positive));
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), encode(std::numeric_limits<uint64_t>::max(), 1022, Positive) + encode(1, 0, Positive));
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) + encode(1, -1000, Positive));
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, AddSmallExponent)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, -1022, Positive) + encode(1, 0, Positive));
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, -1022, Positive), encode(1, -1022, Positive) + encode(1, -1022, Positive));
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, AddSpecialValues)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Infinity(Decimal::infinity(Positive));
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusInfinity(Decimal::infinity(Negative));
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal NaN(Decimal::nan());
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Ten(10);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity + Infinity);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity + MinusInfinity);
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity + Infinity);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity + MinusInfinity);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity + Ten);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Ten + Infinity);
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity + Ten);
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Ten + MinusInfinity);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN + NaN);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN + Ten);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Ten + NaN);
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN - Infinity);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN - MinusInfinity);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity - NaN);
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity - NaN);
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Ceiling)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(1).ceiling());
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(1, -10, Positive).ceiling());
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(11, -1, Positive).ceiling());
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(13, -1, Positive).ceiling());
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(15, -1, Positive).ceiling());
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(19, -1, Positive).ceiling());
22851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(151, -2, Positive).ceiling());
22951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(101, -2, Positive).ceiling());
23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(199, -3, Positive).ceiling());
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(199, -2, Positive).ceiling());
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(3), encode(209, -2, Positive).ceiling());
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), Decimal(-1).ceiling());
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(0), encode(1, -10, Negative).ceiling());
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(11, -1, Negative).ceiling());
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(13, -1, Negative).ceiling());
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(15, -1, Negative).ceiling());
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(19, -1, Negative).ceiling());
24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(151, -2, Negative).ceiling());
24151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(101, -2, Negative).ceiling());
24251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(0), encode(199, -3, Negative).ceiling());
24351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(199, -2, Negative).ceiling());
24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(209, -2, Negative).ceiling());
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, CeilingBigExponent)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).ceiling());
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Negative), encode(1, 1000, Negative).ceiling());
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, CeilingSmallExponent)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, -1000, Positive).ceiling());
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Negative), encode(1, -1000, Negative).ceiling());
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, CeilingSpecialValues)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).ceiling());
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).ceiling());
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().ceiling());
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Compare)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(0) == Decimal(0));
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(0) != Decimal(1));
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(0) < Decimal(1));
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(0) <= Decimal(0));
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(0) > Decimal(-1));
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(0) >= Decimal(0));
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(1) == Decimal(2));
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(1) != Decimal(1));
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(1) < Decimal(0));
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(1) <= Decimal(0));
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(1) > Decimal(2));
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(1) >= Decimal(2));
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, CompareBigExponent)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 1000, Positive) == encode(1, 1000, Positive));
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, 1000, Positive) != encode(1, 1000, Positive));
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, 1000, Positive) < encode(1, 1000, Positive));
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 1000, Positive) <= encode(1, 1000, Positive));
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, 1000, Positive) > encode(1, 1000, Positive));
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 1000, Positive) >= encode(1, 1000, Positive));
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 1000, Negative) == encode(1, 1000, Negative));
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, 1000, Negative) != encode(1, 1000, Negative));
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, 1000, Negative) < encode(1, 1000, Negative));
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 1000, Negative) <= encode(1, 1000, Negative));
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, 1000, Negative) > encode(1, 1000, Negative));
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 1000, Negative) >= encode(1, 1000, Negative));
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, 1000, Positive) == encode(1, 1000, Positive));
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, 1000, Positive) != encode(1, 1000, Positive));
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, 1000, Positive) < encode(1, 1000, Positive));
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, 1000, Positive) <= encode(1, 1000, Positive));
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, 1000, Positive) > encode(1, 1000, Positive));
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, 1000, Positive) >= encode(1, 1000, Positive));
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, 1000, Negative) == encode(1, 1000, Negative));
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, 1000, Negative) != encode(1, 1000, Negative));
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, 1000, Negative) < encode(1, 1000, Negative));
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, 1000, Negative) <= encode(1, 1000, Negative));
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, 1000, Negative) > encode(1, 1000, Negative));
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, 1000, Negative) >= encode(1, 1000, Negative));
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, CompareSmallExponent)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, -1000, Positive) == encode(1, -1000, Positive));
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, -1000, Positive) != encode(1, -1000, Positive));
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, -1000, Positive) < encode(1, -1000, Positive));
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, -1000, Positive) <= encode(1, -1000, Positive));
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, -1000, Positive) > encode(1, -1000, Positive));
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, -1000, Positive) >= encode(1, -1000, Positive));
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, -1000, Negative) == encode(1, -1000, Negative));
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, -1000, Negative) != encode(1, -1000, Negative));
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, -1000, Negative) < encode(1, -1000, Negative));
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, -1000, Negative) <= encode(1, -1000, Negative));
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(1, -1000, Negative) > encode(1, -1000, Negative));
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, -1000, Negative) >= encode(1, -1000, Negative));
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, -1000, Positive) == encode(1, -1000, Positive));
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, -1000, Positive) != encode(1, -1000, Positive));
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, -1000, Positive) < encode(1, -1000, Positive));
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, -1000, Positive) <= encode(1, -1000, Positive));
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, -1000, Positive) > encode(1, -1000, Positive));
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, -1000, Positive) >= encode(1, -1000, Positive));
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, -1000, Negative) == encode(1, -1000, Negative));
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, -1000, Negative) != encode(1, -1000, Negative));
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, -1000, Negative) < encode(1, -1000, Negative));
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(2, -1000, Negative) <= encode(1, -1000, Negative));
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, -1000, Negative) > encode(1, -1000, Negative));
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(encode(2, -1000, Negative) >= encode(1, -1000, Negative));
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, CompareSpecialValues)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Infinity(Decimal::infinity(Positive));
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusInfinity(Decimal::infinity(Negative));
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal NaN(Decimal::nan());
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Zero(Decimal::zero(Positive));
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusZero(Decimal::zero(Negative));
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Ten(10);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Zero == Zero);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Zero != Zero);
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Zero < Zero);
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Zero <= Zero);
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Zero > Zero);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Zero >= Zero);
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Zero == MinusZero);
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Zero != MinusZero);
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Zero < MinusZero);
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Zero <= MinusZero);
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Zero > MinusZero);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Zero >= MinusZero);
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusZero == Zero);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusZero != Zero);
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusZero < Zero);
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusZero <= Zero);
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusZero > Zero);
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusZero >= Zero);
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusZero == MinusZero);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusZero != MinusZero);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusZero < MinusZero);
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusZero <= MinusZero);
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusZero > MinusZero);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusZero >= MinusZero);
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity == Infinity);
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity != Infinity);
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity < Infinity);
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity <= Infinity);
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity > Infinity);
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity >= Infinity);
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity == Ten);
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity != Ten);
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity < Ten);
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity <= Ten);
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity > Ten);
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity >= Ten);
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity == MinusInfinity);
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity != MinusInfinity);
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity < MinusInfinity);
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity <= MinusInfinity);
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity > MinusInfinity);
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Infinity >= MinusInfinity);
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity == NaN);
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity != NaN);
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity < NaN);
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity <= NaN);
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity > NaN);
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Infinity >= NaN);
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity == Infinity);
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity != Infinity);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity < Infinity);
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity <= Infinity);
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity > Infinity);
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity >= Infinity);
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity == Ten);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity != Ten);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity < Ten);
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity <= Ten);
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity > Ten);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity >= Ten);
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity == MinusInfinity);
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity != MinusInfinity);
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity < MinusInfinity);
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity <= MinusInfinity);
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity > MinusInfinity);
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(MinusInfinity >= MinusInfinity);
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity == NaN);
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity != NaN);
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity < NaN);
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity <= NaN);
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity > NaN);
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(MinusInfinity >= NaN);
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN == Infinity);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN != Infinity);
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN < Infinity);
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN <= Infinity);
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN > Infinity);
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN >= Infinity);
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN == Ten);
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN != Ten);
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN < Ten);
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN <= Ten);
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN > Ten);
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN >= Ten);
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN == MinusInfinity);
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN != MinusInfinity);
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN < MinusInfinity);
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN <= MinusInfinity);
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN > MinusInfinity);
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN >= MinusInfinity);
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(NaN == NaN);
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN != NaN);
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN < NaN);
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(NaN <= NaN);
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(NaN > NaN);
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(NaN >= NaN);
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Constructor)
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Positive, encode(0, 0, Positive));
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Negative, encode(0, 0, Negative));
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, Positive, encode(1, 0, Positive));
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 0, Negative, encode(1, 0, Negative));
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, Positive, encode(1, 1022, Positive));
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1022, Negative, encode(1, 1022, Negative));
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, Positive, encode(1, 1023, Positive));
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(1u, 1023, Negative, encode(1, 1023, Negative));
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 2000, Positive).isInfinity());
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(encode(1, 2000, Negative).isInfinity());
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Positive, encode(1, -2000, Positive));
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(0u, 0, Negative, encode(1, -2000, Negative));
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999998), 0, Positive, encode(UINT64_C(99999999999999998), 0, Positive));
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999998), 0, Negative, encode(UINT64_C(99999999999999998), 0, Negative));
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999999), 0, Positive, encode(UINT64_C(99999999999999999), 0, Positive));
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(99999999999999999), 0, Negative, encode(UINT64_C(99999999999999999), 0, Negative));
485d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(100000000000000000), 0, Positive, encode(UINT64_C(100000000000000000), 0, Positive));
486d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_DECIMAL_ENCODED_DATA_EQ(UINT64_C(100000000000000000), 0, Negative, encode(UINT64_C(100000000000000000), 0, Negative));
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Division)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal(0) / Decimal(1));
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, 0, Negative), Decimal(2) / Decimal(-1));
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(5, -1, Negative), Decimal(-1) / Decimal(2));
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(99, 0, Positive), Decimal(99) / Decimal(1));
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(-50) / Decimal(-50));
496d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(33333333333333333), -17, Positive), Decimal(1) / Decimal(3));
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(12345678901234), -1, Positive), encode(UINT64_C(12345678901234), 0, Positive) / Decimal(10));
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, DivisionBigExponent)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) / encode(1, 0, Positive));
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, 1022, Positive) / encode(1, 1022, Positive));
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), encode(1, 1022, Positive) / encode(1, -1000, Positive));
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, DivisionSmallExponent)
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1022, Positive), encode(1, -1022, Positive) / encode(1, 0, Positive));
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), encode(1, -1022, Positive) / encode(1, -1022, Positive));
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, DivisionSpecialValues)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Infinity(Decimal::infinity(Positive));
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusInfinity(Decimal::infinity(Negative));
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal NaN(Decimal::nan());
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Zero(Decimal::zero(Positive));
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusZero(Decimal::zero(Negative));
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Ten(10);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusTen(-10);
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Zero / Zero);
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Zero / MinusZero);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusZero / Zero);
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusZero / MinusZero);
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Ten / Zero);
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Ten / MinusZero);
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusTen / Zero);
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, MinusTen / MinusZero);
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity / Zero);
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Infinity / MinusZero);
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity / Zero);
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, MinusInfinity / MinusZero);
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity / Infinity);
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity / MinusInfinity);
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity / Infinity);
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity / MinusInfinity);
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Zero, Ten / Infinity);
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusZero, Ten / MinusInfinity);
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusZero, MinusTen / Infinity);
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Zero, MinusTen / MinusInfinity);
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN / NaN);
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN / Ten);
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Ten / NaN);
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN / Infinity);
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN / MinusInfinity);
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity / NaN);
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity / NaN);
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, EncodedData)
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(0, 0, Positive));
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Negative), encode(0, 0, Negative));
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(1));
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), encode(1, 0, Negative));
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), encode(1, 2000, Positive));
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::zero(Positive), encode(1, -2000, Positive));
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Floor)
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(1).floor());
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(0), encode(1, -10, Positive).floor());
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(11, -1, Positive).floor());
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(13, -1, Positive).floor());
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(15, -1, Positive).floor());
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(19, -1, Positive).floor());
57651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(193332, -5, Positive).floor());
57751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(12), encode(12002, -3, Positive).floor());
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), Decimal(-1).floor());
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-1), encode(1, -10, Negative).floor());
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(11, -1, Negative).floor());
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(13, -1, Negative).floor());
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(15, -1, Negative).floor());
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(19, -1, Negative).floor());
58551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(193332, -5, Negative).floor());
58651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-13), encode(12002, -3, Negative).floor());
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FloorBigExponent)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Positive), encode(1, 1000, Positive).floor());
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Negative), encode(1, 1000, Negative).floor());
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FloorSmallExponent)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(1, -1000, Positive).floor());
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), encode(1, -1000, Negative).floor());
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FloorSpecialValues)
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).floor());
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).floor());
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().floor());
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FromDouble)
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal::fromDouble(0.0));
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Negative), Decimal::fromDouble(-0.0));
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), Decimal::fromDouble(1));
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), Decimal::fromDouble(-1));
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, 0, Positive), Decimal::fromDouble(123));
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, 0, Negative), Decimal::fromDouble(-123));
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1, Positive), Decimal::fromDouble(0.1));
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1, Negative), Decimal::fromDouble(-0.1));
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FromDoubleLimits)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(2220446049250313), -31, Positive), Decimal::fromDouble(std::numeric_limits<double>::epsilon()));
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(2220446049250313), -31, Negative), Decimal::fromDouble(-std::numeric_limits<double>::epsilon()));
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(17976931348623157), 292, Positive), Decimal::fromDouble(std::numeric_limits<double>::max()));
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(17976931348623157), 292, Negative), Decimal::fromDouble(-std::numeric_limits<double>::max()));
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(22250738585072014), -324, Positive), Decimal::fromDouble(std::numeric_limits<double>::min()));
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(22250738585072014), -324, Negative), Decimal::fromDouble(-std::numeric_limits<double>::min()));
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::fromDouble(std::numeric_limits<double>::infinity()).isInfinity());
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::fromDouble(-std::numeric_limits<double>::infinity()).isInfinity());
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::fromDouble(std::numeric_limits<double>::quiet_NaN()).isNaN());
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::fromDouble(-std::numeric_limits<double>::quiet_NaN()).isNaN());
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FromInt32)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal(0));
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), Decimal(1));
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), Decimal(-1));
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(100, 0, Positive), Decimal(100));
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(100, 0, Negative), Decimal(-100));
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0x7FFFFFFF, 0, Positive), Decimal(std::numeric_limits<int32_t>::max()));
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0x80000000u, 0, Negative), Decimal(std::numeric_limits<int32_t>::min()));
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FromString)
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), fromString("0"));
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Negative), fromString("-0"));
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), fromString("1"));
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), fromString("-1"));
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), fromString("01"));
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(3, 0, Positive), fromString("+3"));
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 3, Positive), fromString("0E3"));
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(5, -1, Positive), fromString(".5"));
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(100, 0, Positive), fromString("100"));
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(100, 0, Negative), fromString("-100"));
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, -2, Positive), fromString("1.23"));
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, -2, Negative), fromString("-1.23"));
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, 8, Positive), fromString("1.23E10"));
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, 8, Negative), fromString("-1.23E10"));
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, 8, Positive), fromString("1.23E+10"));
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, 8, Negative), fromString("-1.23E+10"));
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, -12, Positive), fromString("1.23E-10"));
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, -12, Negative), fromString("-1.23E-10"));
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(5, -7, Positive), fromString("0.0000005"));
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), fromString("0e9999"));
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(123, -3, Positive), fromString("0.123"));
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, -2, Positive), fromString("00.00"));
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 2, Positive), fromString("1E2"));
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), fromString("1E20000"));
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::zero(Positive), fromString("1E-20000"));
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1000, 1023, Positive), fromString("1E1026"));
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::zero(Positive), fromString("1E-1026"));
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), fromString("1234567890E1036"));
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2^1024
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const uint64_t leadingDigitsOf2PowerOf1024 = UINT64_C(17976931348623159);
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(leadingDigitsOf2PowerOf1024, 292, Positive), fromString("179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216"));
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// These strings are look like proper number, but we don't accept them.
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FromStringLikeNumber)
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString(" 123 "));
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("1,234"));
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// fromString doesn't support infinity and NaN.
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, FromStringSpecialValues)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("INF"));
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("Infinity"));
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("infinity"));
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("+Infinity"));
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("+infinity"));
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("-Infinity"));
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("-infinity"));
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("NaN"));
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("nan"));
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("+NaN"));
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("+nan"));
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("-NaN"));
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("-nan"));
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, fromStringTruncated)
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("x"));
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("0."));
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("1x"));
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("1Ex"));
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("1E2x"));
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), fromString("1E+x"));
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Multiplication)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal(0) * Decimal(0));
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, 0, Negative), Decimal(2) * Decimal(-1));
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, 0, Negative), Decimal(-1) * Decimal(2));
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(99, 0, Positive), Decimal(99) * Decimal(1));
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2500, 0, Positive), Decimal(-50) * Decimal(-50));
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 21, Positive), encode(UINT64_C(10000000000), 0, Positive) * encode(UINT64_C(100000000000), 0, Positive));
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, MultiplicationBigExponent)
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) * encode(1, 0, Positive));
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), encode(1, 1022, Positive) * encode(1, 1022, Positive));
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 22, Positive), encode(1, 1022, Positive) * encode(1, -1000, Positive));
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, MultiplicationSmallExponent)
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1022, Positive), encode(1, -1022, Positive) * encode(1, 0, Positive));
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(1, -1022, Positive) * encode(1, -1022, Positive));
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, MultiplicationSpecialValues)
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Infinity(Decimal::infinity(Positive));
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusInfinity(Decimal::infinity(Negative));
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal NaN(Decimal::nan());
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Ten(10);
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusTen(-10);
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Zero(Decimal::zero(Positive));
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusZero(Decimal::zero(Negative));
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity * Infinity);
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Infinity * MinusInfinity);
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity * Infinity);
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, MinusInfinity * MinusInfinity);
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity * Zero);
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Zero * MinusInfinity);
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity * Zero);
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity * Zero);
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity * MinusZero);
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusZero * MinusInfinity);
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity * MinusZero);
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity * MinusZero);
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity * Ten);
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Ten * Infinity);
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity * Ten);
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Ten * MinusInfinity);
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Infinity * MinusTen);
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusTen * Infinity);
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, MinusInfinity * MinusTen);
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, MinusTen * MinusInfinity);
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN * NaN);
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN * Ten);
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Ten * NaN);
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN * Infinity);
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN * MinusInfinity);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity * NaN);
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity * NaN);
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Negate)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Negative), -encode(0, 0, Positive));
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), -encode(0, 0, Negative));
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 10, Negative), -encode(0, 10, Positive));
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 10, Positive), -encode(0, 10, Negative));
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, -10, Negative), -encode(0, -10, Positive));
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, -10, Positive), -encode(0, -10, Negative));
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), -encode(1, 0, Positive));
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Positive), -encode(1, 0, Negative));
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 10, Negative), -encode(1, 10, Positive));
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 10, Positive), -encode(1, 10, Negative));
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -10, Negative), -encode(1, -10, Positive));
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -10, Positive), -encode(1, -10, Negative));
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, NegateBigExponent)
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Negative), -encode(1, 1000, Positive));
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1000, Positive), -encode(1, 1000, Negative));
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, NegateSmallExponent)
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1000, Negative), -encode(1, -1000, Positive));
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1000, Positive), -encode(1, -1000, Negative));
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, NegateSpecialValues)
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), -Decimal::infinity(Positive));
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), -Decimal::infinity(Negative));
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), -Decimal::nan());
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Predicates)
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::zero(Positive).isFinite());
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Positive).isInfinity());
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Positive).isNaN());
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::zero(Positive).isPositive());
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Positive).isNegative());
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Positive).isSpecial());
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::zero(Positive).isZero());
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::zero(Negative).isFinite());
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Negative).isInfinity());
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Negative).isNaN());
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Negative).isPositive());
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::zero(Negative).isNegative());
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::zero(Negative).isSpecial());
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::zero(Negative).isZero());
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(123).isFinite());
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(123).isInfinity());
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(123).isNaN());
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(123).isPositive());
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(123).isNegative());
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(123).isSpecial());
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(123).isZero());
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(-123).isFinite());
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(-123).isInfinity());
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(-123).isNaN());
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(-123).isPositive());
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal(-123).isNegative());
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(-123).isSpecial());
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal(-123).isZero());
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, PredicatesSpecialValues)
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Positive).isFinite());
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::infinity(Positive).isInfinity());
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Positive).isNaN());
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::infinity(Positive).isPositive());
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Positive).isNegative());
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::infinity(Positive).isSpecial());
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Positive).isZero());
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Negative).isFinite());
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::infinity(Negative).isInfinity());
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Negative).isNaN());
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Negative).isPositive());
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::infinity(Negative).isNegative());
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::infinity(Negative).isSpecial());
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::infinity(Negative).isZero());
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::nan().isFinite());
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::nan().isInfinity());
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::nan().isNaN());
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_TRUE(Decimal::nan().isSpecial());
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_FALSE(Decimal::nan().isZero());
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LayoutTests/fast/forms/number/number-stepup-stepdown-from-renderer
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RealWorldExampleNumberStepUpStepDownFromRenderer)
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("10", stepDown("0", "100", "10", "19", 1));
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("90", stepUp("0", "99", "10", "89", 1));
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1", stepUp("0", "1", "0.33333333333333333", "0", 3)); // step=1/3
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("0.01", stepUp("0", "0.01", "0.0033333333333333333", "0", 3)); // step=1/300
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1", stepUp("0", "1", "0.003921568627450980", "0", 255)); // step=1/255
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1", stepUp("0", "1", "0.1", "0", 10));
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RealWorldExampleNumberStepUpStepDownFromRendererRounding)
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.015", stepUp("0", "100", "0.005", "5.005", 2));
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.06", stepUp("0", "100", "0.005", "5.005", 11));
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.065", stepUp("0", "100", "0.005", "5.005", 12));
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.015", stepUp("4", "9", "0.005", "5.005", 2));
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.06", stepUp("4", "9", "0.005", "5.005", 11));
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.065", stepUp("4", "9", "0.005", "5.005", 12));
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RealWorldExampleRangeStepUpStepDown)
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1e+38", stepUp("0", "1E38", "1", "1E38", 9));
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1e+38", stepDown("0", "1E38", "1", "1E38", 9));
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Remainder)
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
915926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(encode(21, -1, Positive), encode(21, -1, Positive).remainder(3));
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(10).remainder(3));
917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(Decimal(1), Decimal(10).remainder(-3));
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 0, Negative), Decimal(-10).remainder(3));
919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(Decimal(-1), Decimal(-10).remainder(-3));
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(2, -1, Positive), encode(102, -1, Positive).remainder(1));
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1, Positive), Decimal(10).remainder(encode(3, -1, Positive)));
922926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(Decimal(1), encode(36, -1, Positive).remainder(encode(13, -1, Positive)));
923d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(encode(1, 86, Positive), (encode(1234, 100, Positive).remainder(Decimal(3))));
924926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(Decimal(500), (Decimal(500).remainder(1000)));
925926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(Decimal(-500), (Decimal(-500).remainder(1000)));
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RemainderBigExponent)
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 1022, Positive), encode(1, 1022, Positive).remainder(encode(1, 0, Positive)));
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 1022, Positive), encode(1, 1022, Positive).remainder(encode(1, 1022, Positive)));
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), encode(1, 1022, Positive).remainder(encode(1, -1000, Positive)));
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RemainderSmallExponent)
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, -1022, Positive), encode(1, -1022, Positive).remainder(encode(1, 0, Positive)));
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, -1022, Positive), encode(1, -1022, Positive).remainder(encode(1, -1022, Positive)));
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RemainderSpecialValues)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).remainder(1));
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).remainder(1));
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(1));
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Positive).remainder(-1));
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).remainder(-1));
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(-1));
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).remainder(3));
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).remainder(3));
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(3));
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Positive).remainder(-1));
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Negative).remainder(-1));
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().remainder(-1));
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::infinity(Positive)));
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::infinity(Negative)));
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal(1).remainder(Decimal::nan()));
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Round)
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), (Decimal(9) / Decimal(10)).round());
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(25), (Decimal(5) / fromString("0.200")).round());
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(3), (Decimal(5) / Decimal(2)).round());
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(1), (Decimal(2) / Decimal(3)).round());
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(3), (Decimal(10) / Decimal(3)).round());
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(3), (Decimal(1) / fromString("0.3")).round());
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(10), (Decimal(1) / fromString("0.1")).round());
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(5), (Decimal(1) / fromString("0.2")).round());
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal(10), (fromString("10.2") / 1).round());
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1234, 100, Positive), encode(1234, 100, Positive).round());
97651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
97751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(190002, -5, Positive).round());
97851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(150002, -5, Positive).round());
97951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(2), encode(150000, -5, Positive).round());
98051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(12), encode(12492, -3, Positive).round());
98151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(13), encode(12502, -3, Positive).round());
98251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
98351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(190002, -5, Negative).round());
98451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(150002, -5, Negative).round());
98551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-2), encode(150000, -5, Negative).round());
98651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-12), encode(12492, -3, Negative).round());
98751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    EXPECT_EQ(Decimal(-13), encode(12502, -3, Negative).round());
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, RoundSpecialValues)
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Positive), Decimal::infinity(Positive).round());
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::infinity(Negative), Decimal::infinity(Negative).round());
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Decimal::nan(), Decimal::nan().round());
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, Subtract)
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal(0) - Decimal(0));
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(3, 0, Positive), Decimal(2) - Decimal(-1));
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(3, 0, Negative), Decimal(-1) - Decimal(2));
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(98, 0, Positive), Decimal(99) - Decimal(1));
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), Decimal(-50) - Decimal(-50));
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Positive), encode(1, 50, Positive) - Decimal(1));
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(1000000000000000), 35, Negative), Decimal(1) - encode(1, 50, Positive));
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, SubtractBigExponent)
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) - encode(1, 0, Positive));
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(1, 1022, Positive) - encode(1, 1022, Positive));
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(1, 1022, Positive), encode(1, 1022, Positive) + encode(1, -1000, Positive));
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, SubtractSmallExponent)
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(UINT64_C(10000000000000000), -16, Negative), encode(1, -1022, Positive) - encode(1, 0, Positive));
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(encode(0, 0, Positive), encode(1, -1022, Positive) - encode(1, -1022, Positive));
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, SubtractSpecialValues)
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Infinity(Decimal::infinity(Positive));
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal MinusInfinity(Decimal::infinity(Negative));
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal NaN(Decimal::nan());
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Decimal Ten(10);
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity - Infinity);
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity - MinusInfinity);
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity - Infinity);
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity - MinusInfinity);
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Infinity - Ten);
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, Ten - Infinity);
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(MinusInfinity, MinusInfinity - Ten);
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(Infinity, Ten - MinusInfinity);
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN - NaN);
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN - Ten);
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Ten - NaN);
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN - Infinity);
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, NaN - MinusInfinity);
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, Infinity - NaN);
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(NaN, MinusInfinity - NaN);
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, ToDouble)
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.0, encode(0, 0, Positive).toDouble());
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(-0.0, encode(0, 0, Negative).toDouble());
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(1.0, encode(1, 0, Positive).toDouble());
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(-1.0, encode(1, 0, Negative).toDouble());
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.1, encode(1, -1, Positive).toDouble());
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(-0.1, encode(1, -1, Negative).toDouble());
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.3, encode(3, -1, Positive).toDouble());
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(-0.3, encode(3, -1, Negative).toDouble());
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.6, encode(6, -1, Positive).toDouble());
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(-0.6, encode(6, -1, Negative).toDouble());
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.7, encode(7, -1, Positive).toDouble());
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(-0.7, encode(7, -1, Negative).toDouble());
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.01, encode(1, -2, Positive).toDouble());
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.001, encode(1, -3, Positive).toDouble());
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.0001, encode(1, -4, Positive).toDouble());
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.00001, encode(1, -5, Positive).toDouble());
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(1e+308, encode(1, 308, Positive).toDouble());
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(1e-307, encode(1, -307, Positive).toDouble());
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1073926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_TRUE(std::isinf(encode(1, 1000, Positive).toDouble()));
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_EQ(0.0, encode(1, -1000, Positive).toDouble());
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, ToDoubleSpecialValues)
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1079926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_TRUE(std::isinf(Decimal::infinity(Decimal::Positive).toDouble()));
1080926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_TRUE(std::isinf(Decimal::infinity(Decimal::Negative).toDouble()));
1081926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_TRUE(std::isnan(Decimal::nan().toDouble()));
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, ToString)
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("0", Decimal::zero(Positive));
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-0", Decimal::zero(Negative));
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1", Decimal(1));
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-1", Decimal(-1));
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1234567", Decimal(1234567));
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-1234567", Decimal(-1234567));
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("0.5", encode(5, -1, Positive));
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-0.5", encode(5, -1, Negative));
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("12.345", encode(12345, -3, Positive));
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-12.345", encode(12345, -3, Negative));
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("0.12345", encode(12345, -5, Positive));
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-0.12345", encode(12345, -5, Negative));
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("50", encode(50, 0, Positive));
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-50", encode(50, 0, Negative));
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5e+1", encode(5, 1, Positive));
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-5e+1", encode(5, 1, Negative));
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.678e+103", encode(5678, 100, Positive));
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-5.678e+103", encode(5678, 100, Negative));
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("5.678e-97", encode(5678, -100, Positive));
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-5.678e-97", encode(5678, -100, Negative));
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("8639999913600001", encode(UINT64_C(8639999913600001), 0, Positive));
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("9007199254740991", encode((static_cast<uint64_t>(1) << DBL_MANT_DIG) - 1, 0, Positive));
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("99999999999999999", encode(UINT64_C(99999999999999999), 0, Positive));
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("9.9999999999999999e+17", encode(UINT64_C(99999999999999999), 1, Positive));
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("9.9999999999999999e+18", encode(UINT64_C(99999999999999999), 2, Positive));
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1e+16", encode(UINT64_C(99999999999999999), -1, Positive));
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1000000000000000", encode(UINT64_C(99999999999999999), -2, Positive));
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1", encode(UINT64_C(99999999999999999), -17, Positive));
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("0.001", encode(UINT64_C(99999999999999999), -20, Positive));
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("1e-83", encode(UINT64_C(99999999999999999), -100, Positive));
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(DecimalTest, ToStringSpecialValues)
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("Infinity", Decimal::infinity(Positive));
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("-Infinity", Decimal::infinity(Negative));
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EXPECT_DECIMAL_STREQ("NaN", Decimal::nan());
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1124