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

/// @assertion The following names are allowed for user-defined operators:
/// <, >, <=, >=, ==, -, +, /, ˜/, *, %, |, ˆ, &, <<, >>, >>>, []=, [], ˜.
/// @description Checks that the listed operators may indeed be defined in a 
/// user class.
/// @author vasya


import "../../../../Utils/expect.dart";

class C {
  int value = 0;

  C(int i) {
    value = i;
  }

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

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

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

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

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

  operator ==(Object other) {
    if (other is C) {
      return value == other.value;
    }
    return false;
  }

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

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

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

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

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

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

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

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

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

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

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

  operator [](int index) {
    return value + index;
  }

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

  operator ~() {
    return ~value;
  }

  operator -() {
    return -value;
  }
}

main() {
  C c1 = new C(7);
  C c2 = new C(2);

  Expect.equals(9, c1 + c2);
  Expect.equals(5, c1 - c2);
  Expect.equals(3.5, c1 / c2);
  Expect.equals(3, c1 ~/ c2);
  Expect.equals(14, c1 * c2);
  Expect.equals(1, c1 % c2);
  Expect.isFalse(c1 == c2);
  Expect.isFalse(c1 < c2);
  Expect.isTrue(c1 > c2);
  Expect.isFalse(c1 <= c2);
  Expect.isTrue(c1 >= c2);
  Expect.equals(7, (c1 | c2));
  Expect.equals(5, (c1 ^ c2));
  Expect.equals(2, (c1 & c2));
  Expect.equals(28, (c1 << c2));
  Expect.equals(1, (c1 >> c2));
  Expect.equals(1, (c1 >>> c2));
  Expect.equals(~7, ~c1);
  Expect.equals(-2, -c2);
  Expect.equals(true, c1 == c1);
  Expect.equals(false, c1 == c2);

  c1[0] = 777;
  Expect.equals(777, c1[0]);

  c2[-100] = 99;
  Expect.equals(-1, c2[-100]);
}
