// 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.

// A test to compare the results of the fixnum library with the Dart VM

library int64vmtest;
import 'dart:math' as math;

part '../lib/src/int32.dart';
part '../lib/src/int64.dart';
part '../lib/src/intx.dart';

final random = new math.Random();

void main() {
  int64VMTest test = new int64VMTest();
  test.doTestBinary(new BinaryOp("&", (a, b) => a & b));
  test.doTestBinary(new BinaryOp("|", (a, b) => a | b));
  test.doTestBinary(new BinaryOp("^", (a, b) => a ^ b));
  test.doTestBinary(new BinaryOp("+", (a, b) => a + b));
  test.doTestBinary(new BinaryOp("-", (a, b) => a - b));
  test.doTestBinary(new BinaryOp("*", (a, b) => a * b));
  test.doTestUnary(new UnaryOp("-", (a) => -a));
  test.doTestUnary(new UnaryOp("~", (a) => ~a));
  test.doTestShift(new ShiftOp("<<", (a, n) => a << (n & 63)));
  test.doTestShift(new ShiftOp(">>", (a, n) => a >> (n & 63)));
  test.doTestBoolean(new BooleanOp("compareTo", (a, b) => a.compareTo(b)));
  test.doTestBoolean(new BooleanOp("==", (a, b) => a == b));
  test.doTestBoolean(new BooleanOp("!=", (a, b) => a != b));
  test.doTestBoolean(new BooleanOp("<", (a, b) => a < b));
  test.doTestBoolean(new BooleanOp("<=", (a, b) => a <= b));
  test.doTestBoolean(new BooleanOp(">", (a, b) => a > b));
  test.doTestBoolean(new BooleanOp(">=", (a, b) => a >= b));
  test.doTestBinary(new BinaryOp("%", (a, b) => a % b));
  test.doTestBinary(new BinaryOp("~/", (a, b) => a ~/ b));
  test.doTestBinary(new BinaryOp("remainder", (a, b) => a.remainder(b)));
}

const int DISCARD = 0;

int64 _randomInt64() {
  int i = 0;
  for (int b = 0; b < 64; b++) {
      double rand = random.nextDouble();
      for (int j = 0; j < DISCARD; j++) {
        rand = random.nextDouble();
      }
      i = (i << 1) | ((rand > 0.5) ? 1 : 0);
  }
  return new int64.fromInt(i);
}

int _randomInt(int n) {
  double rand = random.nextDouble();
  for (int i = 0; i < DISCARD; i++) {
    rand = random.nextDouble();
  }
  return (rand * n).floor();
}

class Op {
  String name;
  Function op;

  Op(String this.name, Function this.op);

  // Truncate x to a value in the range [-2^63, 2^63 - 1]
  int trunc64(int x) {
    int trunc = x & 0xffffffffffffffff;
    if ((trunc & 0x8000000000000000) != 0) {
      trunc -= 18446744073709551616; // 2^64
    }
    return trunc;
  }
}

class UnaryOp extends Op {
  UnaryOp(String name, Function op) : super(name, op);
  int ref(int val) => trunc64(op(val));
  int64 test(int64 val) => op(val);
}

class BinaryOp extends Op {
  BinaryOp(String name, Function op) : super(name, op);
  int ref(int val0, int val1) => trunc64(op(val0, val1));
  int64 test(int64 val0, int64 val1) => op(val0, val1);
}

class BooleanOp extends Op {
  BooleanOp(String name, Function op) : super(name, op);
  bool ref(int val0, int val1) => op(val0, val1);
  bool test(int64 val0, int64 val1) => op(val0, val1);
}

class ShiftOp extends Op {
  ShiftOp(String name, Function op) : super(name, op);
  int ref(int val0, int shift) => trunc64(op(val0, shift));
  int64 test(int64 val0, int shift) => op(val0, shift);
}

class int64VMTest {
  static const int BASE_VALUES = 32;
  static const int RANDOM_TESTS = 32;
  List<int64> TEST_VALUES;

