// Copyright (c) 2012, 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.

library Int32test;

import 'package:fixnum/fixnum.dart';
import 'package:unittest/unittest.dart';

void main() {
  group("isX tests", () {
    test("isEven", () {
      expect((-Int32.ONE).isEven, false);
      expect(Int32.ZERO.isEven, true);
      expect(Int32.ONE.isEven, false);
      expect(Int32.TWO.isEven, true);
    });
    test("isMaxValue", () {
      expect(Int32.MIN_VALUE.isMaxValue, false);
      expect(Int32.ZERO.isMaxValue, false);
      expect(Int32.MAX_VALUE.isMaxValue, true);
    });
    test("isMinValue", () {
      expect(Int32.MIN_VALUE.isMinValue, true);
      expect(Int32.ZERO.isMinValue, false);
      expect(Int32.MAX_VALUE.isMinValue, false);
    });
    test("isNegative", () {
      expect(Int32.MIN_VALUE.isNegative, true);
      expect(Int32.ZERO.isNegative, false);
      expect(Int32.ONE.isNegative, false);
    });
    test("isOdd", () {
      expect((-Int32.ONE).isOdd, true);
      expect(Int32.ZERO.isOdd, false);
      expect(Int32.ONE.isOdd, true);
      expect(Int32.TWO.isOdd, false);
    });
    test("isZero", () {
      expect(Int32.MIN_VALUE.isZero, false);
      expect(Int32.ZERO.isZero, true);
      expect(Int32.MAX_VALUE.isZero, false);
    });
    test("bitLength", () {
      expect(new Int32(-2).bitLength, 1);
      expect((-Int32.ONE).bitLength, 0);
      expect(Int32.ZERO.bitLength, 0);
      expect(Int32.ONE.bitLength, 1);
      expect(new Int32(2).bitLength, 2);
      expect(Int32.MAX_VALUE.bitLength, 31);
      expect(Int32.MIN_VALUE.bitLength, 31);
    });
  });

  group("arithmetic operators", () {
    Int32 n1 = new Int32(1234);
    Int32 n2 = new Int32(9876);
    Int32 n3 = new Int32(-1234);
    Int32 n4 = new Int32(-9876);
    Int32 n5 = new Int32(0x12345678);
    Int32 n6 = new Int32(0x22222222);

    test("+", () {
      expect(n1 + n2, new Int32(11110));
      expect(n3 + n2, new Int32(8642));
      expect(n3 + n4, new Int32(-11110));
      expect(n3 + new Int64(1), new Int64(-1233));
      expect(Int32.MAX_VALUE + 1, Int32.MIN_VALUE);
      expect(() => new Int32(17) + null, throws);
    });

    test("-", () {
      expect(n1 - n2, new Int32(-8642));
      expect(n3 - n2, new Int32(-11110));
      expect(n3 - n4, new Int32(8642));
      expect(n3 - new Int64(1), new Int64(-1235));
      expect(Int32.MIN_VALUE - 1, Int32.MAX_VALUE);
      expect(() => new Int32(17) - null, throws);
    });

    test("unary -", () {
      expect(-n1, new Int32(-1234));
      expect(-Int32.ZERO, Int32.ZERO);
    });

    test("*", () {
      expect(n1 * n2, new Int32(12186984));
      expect(n2 * n3, new Int32(-12186984));
      expect(n3 * n3, new Int32(1522756));
      expect(n3 * n2, new Int32(-12186984));
      expect(
          new Int32(0x12345678) * new Int32(0x22222222), new Int32(-899716112));
      expect(
          (new Int32(123456789) * new Int32(987654321)), new Int32(-67153019));
      expect(new Int32(0x12345678) * new Int64(0x22222222),
          new Int64.fromInts(0x026D60DC, 0xCA5F6BF0));
      expect((new Int32(123456789) * 987654321), new Int32(-67153019));
      expect(() => new Int32(17) * null, throws);
    });

    test("~/", () {
      expect(new Int32(829893893) ~/ new Int32(1919), new Int32(432461));
      expect(new Int32(0x12345678) ~/ new Int32(0x22),
          new Int32(0x12345678 ~/ 0x22));
      expect(new Int32(829893893) ~/ new Int64(1919), new Int32(432461));
      expect(new Int32(0x12345678) ~/ new Int64(0x22),
          new Int32(0x12345678 ~/ 0x22));
      expect(new Int32(829893893) ~/ 1919, new Int32(432461));
      expect(() => new Int32(17) ~/ Int32.ZERO, throws);
      expect(() => new Int32(17) ~/ null, throws);
    });

    test("%", () {
      expect(new Int32(0x12345678) % new Int32(0x22),
          new Int32(0x12345678 % 0x22));
      expect(new Int32(0x12345678) % new Int64(0x22),
          new Int32(0x12345678 % 0x22));
      expect(() => new Int32(17) % null, throws);
    });

    test("remainder", () {
      expect(new Int32(0x12345678).remainder(new Int32(0x22)),
          new Int32(0x12345678.remainder(0x22)));
      expect(new Int32(0x12345678).remainder(new Int32(-0x22)),
          new Int32(0x12345678.remainder(-0x22)));
      expect(new Int32(-0x12345678).remainder(new Int32(-0x22)),
          new Int32(-0x12345678.remainder(-0x22)));
      expect(new Int32(-0x12345678).remainder(new Int32(0x22)),
          new Int32(-0x12345678.remainder(0x22)));
      expect(new Int32(0x12345678).remainder(new Int64(0x22)),
          new Int32(0x12345678.remainder(0x22)));
      expect(() => new Int32(17).remainder(null), throws);
    });

    test("abs", () {
      // NOTE: Int32.MIN_VALUE.abs() is undefined
      expect((Int32.MIN_VALUE + 1).abs(), Int32.MAX_VALUE);
      expect(new Int32(-1).abs(), new Int32(1));
      expect(new Int32(0).abs(), new Int32(0));
      expect(new Int32(1).abs(), new Int32(1));
      expect(Int32.MAX_VALUE.abs(), Int32.MAX_VALUE);
    });

    test("clamp", () {
      Int32 val = new Int32(17);
      expect(val.clamp(20, 30), new Int32(20));
      expect(val.clamp(10, 20), new Int32(17));
      expect(val.clamp(10, 15), new Int32(15));

      expect(val.clamp(new Int32(20), new Int32(30)), new Int32(20));
      expect(val.clamp(new Int32(10), new Int32(20)), new Int32(17));
      expect(val.clamp(new Int32(10), new Int32(15)), new Int32(15));

      expect(val.clamp(new Int64(20), new Int64(30)), new Int32(20));
      expect(val.clamp(new Int64(10), new Int64(20)), new Int32(17));
      expect(val.clamp(new Int64(10), new Int64(15)), new Int32(15));
      expect(val.clamp(Int64.MIN_VALUE, new Int64(30)), new Int32(17));
      expect(val.clamp(new Int64(10), Int64.MAX_VALUE), new Int32(17));

      expect(() => val.clamp(30.5, 40.5), throwsArgumentError);
      expect(() => val.clamp(5.5, 10.5), throwsArgumentError);
      expect(() => val.clamp('a', 1), throwsArgumentError);
      expect(() => val.clamp(1, 'b'), throwsArgumentError);
      expect(() => val.clamp('a', 1), throwsArgumentError);
    });
  });

  group("leading/trailing zeros", () {
    test("numberOfLeadingZeros", () {
      expect(new Int32(0).numberOfLeadingZeros(), 32);
      expect(new Int32(1).numberOfLeadingZeros(), 31);
      expect(new Int32(0xffff).numberOfLeadingZeros(), 16);
      expect(new Int32(-1).numberOfLeadingZeros(), 0);
    });
    test("numberOfTrailingZeros", () {
      expect(new Int32(0).numberOfTrailingZeros(), 32);
      expect(new Int32(0x80000000).numberOfTrailingZeros(), 31);
      expect(new Int32(1).numberOfTrailingZeros(), 0);
      expect(new Int32(0x10000).numberOfTrailingZeros(), 16);
    });
  });

  group("comparison operators", () {
    test("compareTo", () {
      expect(new Int32(0).compareTo(-1), 1);
      expect(new Int32(0).compareTo(0), 0);
      expect(new Int32(0).compareTo(1), -1);
      expect(new Int32(0).compareTo(new Int32(-1)), 1);
      expect(new Int32(0).compareTo(new Int32(0)), 0);
      expect(new Int32(0).compareTo(new Int32(1)), -1);
      expect(new Int32(0).compareTo(new Int64(-1)), 1);
      expect(new Int32(0).compareTo(new Int64(0)), 0);
      expect(new Int32(0).compareTo(new Int64(1)), -1);
    });

    test("<", () {
      expect(new Int32(17) < new Int32(18), true);
      expect(new Int32(17) < new Int32(17), false);
      expect(new Int32(17) < new Int32(16), false);
      expect(new Int32(17) < new Int64(18), true);
      expect(new Int32(17) < new Int64(17), false);
      expect(new Int32(17) < new Int64(16), false);
      expect(Int32.MIN_VALUE < Int32.MAX_VALUE, true);
      expect(Int32.MAX_VALUE < Int32.MIN_VALUE, false);
      expect(() => new Int32(17) < null, throws);
    });

    test("<=", () {
      expect(new Int32(17) <= new Int32(18), true);
      expect(new Int32(17) <= new Int32(17), true);
      expect(new Int32(17) <= new Int32(16), false);
      expect(new Int32(17) <= new Int64(18), true);
      expect(new Int32(17) <= new Int64(17), true);
      expect(new Int32(17) <= new Int64(16), false);
      expect(Int32.MIN_VALUE <= Int32.MAX_VALUE, true);
      expect(Int32.MAX_VALUE <= Int32.MIN_VALUE, false);
      expect(() => new Int32(17) <= null, throws);
    });

    test("==", () {
      expect(new Int32(17) == new Int32(18), false);
      expect(new Int32(17) == new Int32(17), true);
      expect(new Int32(17) == new Int32(16), false);
      expect(new Int32(17) == new Int64(18), false);
      expect(new Int32(17) == new Int64(17), true);
      expect(new Int32(17) == new Int64(16), false);
      expect(Int32.MIN_VALUE == Int32.MAX_VALUE, false);
      expect(new Int32(17) == 18, false);
      expect(new Int32(17) == 17, true);
      expect(new Int32(17) == 16, false);
      expect(new Int32(17) == new Object(), false);
      expect(new Int32(17) == null, false);
    });

    test(">=", () {
      expect(new Int32(17) >= new Int32(18), false);
      expect(new Int32(17) >= new Int32(17), true);
      expect(new Int32(17) >= new Int32(16), true);
      expect(new Int32(17) >= new Int64(18), false);
      expect(new Int32(17) >= new Int64(17), true);
      expect(new Int32(17) >= new Int64(16), true);
      expect(Int32.MIN_VALUE >= Int32.MAX_VALUE, false);
      expect(Int32.MAX_VALUE >= Int32.MIN_VALUE, true);
      expect(() => new Int32(17) >= null, throws);
    });

    test(">", () {
      expect(new Int32(17) > new Int32(18), false);
      expect(new Int32(17) > new Int32(17), false);
      expect(new Int32(17) > new Int32(16), true);
      expect(new Int32(17) > new Int64(18), false);
      expect(new Int32(17) > new Int64(17), false);
      expect(new Int32(17) > new Int64(16), true);
      expect(Int32.MIN_VALUE > Int32.MAX_VALUE, false);
      expect(Int32.MAX_VALUE > Int32.MIN_VALUE, true);
      expect(() => new Int32(17) > null, throws);
    });
  });

  group("bitwise operators", () {
    test("&", () {
      expect(new Int32(0x12345678) & new Int32(0x22222222),
          new Int32(0x12345678 & 0x22222222));
      expect(new Int32(0x12345678) & new Int64(0x22222222),
          new Int64(0x12345678 & 0x22222222));
      expect(() => new Int32(17) & null, throwsArgumentError);
    });

    test("|", () {
      expect(new Int32(0x12345678) | new Int32(0x22222222),
          new Int32(0x12345678 | 0x22222222));
      expect(new Int32(0x12345678) | new Int64(0x22222222),
          new Int64(0x12345678 | 0x22222222));
      expect(() => new Int32(17) | null, throws);
    });

    test("^", () {
      expect(new Int32(0x12345678) ^ new Int32(0x22222222),
          new Int32(0x12345678 ^ 0x22222222));
      expect(new Int32(0x12345678) ^ new Int64(0x22222222),
          new Int64(0x12345678 ^ 0x22222222));
      expect(() => new Int32(17) ^ null, throws);
    });

    test("~", () {
      expect(~(new Int32(0x12345678)), new Int32(~0x12345678));
      expect(-(new Int32(0x12345678)), new Int64(-0x12345678));
    });
  });

  group("bitshift operators", () {
    test("<<", () {
      expect(new Int32(0x12345678) << 7, new Int32(0x12345678 << 7));
      expect(() => new Int32(17) << -1, throwsArgumentError);
      expect(() => new Int32(17) << null, throws);
    });

    test(">>", () {
      expect(new Int32(0x12345678) >> 7, new Int32(0x12345678 >> 7));
      expect(() => new Int32(17) >> -1, throwsArgumentError);
      expect(() => new Int32(17) >> null, throws);
    });

    test("shiftRightUnsigned", () {
      expect(new Int32(0x12345678).shiftRightUnsigned(7),
          new Int32(0x12345678 >> 7));
      expect(() => (new Int32(17).shiftRightUnsigned(-1)), throwsArgumentError);
      expect(() => (new Int32(17).shiftRightUnsigned(null)), throws);
    });
  });

  group("conversions", () {
    test("toSigned", () {
      expect(Int32.ONE.toSigned(2), Int32.ONE);
      expect(Int32.ONE.toSigned(1), -Int32.ONE);
      expect(Int32.MAX_VALUE.toSigned(32), Int32.MAX_VALUE);
      expect(Int32.MIN_VALUE.toSigned(32), Int32.MIN_VALUE);
      expect(Int32.MAX_VALUE.toSigned(31), -Int32.ONE);
      expect(Int32.MIN_VALUE.toSigned(31), Int32.ZERO);
      expect(() => Int32.ONE.toSigned(0), throws);
      expect(() => Int32.ONE.toSigned(33), throws);
    });
    test("toUnsigned", () {
      expect(Int32.ONE.toUnsigned(1), Int32.ONE);
      expect(Int32.ONE.toUnsigned(0), Int32.ZERO);
      expect(Int32.MAX_VALUE.toUnsigned(32), Int32.MAX_VALUE);
      expect(Int32.MIN_VALUE.toUnsigned(32), Int32.MIN_VALUE);
      expect(Int32.MAX_VALUE.toUnsigned(31), Int32.MAX_VALUE);
      expect(Int32.MIN_VALUE.toUnsigned(31), Int32.ZERO);
      expect(() => Int32.ONE.toUnsigned(-1), throws);
      expect(() => Int32.ONE.toUnsigned(33), throws);
    });
    test("toDouble", () {
      expect(new Int32(17).toDouble(), same(17.0));
      expect(new Int32(-17).toDouble(), same(-17.0));
    });
    test("toInt", () {
      expect(new Int32(17).toInt(), 17);
      expect(new Int32(-17).toInt(), -17);
    });
    test("toInt32", () {
      expect(new Int32(17).toInt32(), new Int32(17));
      expect(new Int32(-17).toInt32(), new Int32(-17));
    });
    test("toInt64", () {
      expect(new Int32(17).toInt64(), new Int64(17));
      expect(new Int32(-17).toInt64(), new Int64(-17));
    });
    test("toBytes", () {
      expect(new Int32(0).toBytes(), [ 0, 0, 0, 0 ]);
      expect(new Int32(0x01020304).toBytes(), [ 4, 3, 2, 1 ]);
      expect(new Int32(0x04030201).toBytes(), [ 1, 2, 3, 4 ]);
      expect(new Int32(-1).toBytes(), [ 0xff, 0xff, 0xff, 0xff ]);
    });
  });

  group("parse", () {
    test("base 10", () {
      checkInt(int x) {
        expect(Int32.parseRadix('$x', 10), new Int32(x));
      }
      checkInt(0);
      checkInt(1);
      checkInt(1000);
      checkInt(12345678);
      checkInt(2147483647);
      checkInt(2147483648);
      checkInt(4294967295);
      checkInt(4294967296);
      expect(() => Int32.parseRadix('xyzzy', -1), throwsArgumentError);
      expect(() => Int32.parseRadix('plugh', 10),
          throwsA(new isInstanceOf<FormatException>()));
    });

    test("parseRadix", () {
      check(String s, int r, String x) {
        expect(Int32.parseRadix(s, r).toString(), x);
      }
      check('deadbeef', 16, '-559038737');
      check('95', 12, '113');
    });

    test("parseInt", () {
      expect(Int32.parseInt('0'), new Int32(0));
      expect(Int32.parseInt('1000'), new Int32(1000));
      expect(Int32.parseInt('4294967296'), new Int32(4294967296));
    });

    test("parseHex", () {
      expect(Int32.parseHex('deadbeef'), new Int32(0xdeadbeef));
      expect(Int32.parseHex('cafebabe'), new Int32(0xcafebabe));
      expect(Int32.parseHex('8badf00d'), new Int32(0x8badf00d));
    });
  });

  group("string representation", () {
    test("toString", () {
      expect(new Int32(0).toString(), "0");
      expect(new Int32(1).toString(), "1");
      expect(new Int32(-1).toString(), "-1");
      expect(new Int32(1000).toString(), "1000");
      expect(new Int32(-1000).toString(), "-1000");
      expect(new Int32(123456789).toString(), "123456789");
      expect(new Int32(2147483647).toString(), "2147483647");
      expect(new Int32(2147483648).toString(), "-2147483648");
      expect(new Int32(2147483649).toString(), "-2147483647");
      expect(new Int32(2147483650).toString(), "-2147483646");
      expect(new Int32(-2147483648).toString(), "-2147483648");
      expect(new Int32(-2147483649).toString(), "2147483647");
      expect(new Int32(-2147483650).toString(), "2147483646");
    });
  });

  group("toHexString", () {
    test("returns hexadecimal string representation", () {
      expect(new Int32(-1).toHexString(), "-1");
      expect((new Int32(-1) >> 8).toHexString(), "-1");
      expect((new Int32(-1) << 8).toHexString(), "-100");
      expect(new Int32(123456789).toHexString(), "75bcd15");
      expect(new Int32(-1).shiftRightUnsigned(8).toHexString(), "ffffff");
    });
  });

  group("toRadixString", () {
    test("returns base n string representation", () {
      expect(new Int32(123456789).toRadixString(5), "223101104124");
    });
  });
}
