// Copyright (c) 2013, 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.

// Test of Symbol class for operators..

dynamic $ = new Symbolize();

main() {
  testSymbol(#+, $ + $, "+");
  testSymbol(#-, $ - $, "-");
  testSymbol(#*, $ * $, "*");
  testSymbol(#/, $ / $, "/");
  testSymbol(#~/, $ ~/ $, "~/");
  testSymbol(#%, $ % $, "%");
  testSymbol(#<<, $ << $, "<<");
  testSymbol(#>>, $ >> $, ">>");
  testSymbol(#~, ~$, "~");
  testSymbol(#|, $ | $, "|");
  testSymbol(#&, $ & $, "&");
  testSymbol(#^, $ ^ $, "^");
  testSymbol(#<, $ < $, "<");
  testSymbol(#<=, $ <= $, "<=");
  testSymbol(#>, $ > $, ">");
  testSymbol(#>=, $ >= $, ">=");
  testSymbol(#==, new Symbol("=="), "=="); // Can't hit noSuchMethod.
  testSymbol(#[], $[$], "[]");
  testSymbol(#[]=, ($[$] = $).lastMember, "[]=");
  testSymbol(Symbol.unaryMinus, -$, "unary-");

  testSymbolThrows(">>>"); // //# 03: ok
  testSymbolThrows("!"); //   //# 03: continued
  testSymbolThrows("&&"); //  //# 03: continued
  testSymbolThrows("||"); //  //# 03: continued
  testSymbolThrows("?"); //   //# 03: continued
  testSymbolThrows("?:"); //  //# 03: continued
  testSymbolThrows("#"); //   //# 03: continued
  testSymbolThrows("//"); //  //# 03: continued
}

void testSymbol(Symbol constSymbol, var mirrorSymbol, String name) {
  Symbol dynamicSymbol = new Symbol(name);
  if (constSymbol != mirrorSymbol) {
    throw "Not equal #$name, \$$name: $constSymbol, $mirrorSymbol";
  }
  if (constSymbol != dynamicSymbol) {
    throw "Not equal #$name, new Symbol('$name'): $constSymbol, $dynamicSymbol";
  }
  if (mirrorSymbol != dynamicSymbol) {
    throw "Not equal \$$name, new Symbol('$name'): "
        "$mirrorSymbol, $dynamicSymbol";
  }
  if (constSymbol.hashCode != mirrorSymbol.hashCode) {
    throw "HashCode not equal #$name, \$$name: $constSymbol, $mirrorSymbol";
  }
  if (constSymbol.hashCode != dynamicSymbol.hashCode) {
    throw "HashCode not equal #$name, new Symbol('$name'): "
        "$constSymbol, $dynamicSymbol";
  }
  if (mirrorSymbol.hashCode != dynamicSymbol.hashCode) {
    throw "HashCode not equal \$$name, new Symbol('$name'): "
        "$mirrorSymbol, $dynamicSymbol";
  }
}

void testSymbolThrows(name) {
  bool fails = false;
  try {
    new Symbol(name);
  } catch (e) {
    fails = true;
  }
  if (!fails) {
    throw "Didn't throw: $name";
  }
}

class Symbolize {
  Symbol lastMember;
  noSuchMethod(m) => lastMember = m.memberName;
}