  int64VMTest() {
    Set<int64> testSet = new Set<int64>();
    for (int i = 0; i < BASE_VALUES; i++) {
      testSet.add(new int64.fromInt(i));
      testSet.add(new int64.fromInt(-i));

      testSet.add(int64.MIN_VALUE + i);
      testSet.add(int64.MAX_VALUE - i);

      testSet.add(new int64.fromInt(i << int64._BITS ~/ 2));
      testSet.add(new int64.fromInt(i << int64._BITS));
      testSet.add(new int64.fromInt(i << (3 * int64._BITS) ~/ 2));
      testSet.add(new int64.fromInt(i << 2 * int64._BITS));
      testSet.add(new int64.fromInt(i << (5 * int64._BITS) ~/ 2));
    }

    int64 one = new int64.fromInt(1);
    int64 three = new int64.fromInt(3);
    int64 ones = int64.parseHex("1111111111111111");
    int64 tens = int64.parseHex("1010101010101010");
    int64 oh_ones = int64.parseHex("0101010101010101");
    int64 digits = int64.parseHex("123456789ABCDEFF");
    for (int i = 0; i < 16; i++) {
      testSet.add(ones * i);
      testSet.add(~(ones * i));
      testSet.add(-(ones * i));
      testSet.add(tens * i);
      testSet.add(~(tens * i));
      testSet.add(-(tens * i));
      testSet.add(oh_ones * i);
      testSet.add(~(oh_ones * i));
      testSet.add(-(oh_ones * i));
      testSet.add(digits * i);
      testSet.add(~(digits * i));
      testSet.add(-(digits * i));
    }

    for (int i = 0; i < 64; i += 4) {
      testSet.add(one << i);
      testSet.add(~(one << i));
      testSet.add(digits >> i);
      testSet.add(-(digits >> i));

      // Powers of two and nearby numbers
      testSet.add(one << i);
      for (int j = 1; j <= 16; j++) {
        testSet.add((one << i) + j);
        testSet.add(-((one << i) + j));
        testSet.add(~((one << i) + j));
        testSet.add((one << i) - j);
        testSet.add(-((one << i) - j));
        testSet.add(~((one << i) - j));
        testSet.add((three << i) + j);
        testSet.add(-((three << i) + j));
        testSet.add(~((three << i) + j));
        testSet.add((three << i) - j);
        testSet.add(-((three << i) - j));
        testSet.add(~((three << i) - j));
      }
    }

    for (int a = 0; a < 19; a++) {
      // Math.pow(10, a)
      int pow = 1;
      for (int j = 0; j < a; j++) {
        pow *= 10;
      }
      testSet.add(new int64.fromInt(pow));
    }

    TEST_VALUES = new List<int64>(testSet.length);
    int index = 0;
    for (int64 val in testSet) {
      TEST_VALUES[index++] = val;
    }

    print("VALUES.length = $index");
  }

  void _doTestUnary(UnaryOp op, int64 val) {
    int ref = op.ref(val.toInt());
    int64 result64 = op.test(val);
    int result = result64.toInt();
    if (ref != result) {
      Expect.fail("${op.name}: val = $val");
    }
  }

  void doTestUnary(UnaryOp op) {
    print("Testing operator ${op.name}");
    for (int i = 0; i < TEST_VALUES.length; i++) {
      _doTestUnary(op, TEST_VALUES[i]);
    }
    for (int i = 0; i < RANDOM_TESTS; i++) {
      int64 randomLong = _randomInt64();
      _doTestUnary(op, randomLong);
    }
  }

