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

import "package:expect/expect.dart";

class OperatorTest {
  static int i1 = -1;
  static int i2 = -1;

  OperatorTest() {}

  static testMain() {
    var op1 = new Operator(1);
    var op2 = new Operator(2);
    Expect.equals(3, op1 + op2);
    Expect.equals(-1, op1 - op2);
    Expect.equals(0.5, op1 / op2);
    Expect.equals(0, op1 ~/ op2);
    Expect.equals(2, op1 * op2);
    Expect.equals(1, op1 % op2);
    Expect.equals(true, !(op1 == op2));
    Expect.equals(true, op1 < op2);
    Expect.equals(true, !(op1 > op2));
    Expect.equals(true, op1 <= op2);
    Expect.equals(true, !(op1 >= op2));
    Expect.equals(3, (op1 | op2));
    Expect.equals(3, (op1 ^ op2));
    Expect.equals(0, (op1 & op2));
    Expect.equals(4, (op1 << op2));
    Expect.equals(0, (op1 >> op2));
    Expect.equals(-1, -op1);

    op1.value += op2.value;
    Expect.equals(3, op1.value);

    op2.value += (op2.value += op2.value);
    Expect.equals(6, op2.value);

    op2.value -= (op2.value -= op2.value);
    Expect.equals(6, op2.value);

    op1.value = op2.value = 42;
    Expect.equals(42, op1.value);
    Expect.equals(42, op2.value);

    i1 = i2 = 42;
    Expect.equals(42, i1);
    Expect.equals(42, i2);
    i1 += 7;
    Expect.equals(49, i1);
    i1 += (i2 = 17);
    Expect.equals(66, i1);
    Expect.equals(17, i2);

    i1 += i2 += 3;
    Expect.equals(86, i1);
    Expect.equals(20, i2);
  }
}

class Operator {
  int value;

  Operator(this.value);

  operator +(Operator other) {
    return value + other.value;
  }

  operator -(Operator other) {
    return value - other.value;
  }

  operator /(Operator other) {
    return value / other.value;
  }

  operator *(Operator other) {
    return value * other.value;
  }

  operator %(Operator other) {
    return value % other.value;
  }

  operator ==(dynamic other) {
    return value == other.value;
  }

  operator <(Operator other) {
    return value < other.value;
  }

  operator >(Operator other) {
    return value > other.value;
  }

  operator <=(Operator other) {
    return value <= other.value;
  }

  operator >=(Operator other) {
    return value >= other.value;
  }

  operator |(Operator other) {
    return value | other.value;
  }

  operator ^(Operator other) {
    return value ^ other.value;
  }

  operator &(Operator other) {
    return value & other.value;
  }

  operator <<(Operator other) {
    return value << other.value;
  }

  operator >>(Operator other) {
    return value >> other.value;
  }

  operator ~/(Operator other) {
    return value ~/ other.value;
  }

  operator -() {
    return -value;
  }
}

main() {
  OperatorTest.testMain();
}
