// Copyright (c) 2011, 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.
// Dart test for testing bitwise operations.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr

import "package:expect/expect.dart";

void main() {
  for (int i = 0; i < 4; i++) {
    test();
  }
}

void test() {
  Expect.equals(3, (3 & 7));
  Expect.equals(7, (3 | 7));
  Expect.equals(4, (3 ^ 7));
  Expect.equals(25, (100 >> 2));
  Expect.equals(400, (100 << 2));
  Expect.equals(-25, (-100 >> 2));
  Expect.equals(-101, ~100);
  Expect.equals(0x10000000000000000, 1 << 64);
  Expect.equals(-0x10000000000000000, -1 << 64);
  Expect.equals(0x40000000, 0x04000000 << 4);
  Expect.equals(0x4000000000000000, 0x0400000000000000 << 4);
  Expect.equals(0, ~ -1);
  Expect.equals(-1, ~0);

  Expect.equals(0, 1 >> 160);
  Expect.equals(-1, -1 >> 160);

  Expect.equals(
      0x100000000000000001, 0x100000000000000001 & 0x100000100F00000001);
  Expect.equals(0x1, 0x1 & 0x100000100F00000001);
  Expect.equals(0x1, 0x100000100F00000001 & 0x1);

  Expect.equals(
      0x100000100F00000001, 0x100000000000000001 | 0x100000100F00000001);
  Expect.equals(0x100000100F00000011, 0x11 | 0x100000100F00000001);
  Expect.equals(0x100000100F00000011, 0x100000100F00000001 | 0x11);

  Expect.equals(
      0x0F000F00000000000000, 0x0F00F00000000000001 ^ 0xFF00000000000000001);
  Expect.equals(0x31, 0xF00F00000000000001 ^ 0xF00F00000000000030);
  Expect.equals(0xF00F00000000000031, 0xF00F00000000000001 ^ 0x30);
  Expect.equals(0xF00F00000000000031, 0x30 ^ 0xF00F00000000000001);

  Expect.equals(0xF0000000000000000F, 0xF0000000000000000F7 >> 4);
  Expect.equals(15, 0xF00000000 >> 32);
  Expect.equals(1030792151040, 16492674416655 >> 4);

  Expect.equals(0xF0000000000000000F0, 0xF0000000000000000F << 4);
  Expect.equals(0xF00000000, 15 << 32);

  testNegativeValueShifts();
  testPositiveValueShifts();
  testNoMaskingOfShiftCount();
  testNegativeCountShifts();
  for (int i = 0; i < 20; i++) {
    testCornerCasesRightShifts();
    testRightShift64Bit();
    testLeftShift64Bit();
    testLeftShift64BitWithOverflow1();
    testLeftShift64BitWithOverflow2();
    testLeftShift64BitWithOverflow3();
  }

  // Test precedence.
  testPrecedence(4, 5, 3, 1);
  testPrecedence(3, 4, 5, 9);
  testPrecedence(0x5c71, 0x6b92, 0x7654, 0x7d28);
}

void testCornerCasesRightShifts() {
  var v32 = 0xFF000000;
  var v64 = 0xFF00000000000000;
  Expect.equals(0x3, v32 >> 0x1E);
  Expect.equals(0x1, v32 >> 0x1F);
  Expect.equals(0x0, v32 >> 0x20);
  Expect.equals(0x3, v64 >> 0x3E);
  Expect.equals(0x1, v64 >> 0x3F);
  Expect.equals(0x0, v64 >> 0x40);
}

void testRightShift64Bit() {
  var t = 0x1ffffffff;
  Expect.equals(0xffffffff, t >> 1);
}

void testLeftShift64Bit() {
  var t = 0xffffffff;
  Expect.equals(0xffffffff, t << 0);
  Expect.equals(0x1fffffffe, t << 1);
  Expect.equals(0x7fffffff80000000, t << 31);
  Expect.equals(0x10000000000000000, 2*(t+1) << 31); //# 01: static type warning
  Expect.equals(0x20000000000000000, 4*(t+1) << 31); //# 02: static type warning
  Expect.equals(0x8000000000000000, (t + 1) << 31);
}

void testLeftShift64BitWithOverflow1() {
  var t = 0xffffffff;
  Expect.equals(0x10000000000000000, 2*(t+1) << 31); //# 03: static type warning
}

void testLeftShift64BitWithOverflow2() {
  var t = 0xffffffff;
  Expect.equals(0x20000000000000000, 4*(t+1) << 31); //# 04: static type warning
}

void testLeftShift64BitWithOverflow3() {
  var t = 0xffffffff;
  Expect.equals(0x8000000000000000, (t + 1) << 31);
}

void testNegativeCountShifts() {
  bool throwOnLeft(a, b) {
    try {
      var x = a << b;
      return false;
    } catch (e) {
      return true;
    }
  }

  bool throwOnRight(a, b) {
    try {
      var x = a >> b;
      return false;
    } catch (e) {
      return true;
    }
  }

  Expect.isTrue(throwOnLeft(12, -3));
  Expect.isTrue(throwOnRight(12, -3));
  for (int i = 0; i < 20; i++) {
    Expect.isFalse(throwOnLeft(12, 3));
    Expect.isFalse(throwOnRight(12, 3));
  }
}

void testNegativeValueShifts() {
  for (int value = 0; value > -100; value--) {
    for (int i = 0; i < 300; i++) {
      int b = (value << i) >> i;
      Expect.equals(value, b);
    }
  }
}

void testPositiveValueShifts() {
  for (int value = 0; value < 100; value++) {
    for (int i = 0; i < 300; i++) {
      int b = (value << i) >> i;
      Expect.equals(value, b);
    }
  }
}

void testNoMaskingOfShiftCount() {
  // Shifts which would behave differently if shift count was masked into a
  // range.
  Expect.equals(0, 0 >> 256);
  Expect.equals(0, 1 >> 256);
  Expect.equals(0, 2 >> 256);
  Expect.equals(0, shiftRight(0, 256));
  Expect.equals(0, shiftRight(1, 256));
  Expect.equals(0, shiftRight(2, 256));

  for (int shift = 1; shift <= 256; shift++) {
    Expect.equals(0, shiftRight(1, shift));
    Expect.equals(-1, shiftRight(-1, shift));
    Expect.equals(true, shiftLeft(1, shift) > shiftLeft(1, shift - 1));
  }
}

int shiftLeft(int a, int b) {
  return a << b;
}

int shiftRight(int a, int b) {
  return a >> b;
}

void testPrecedence(int a, int b, int c, int d) {
  // & binds stronger than ^, which binds stronger than |.
  int result = a & b ^ c | d & b ^ c;
  Expect.equals(((a & b) ^ c) | ((d & b) ^ c), result); //     &^|
  Expect.notEquals((a & (b ^ c)) | (d & (b ^ c)), result); //  ^&|
  Expect.notEquals((a & b) ^ (c | (d & b)) ^ c, result); //    &|^
  Expect.notEquals((a & b) ^ ((c | d) & b) ^ c, result); //    |&^
  Expect.notEquals(a & (b ^ (c | d)) & (b ^ c), result); //    |^&
  Expect.notEquals(a & ((b ^ c) | d) & (b ^ c), result); //    ^|&
  // Binds stronger than relational operators.
  Expect.equals((a & b) < (c & d), a & b < c & d);
  // Binds weaker than shift operators.
  Expect.equals((a & (b << c)) ^ d, a & b << c ^ d);
  Expect.notEquals((a & b) << (c ^ d), a & b << c ^ d);
}