  void _doTestBinary(BinaryOp op, int64 val0, int64 val1) {
    // print("Test val0 = $val0, val1 = $val1");
    var refException = null;
    int ref = -1;
    try {
      ref = op.ref(val0.toInt(), val1.toInt());
    } on Exception catch (e) {
      refException = e;
    }
    var testException = null;
    int result = -2;
    int64 result64;
    try {
      int64 val0_save = new int64._copy(val0);
      int64 val1_save = new int64._copy(val1);
      result64 = op.test(val0, val1);
      result = result64.toInt();
      if (val0 != val0_save) {
        print(
            "Test altered first argument val0 = $val0, val0_save = $val0_save");
      }
      if (val1 != val1_save) {
        print("Test altered second argument");
      }
    } on Exception catch (e) {
      testException = e;
    }
    if (testException is IntegerDivisionByZeroException &&
        refException is IntegerDivisionByZeroException) {
    } else if (testException != null || refException != null) {
      Expect.fail("${op.name}: val0 = $val0, val1 = $val1, "
          "testException = $testException, refException = $refException");
      return;
    } else if (ref != result) {
      if ("%" == op.name && ref < 0) {
        // print("Dart VM bug: ${op.name}: val0 = $val0, val1 = $val1, "
        //    "ref = $ref, result64 = $result64, result = $result");
      } else {
        Expect.fail("${op.name}: val0 = $val0, val1 = $val1, "
            "ref = $ref, result64 = $result64, result = $result");
      }
    }
  }

  void doTestBinary(BinaryOp op) {
    print("Testing operator ${op.name}");
    for (int i = 0; i < TEST_VALUES.length; i++) {
      int64 randomLong = _randomInt64();
      _doTestBinary(op, TEST_VALUES[i], randomLong);
      _doTestBinary(op, randomLong, TEST_VALUES[i]);
      for (int j = 0; j < TEST_VALUES.length; j++) {
        _doTestBinary(op, TEST_VALUES[i], TEST_VALUES[j]);
      }
    }
    for (int i = 0; i < RANDOM_TESTS; i++) {
      int64 longVal0 = _randomInt64();
      int64 longVal1 = _randomInt64();
      if (_randomInt(20) == 0) {
        if (_randomInt(2) == 0) {
          longVal1 = longVal0;
        } else {
          longVal1 = -longVal0;
        }
      }
      _doTestBinary(op, longVal0, longVal1);
    }
  }

  void _doTestBoolean(BooleanOp op, int64 val0, int64 val1) {
    bool ref = op.ref(val0.toInt(), val1.toInt());
    bool result = op.test(val0, val1);
    if (ref != result) {
      Expect.fail("${op.name}: val0 = $val0, val1 = $val1");
    }
  }

  void doTestBoolean(BooleanOp op) {
    print("Testing operator ${op.name}");
    for (int i = 0; i < TEST_VALUES.length; i++) {
      int64 randomLong = _randomInt64();
      _doTestBoolean(op, TEST_VALUES[i], randomLong);
      _doTestBoolean(op, randomLong, TEST_VALUES[i]);
      for (int j = 0; j < TEST_VALUES.length; j++) {
        _doTestBoolean(op, TEST_VALUES[i], TEST_VALUES[j]);
      }
    }
    for (int i = 0; i < RANDOM_TESTS; i++) {
      int64 longVal0 = _randomInt64();
      int64 longVal1 = _randomInt64();
      if (_randomInt(20) == 0) {
        if (_randomInt(2) == 0) {
          longVal1 = longVal0;
        } else {
          longVal1 = -longVal0;
        }
      }
      _doTestBoolean(op, longVal0, longVal1);
    }
  }

  void _doTestShift(ShiftOp op, int64 val, int shift) {
    int ref = op.ref(val.toInt(), shift);
    int64 result64 = op.test(val, shift);
    int result = result64.toInt();
    if (ref != result) {
      Expect.fail("${op.name}: val = $val, shift = $shift");
    }
  }

  void doTestShift(ShiftOp op) {
    print("Testing operator ${op.name}");
    for (int i = 0; i < TEST_VALUES.length; i++) {
      for (int shift = -64; shift <= 64; shift++) {
        _doTestShift(op, TEST_VALUES[i], shift);
      }
    }
    for (int i = 0; i < RANDOM_TESTS; i++) {
      int64 randomLong = _randomInt64();
      for (int shift = -64; shift <= 64; shift++) {
        _doTestShift(op, randomLong, shift);
      }
    }
  }
}
