// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "platform/assert.h"
#include "vm/object.h"
#include "vm/object_store.h"
#include "vm/unit_test.h"

namespace dart {

TEST_CASE(BigintSmi) {
  {
    const Smi& smi = Smi::Handle(Smi::New(5));
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
    EXPECT_EQ(5, bigint.AsInt64Value());
    EXPECT(bigint.FitsIntoSmi());
    Smi& smi_back = Smi::Handle();
    smi_back ^= bigint.AsValidInteger();
    EXPECT_EQ(5, smi_back.Value());
  }

  {
    const Smi& smi = Smi::Handle(Smi::New(Smi::kMaxValue));
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
    EXPECT(Smi::kMaxValue == bigint.AsInt64Value());
    EXPECT(bigint.FitsIntoSmi());
    Smi& smi_back = Smi::Handle();
    smi_back ^= bigint.AsValidInteger();
    EXPECT(Smi::kMaxValue == smi_back.Value());
  }

  {
    const Smi& smi = Smi::Handle(Smi::New(Smi::kMinValue));
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
    EXPECT(bigint.IsNegative());
    EXPECT(Smi::kMinValue == bigint.AsInt64Value());
    EXPECT(bigint.FitsIntoSmi());
    Smi& smi_back = Smi::Handle();
    smi_back ^= bigint.AsValidInteger();
    EXPECT(Smi::kMinValue == smi_back.Value());
  }

  {
    ASSERT(0xFFFFFFF < Smi::kMaxValue);
    const Smi& smi = Smi::Handle(Smi::New(0xFFFFFFF));
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
    EXPECT_EQ(0xFFFFFFF, bigint.AsInt64Value());
    EXPECT(bigint.FitsIntoSmi());
    Smi& smi_back = Smi::Handle();
    smi_back ^= bigint.AsValidInteger();
    EXPECT_EQ(0xFFFFFFF, smi_back.Value());
  }

  {
    ASSERT(0x10000000 < Smi::kMaxValue);
    const Smi& smi = Smi::Handle(Smi::New(0x10000000));
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(smi.Value()));
    EXPECT_EQ(0x10000000, bigint.AsInt64Value());
    EXPECT(bigint.FitsIntoSmi());
    Smi& smi_back = Smi::Handle();
    smi_back ^= bigint.AsValidInteger();
    EXPECT(0x10000000 == smi_back.Value());
  }
}


TEST_CASE(BigintInt64) {
  const int64_t kValue = 100000000;
  const int64_t kValue64 = kValue * kValue;
  Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(kValue));
  EXPECT_EQ(kValue, bigint.AsInt64Value());
  bigint = Bigint::NewFromInt64(kValue64);
  EXPECT_EQ(kValue64, bigint.AsInt64Value());
  bigint = Bigint::NewFromInt64(-kValue64);
  EXPECT_EQ(-kValue64, bigint.AsInt64Value());
  bigint = Bigint::NewFromInt64(kMinInt64);
  EXPECT(bigint.FitsIntoInt64());
  EXPECT_EQ(kMinInt64, bigint.AsInt64Value());
}


TEST_CASE(BigintUint64) {
  const Bigint& one = Bigint::Handle(Bigint::NewFromUint64(1));
  EXPECT(one.FitsIntoInt64());
  EXPECT(one.FitsIntoUint64());

  const Bigint& big = Bigint::Handle(Bigint::NewFromUint64(kMaxUint64));
  EXPECT(!big.FitsIntoInt64());
  EXPECT(big.FitsIntoUint64());

  uint64_t back = big.AsUint64Value();
  EXPECT_EQ(kMaxUint64, back);
}


