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

// Tests basic expressions. Does not attempt to validate the details of arithmetic, coercion, and
// so forth.
class ExpressionTest {

  ExpressionTest() {}

  int foo;

  static testMain() {
    var test = new ExpressionTest();
    test.testBinary();
    test.testUnary();
    test.testShifts();
    test.testBitwise();
    test.testIncrement();
    test.testMangling();
  }

  testBinary() {
    int x = 4, y = 2;
    Expect.equals(6, x + y);
    Expect.equals(2, x - y);
    Expect.equals(8, x * y);
    Expect.equals(2, x / y);
    Expect.equals(0, x % y);
  }

  testUnary() {
    int x = 4, y = 2;
    bool t = true, f = false;
    Expect.equals(-4, -x);
    Expect.equals(-5, ~x);
    Expect.equals(f, !t);
  }

  testShifts() {
    int x = 4, y = 2;
    Expect.equals(y, x >> 1);
    Expect.equals(x, y << 1);
  }

  testBitwise() {
    int x = 4, y = 2;
    Expect.equals(6, (x | y));
    Expect.equals(0, (x & y));
    Expect.equals(6, (x ^ y));
  }

  operator [](int index) {
    return foo;
  }

  operator []=(int index, int value) {
    foo = value;
  }

  testIncrement() {
    int x = 4, a = x++;
    Expect.equals(4, a);
    Expect.equals(5, x);
    Expect.equals(6, ++x);
    Expect.equals(6, x++);
    Expect.equals(7, x);
    Expect.equals(6, --x);
    Expect.equals(6, x--);
    Expect.equals(5, x);

    this.foo = 0;
    Expect.equals(0, this.foo++);
    Expect.equals(1, this.foo);
    Expect.equals(2, ++this.foo);
    Expect.equals(2, this.foo);
    Expect.equals(2, this.foo--);
    Expect.equals(1, this.foo);
    Expect.equals(0, --this.foo);
    Expect.equals(0, this.foo);

    Expect.equals(0, this[0]++);
    Expect.equals(1, this[0]);
    Expect.equals(2, ++this[0]);
    Expect.equals(2, this[0]);
    Expect.equals(2, this[0]--);
    Expect.equals(1, this[0]);
    Expect.equals(0, --this[0]);
    Expect.equals(0, this[0]);

    int $0 = 42, $1 = 87, $2 = 117;
    Expect.equals(42, $0++);
    Expect.equals(43, $0);
    Expect.equals(44, ++$0);
    Expect.equals(88, $0 += $0);
    Expect.equals(87, $1++);
    Expect.equals(88, $1);
    Expect.equals(89, ++$1);
    Expect.equals(178, ($1 += $1));
    Expect.equals(117, $2++);
    Expect.equals(118, $2);
    Expect.equals(119, ++$2);
  }

  void testMangling() {
    int $0 = 42, $1 = 87, $2 = 117;
    this[0] = 0;
    Expect.equals(42, (this[0] += $0));
    Expect.equals(129, (this[0] += $1));
    Expect.equals(246, (this[0] += $2));
  }
}

main() {
  ExpressionTest.testMain();
}