TEST_CASE(BigintDouble) {
  Bigint& bigint = Bigint::Handle(Bigint::NewFromInt64(5));
  EXPECT_EQ(5.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromInt64(0);
  EXPECT_EQ(0.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromInt64(-12345678);
  EXPECT_EQ(-1.2345678e+7, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("1");
  EXPECT_EQ(1.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("123456");
  EXPECT_EQ(123456.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("123456789");
  EXPECT_EQ(123456789.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("12345678901234567");
  EXPECT_EQ(12345678901234568.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("98765432109876");
  EXPECT_EQ(9.8765432109876e+13, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x17777777777778");
  EXPECT_EQ(6605279453476728.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x37777777777778");
  EXPECT_EQ(15612478708217720.0, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x177777777777781234567");
  EXPECT_EQ(1.7730912021014563e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x177777777777788000000");
  EXPECT_EQ(1.7730912021014563e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x177777777777788000001");
  EXPECT_EQ(1.7730912021014565e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x177777777777798000000");
  EXPECT_EQ(1.7730912021014568e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x177777777777798000001");
  EXPECT_EQ(1.7730912021014568e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x377777777777790000000");
  EXPECT_EQ(4.1909428413307146e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x377777777777790000001");
  EXPECT_EQ(4.190942841330715e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x377777777777730000000");
  EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("0x377777777777730000001");
  EXPECT_EQ(4.1909428413307135e+24, bigint.AsDoubleValue());

  // Reduced precision.
  bigint = Bigint::NewFromCString("9876543210987654321098765432109876543210");
  EXPECT_EQ(9.8765432109876546e+39, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString(
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890"
      "12345678901234567890123456789012345678901234567890");
  double zero = 0.0;
  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString(
      "17976931348623157081452742373170435679807056752584"
      "49965989174768031572607800285387605895586327668781"
      "71540458953514382464234321326889464182768467546703"
      "53751698604991057655128207624549009038932894407586"
      "85084551339423045832369032229481658085593321233482"
      "74797826204144723168738177180919299881250404026184"
      "124858368");
  EXPECT_EQ(1.7976931348623157e308, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString(
      "17976931348623159077293051907890247336179769789423"
      "06572734300811577326758055009631327084773224075360"
      "21120113879871393357658789768814416622492847430639"
      "47412437776789342486548527630221960124609411945308"
      "29520850057688381506823424628814739131105408272371"
      "63350510684586298239947245938479716304835356329624"
      "224137216");
  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString(
      "17976931348623158079372897140530341507993413271003"
      "78269361737789804449682927647509466490179775872070"
      "96330286416692887910946555547851940402630657488671"
      "50582068190890200070838367627385484581771153176447"
      "57302700698555713669596228429148198608349364752927"
      "19074168444365510704342711559699508093042880177904"
      "174497792");
  EXPECT_EQ(1.0 / zero, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString(
      "17976931348623158079372897140530341507993413271003"
      "78269361737789804449682927647509466490179775872070"
      "96330286416692887910946555547851940402630657488671"
      "50582068190890200070838367627385484581771153176447"
      "57302700698555713669596228429148198608349364752927"
      "19074168444365510704342711559699508093042880177904"
      "174497791");
  EXPECT_EQ(1.7976931348623157e308, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("100000000000000000000000");
  EXPECT_EQ(1e+23, bigint.AsDoubleValue());

  bigint = Bigint::NewFromCString("100000000000000000000001");
  EXPECT_EQ(1.0000000000000001e+23, bigint.AsDoubleValue());

  // Same but shifted 64 bits to the left.
  bigint =
      Bigint::NewFromCString("1844674407370955161600000000000000000000000");
  EXPECT_EQ(1.844674407370955e+42, bigint.AsDoubleValue());

  bigint =
      Bigint::NewFromCString("1844674407370955161600000000000000000000001");
  EXPECT_EQ(1.8446744073709553e+42, bigint.AsDoubleValue());
}


TEST_CASE(BigintHexStrings) {
  Zone* zone = Thread::Current()->zone();
  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x0"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(0, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x1"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(1, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(0x123, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0x123", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0xaBcEf"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0xABCEF", str);
  }

  {
    const char* in = "0x123456789";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(in, str);
  }

  {
    const char* in = "0xFFFFFFF";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(in, str);
  }

  {
    const char* in = "0x10000000";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(in, str);
  }

  {
    const char* in = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(in, str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(-0x123, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0x123", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0xaBcEf"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0xABCEF", str);
  }

  {
    const char* in = "-0x123456789";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(in, str);
  }

  {
    const char* in = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(in, str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x00000123"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(0x123, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("0x000000123"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0x123", str);
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("0x0000aBcEf"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0xABCEF", str);
  }

  {
    const char* in = "0x00000000000000000000000000000000000000000000123456789";
    const char* out = "0x123456789";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(out, str);
  }

  {
    const char* in = "0x00000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const char* out = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(out, str);
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("-0x00000123"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(-0x123, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("-0x00000123"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0x123", str);
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("-0x000aBcEf"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0xABCEF", str);
  }

  {
    const char* in = "-0x00000000000000000000000000000000000000000000123456789";
    const char* out = "-0x123456789";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(out, str);
  }

  {
    const char* in = "-0x0000123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const char* out = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(out, str);
  }
  {
    const char* test = "12345678901234567890";
    const char* out = "0xAB54A98CEB1F0AD2";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(test));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(out, str);
  }
  {
    const char* test = "-12345678901234567890";
    const char* out = "-0xAB54A98CEB1F0AD2";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(test));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ(out, str);
  }
}


TEST_CASE(BigintDecStrings) {
  Zone* zone = Thread::Current()->zone();
  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x0"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("0", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x123"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("291", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0xaBcEf"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("703727", str);
  }

  {
    const char* in = "0x123456789";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("4886718345", str);
  }

  {
    const char* in = "0xFFFFFFF";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("268435455", str);
  }

  {
    const char* in = "0x10000000";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("268435456", str);
  }

  {
    const char* in = "0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("7141946863373290020600059860922167424469804758405880798960",
                 str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(-291, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0x123"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("-291", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0xaBcEf"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("-703727", str);
  }

  {
    const char* in = "-0x123456789";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("-4886718345", str);
  }

  {
    const char* in = "-0x123456789ABCDEF01234567890ABCDEF0123456789ABCDEF0";
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString(in));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("-7141946863373290020600059860922167424469804758405880798960",
                 str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0x00000123"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(0x123, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("0x000000123"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("291", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(
        Bigint::NewFromCString("100000000000000000000000000000000"));
    const char* str = bigint.ToDecCString(zone);
    EXPECT_STREQ("100000000000000000000000000000000", str);
  }
}


static void TestBigintCompare(const char* a, const char* b, int compare) {
  const Bigint& bigint_a = Bigint::Handle(Bigint::NewFromCString(a));
  const Bigint& bigint_b = Bigint::Handle(Bigint::NewFromCString(b));
  const Integer& int_a = Integer::Handle(bigint_a.AsValidInteger());
  const Integer& int_b = Integer::Handle(bigint_b.AsValidInteger());
  int computed_compare = int_a.CompareWith(int_b);
  int inverted_compare = int_b.CompareWith(int_a);
  if (compare == 0) {
    EXPECT(computed_compare == 0);
    EXPECT(inverted_compare == 0);
  } else if (compare < 0) {
    ASSERT(computed_compare < 0);
    EXPECT(computed_compare < 0);
    EXPECT(inverted_compare > 0);
  } else {
    ASSERT(compare > 0);
    EXPECT(computed_compare > 0);
    EXPECT(inverted_compare < 0);
  }
}


TEST_CASE(BigintCompare) {
  TestBigintCompare("0x0", "0x0", 0);
  TestBigintCompare("0x1", "0x1", 0);
  TestBigintCompare("-0x1", "-0x1", 0);
  TestBigintCompare("0x1234567", "0x1234567", 0);
  TestBigintCompare("-0x1234567", "-0x1234567", 0);
  TestBigintCompare("0x12345678", "0x12345678", 0);
  TestBigintCompare("-0x12345678", "-0x12345678", 0);
  TestBigintCompare("0x123456789ABCDEF0", "0x123456789ABCDEF0", 0);
  TestBigintCompare("-0x123456789ABCDEF0", "-0x123456789ABCDEF0", 0);
  TestBigintCompare("0x123456789ABCDEF01", "0x123456789ABCDEF01", 0);
  TestBigintCompare("-0x123456789ABCDEF01", "-0x123456789ABCDEF01", 0);
  TestBigintCompare("0x1", "0x0", 1);
  TestBigintCompare("-0x1", "-0x2", 1);
  TestBigintCompare("0x1234567", "0x1234566", 1);
  TestBigintCompare("-0x1234567", "-0x1234568", 1);
  TestBigintCompare("0x12345678", "0x12345677", 1);
  TestBigintCompare("-0x12345678", "-0x12345679", 1);
  TestBigintCompare("0x123456789ABCDEF1", "0x123456789ABCDEF0", 1);
  TestBigintCompare("-0x123456789ABCDEF0", "-0x123456789ABCDEF1", 1);
  TestBigintCompare("0x123456789ABCDEF02", "0x123456789ABCDEF01", 1);
  TestBigintCompare("-0x123456789ABCDEF00", "-0x123456789ABCDEF01", 1);
  TestBigintCompare("0x10000000", "0xFFFFFFF", 1);
  TestBigintCompare("-0x10000000", "-0xFFFFFFF", -1);
  TestBigintCompare("0x100000000", "0xFFFFFFFF", 1);
  TestBigintCompare("-0x100000000", "-0xFFFFFFFF", -1);
  TestBigintCompare("0x10000000000000000", "0xFFFFFFFFFFFFFFFF", 1);
  TestBigintCompare("-0x10000000000000000", "-0xFFFFFFFFFFFFFFFF", -1);
  TestBigintCompare("0x10000000000000000", "0x0", 1);
  TestBigintCompare("-0x10000000000000000", "0x0", -1);
  TestBigintCompare("-0x1234567", "0x1234566", -1);
  TestBigintCompare("-0x1234567", "0x1234568", -1);
  TestBigintCompare("-0x12345678", "0x12345677", -1);
  TestBigintCompare("-0x12345678", "0x12345670", -1);
  TestBigintCompare("-0x123456789ABCDEF1", "0x123456789ABCDEF0", -1);
  TestBigintCompare("-0x123456789ABCDEF0", "0x123456789ABCDEF1", -1);
  TestBigintCompare("-0x123456789ABCDEF02", "0x123456789ABCDEF01", -1);
  TestBigintCompare("-0x123456789ABCDEF00", "0x123456789ABCDEF01", -1);
  TestBigintCompare("-0x10000000", "0xFFFFFFF", -1);
  TestBigintCompare("-0x10000000", "0xFFFFFFF", -1);
  TestBigintCompare("-0x100000000", "0xFFFFFFFF", -1);
  TestBigintCompare("-0x100000000", "0xFFFFFFFF", -1);
  TestBigintCompare("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", -1);
  TestBigintCompare("-0x10000000000000000", "0xFFFFFFFFFFFFFFFF", -1);
  TestBigintCompare("-0x10000000000000000", "0x0", -1);
  TestBigintCompare("-0x10000000000000000", "0x0", -1);
}


TEST_CASE(BigintDecimalStrings) {
  Zone* zone = Thread::Current()->zone();
  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("0"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(0, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("1"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(1, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("703710"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0xABCDE", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("11259375"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0xABCDEF", str);
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("1311768467463790320"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("0x123456789ABCDEF0", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-0"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(0, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-1"));
    EXPECT(bigint.FitsIntoSmi());
    EXPECT_EQ(-1, bigint.AsInt64Value());
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-703710"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0xABCDE", str);
  }

  {
    const Bigint& bigint = Bigint::Handle(Bigint::NewFromCString("-11259375"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0xABCDEF", str);
  }

  {
    const Bigint& bigint =
        Bigint::Handle(Bigint::NewFromCString("-1311768467463790320"));
    const char* str = bigint.ToHexCString(zone);
    EXPECT_STREQ("-0x123456789ABCDEF0", str);
  }
}

}  // namespace dart
