// 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 A {
  A() {
    NamingTest.count++;
  }
  foo(a, b) {
    Expect.equals(1, a);
    Expect.equals(2, b);
  }
}

class MyException {
  MyException() {}
}

class debugger {
  static const int __PROTO__ = 5;

  int x;

  factory debugger.F() {
    return new debugger(1);
  }
  debugger(x) : this.x = x + 1 {}
  debugger.C(x) : this.x = x + 2 {}
  debugger.C$C(x) : this.x = x + 3 {}
  debugger.C$I(x) : this.x = x + 4 {}
}

class debugger$C {
  int x;

  factory debugger$C.F() {
    return new debugger$C(1);
  }
  debugger$C(x) : this.x = x + 5 {}
  debugger$C.C(x) : this.x = x + 6 {}
  debugger$C.C$C(x) : this.x = x + 7 {}
  debugger$C.C$I(x) : this.x = x + 8 {}
}

class debugger$C$C {
  int x;

  factory debugger$C$C.F() {
    return new debugger$C$C(1);
  }
  debugger$C$C(x) : this.x = x + 9 {}
  debugger$C$C.C(x) : this.x = x + 10 {}
  debugger$C$C.C$C(x) : this.x = x + 11 {}
  debugger$C$C.C$I(x) : this.x = x + 12 {}
}

class with$I extends debugger$C {
  int y;

  factory with$I.F() {
    return new with$I(1, 2);
  }
  with$I(x, y)
      : this.y = y + 11,
        super(x) {}
  with$I.I(x, y)
      : this.y = y + 12,
        super.C(x) {}
  with$I.C(x, y)
      : this.y = y + 13,
        super.C$C(x){}
  with$I.I$C(x, y)
      : this.y = y + 14,
        super.C$I(x) {}
  with$I.C$C(x, y)
      : this.y = y + 15,
        super(x) {}
  with$I.C$C$C(x, y)
      : this.y = y + 16,
        super.C(x) {}
  with$I.$C$I(x, y)
      :this.y = y + 17,
        super.C$C(x) {}
  with$I.$$I$C(x, y)
      :this.y = y + 18,
        super.C$I(x) {}
  with$I.$(x, y)
      : this.y = y + 19,
        super(x) {}
  with$I.$$(x, y)
      : this.y = y + 20,
        super.C(x) {}
}

class with$C extends debugger$C$C {
  int y;

  factory with$C.F() {
    return new with$C(1, 2);
  }
  with$C(x, y)
      : this.y = y + 21,
        super(x) {}
  with$C.I(x, y)
      : this.y = y + 22,
        super.C(x) {}
  with$C.C(x, y)
      : this.y = y + 23,
        super.C$C(x) {}
  with$C.I$C(x, y)
      : this.y = y + 24,
        super.C$I(x) {}
  with$C.C$C(x, y)
      : this.y = y + 25,
        super(x) {}
  with$C.C$C$C(x, y)
      : this.y = y + 26,
        super.C(x) {}
  with$C.$C$I(x, y)
      : this.y = y + 27,
        super.C$C(x) {}
  with$C.$$I$C(x, y)
      : this.y = y + 28,
        super.C$I(x) {}
  with$C.$(x, y)
      : this.y = y + 29,
        super(x) {}
  with$C.$$(x, y)
      : this.y = y + 30,
        super.C(x) {}
}

class with$I$C extends debugger$C$C {
  int y;

  factory with$I$C.F() {
    return new with$I$C(1, 2);
  }
  with$I$C(x, y)
      : this.y = y + 31,
        super(x) {}
  with$I$C.I(x, y)
      : this.y = y + 32,
        super.C(x) {}
  with$I$C.C(x, y)
      : this.y = y + 33,
        super.C$C(x) {}
  with$I$C.I$C(x, y)
      : this.y = y + 34,
        super.C$I(x) {}
  with$I$C.C$C(x, y)
      : this.y = y + 35,
        super(x) {}
  with$I$C.C$C$C(x, y)
      : this.y = y + 36,
        super.C(x) {}
  with$I$C.$C$I(x, y)
      : this.y = y + 37,
        super.C$C(x) {}
  with$I$C.$$I$C(x, y)
      : this.y = y + 38,
        super.C$I(x) {}
  with$I$C.$(x, y)
      : this.y = y + 39,
        super(x) {}
  with$I$C.$$(x, y)
      : this.y = y + 40,
        super.C(x) {}
}

class Tata {
  var prototype;

  Tata() : this.prototype = 0 {}

  __PROTO__$() {
    return 12;
  }
}

class Toto extends Tata {
  var __PROTO__;

  Toto()
      : this.__PROTO__ = 0,
        super() {}

  prototype$() {
    return 10;
  }

  titi() {
    Expect.equals(0, prototype);
    Expect.equals(0, __PROTO__);
    prototype = 3;
    __PROTO__ = 5;
    Expect.equals(3, prototype);
    Expect.equals(5, __PROTO__);
    Expect.equals(10, prototype$());
    Expect.equals(12, __PROTO__$());
    Expect.equals(12, this.__PROTO__$());
    Expect.equals(10, this.prototype$());
    Expect.equals(12, __PROTO__$());
  }
}

class Bug4082360 {
  int x_ = -1;
  Bug4082360() {}

  int get x {
    return x_;
  }

  void set x(int value) {
    x_ = value;
  }

  void indirectSet(int value) {
    x = value;
  }

  static void test() {
    var bug = new Bug4082360();
    bug.indirectSet(42);
    Expect.equals(42, bug.x_);
    Expect.equals(42, bug.x);
  }
}

class Hoisting {
  var f_;
  Hoisting.negate(var x) {
    f_ = () {
      return x;
    };
  }

  operator -() {
    var x = 3;
    return () {
      return x + 1;
    };
  }

  operator [](x) {
    return () {
      return x + 3;
    };
  }

  static void test() {
    var h = new Hoisting.negate(1);
    Expect.equals(1, (h.f_)());
    var f = -h;
    Expect.equals(4, f());
    Expect.equals(7, h[4]());
  }
}

// It is not possible to make sure that the backend uses the hardcoded names
// we are testing against. This test might therefore become rapidly out of date
class NamingTest {
  static int count = -1;

  static testExceptionNaming() {
    // Exceptions use a hardcoded "e" as exception name. If the namer works
    // correctly then it will be renamed in case of clashes.
    var e = 3;
    var caught = 0;
    try {
      throw new MyException();
    } catch (exc) {
      try {
        throw new MyException();
      } catch (exc2) {
        caught++;
      }
      Expect.equals(1, caught);
      caught++;
    }
    Expect.equals(2, caught);
    Expect.equals(3, e);
  }

  static testTmpNaming() {
    Expect.equals(0, count);
    var tmp$0 = 1;
    var tmp$1 = 2;
    new A().foo(tmp$0, tmp$1++);
    Expect.equals(1, count);
    Expect.equals(3, tmp$1);
  }

  static testScopeNaming() {
    // Alias scopes use a hardcoded "dartc_scp$<depth>" as names.
    var dartc_scp$1 = 5;
    var foo = 8;
    var f = () {
      var dartc_scp$1 = 15;
      return foo + dartc_scp$1;
    };
    Expect.equals(5, dartc_scp$1);
    Expect.equals(23, f());
  }

  static testGlobalMangling() {
    var x;
    x = new debugger(0);
    Expect.equals(1, x.x);
    x = new debugger.C(0);
    Expect.equals(2, x.x);
    x = new debugger.C$C(0);
    Expect.equals(3, x.x);
    x = new debugger.C$I(0);
    Expect.equals(4, x.x);
    x = new debugger$C(0);
    Expect.equals(5, x.x);
    x = new debugger$C.C(0);
    Expect.equals(6, x.x);
    x = new debugger$C.C$C(0);
    Expect.equals(7, x.x);
    x = new debugger$C.C$I(0);
    Expect.equals(8, x.x);
    x = new debugger$C$C(0);
    Expect.equals(9, x.x);
    x = new debugger$C$C.C(0);
    Expect.equals(10, x.x);
    x = new debugger$C$C.C$C(0);
    Expect.equals(11, x.x);
    x = new debugger$C$C.C$I(0);
    Expect.equals(12, x.x);
    x = new with$I(0, 0);
    Expect.equals(5, x.x);
    Expect.equals(11, x.y);
    x = new with$I.I(0, 0);
    Expect.equals(6, x.x);
    Expect.equals(12, x.y);
    x = new with$I.C(0, 0);
    Expect.equals(7, x.x);
    Expect.equals(13, x.y);
    x = new with$I.I$C(0, 0);
    Expect.equals(8, x.x);
    Expect.equals(14, x.y);
    x = new with$I.C$C(0, 0);
    Expect.equals(5, x.x);
    Expect.equals(15, x.y);
    x = new with$I.C$C$C(0, 0);
    Expect.equals(6, x.x);
    Expect.equals(16, x.y);
    x = new with$I.$C$I(0, 0);
    Expect.equals(7, x.x);
    Expect.equals(17, x.y);
    x = new with$I.$$I$C(0, 0);
    Expect.equals(8, x.x);
    Expect.equals(18, x.y);
    x = new with$I.$(0, 0);
    Expect.equals(5, x.x);
    Expect.equals(19, x.y);
    x = new with$I.$$(0, 0);
    Expect.equals(6, x.x);
    Expect.equals(20, x.y);
    x = new with$C(0, 0);
    Expect.equals(9, x.x);
    Expect.equals(21, x.y);
    x = new with$C.I(0, 0);
    Expect.equals(10, x.x);
    Expect.equals(22, x.y);
    x = new with$C.C(0, 0);
    Expect.equals(11, x.x);
    Expect.equals(23, x.y);
    x = new with$C.I$C(0, 0);
    Expect.equals(12, x.x);
    Expect.equals(24, x.y);
    x = new with$C.C$C(0, 0);
    Expect.equals(9, x.x);
    Expect.equals(25, x.y);
    x = new with$C.C$C$C(0, 0);
    Expect.equals(10, x.x);
    Expect.equals(26, x.y);
    x = new with$C.$C$I(0, 0);
    Expect.equals(11, x.x);
    Expect.equals(27, x.y);
    x = new with$C.$$I$C(0, 0);
    Expect.equals(12, x.x);
    Expect.equals(28, x.y);
    x = new with$C.$(0, 0);
    Expect.equals(9, x.x);
    Expect.equals(29, x.y);
    x = new with$C.$$(0, 0);
    Expect.equals(10, x.x);
    Expect.equals(30, x.y);
    x = new with$I$C(0, 0);
    Expect.equals(9, x.x);
    Expect.equals(31, x.y);
    x = new with$I$C.I(0, 0);
    Expect.equals(10, x.x);
    Expect.equals(32, x.y);
    x = new with$I$C.C(0, 0);
    Expect.equals(11, x.x);
    Expect.equals(33, x.y);
    x = new with$I$C.I$C(0, 0);
    Expect.equals(12, x.x);
    Expect.equals(34, x.y);
    x = new with$I$C.C$C(0, 0);
    Expect.equals(9, x.x);
    Expect.equals(35, x.y);
    x = new with$I$C.C$C$C(0, 0);
    Expect.equals(10, x.x);
    Expect.equals(36, x.y);
    x = new with$I$C.$C$I(0, 0);
    Expect.equals(11, x.x);
    Expect.equals(37, x.y);
    x = new with$I$C.$$I$C(0, 0);
    Expect.equals(12, x.x);
    Expect.equals(38, x.y);
    x = new with$I$C.$(0, 0);
    Expect.equals(9, x.x);
    Expect.equals(39, x.y);
    x = new with$I$C.$$(0, 0);
    Expect.equals(10, x.x);
    Expect.equals(40, x.y);
  }

  static void testMemberMangling() {
    Expect.equals(5, debugger.__PROTO__);
    new Toto().titi();
  }

  static void testFactoryMangling() {
    var o = new debugger.F() as dynamic;
    Expect.equals(2, o.x);
    o = new debugger$C.F();
    Expect.equals(6, o.x);
    o = new debugger$C$C.F();
    Expect.equals(10, o.x);
    o = new with$I.F();
    Expect.equals(6, o.x);
    Expect.equals(13, o.y);
    o = new with$C.F();
    Expect.equals(10, o.x);
    Expect.equals(23, o.y);
    o = new with$I$C.F();
    Expect.equals(10, o.x);
    Expect.equals(33, o.y);
  }

  static testFunctionParameters() {
    a(eval) {
      return eval;
    }

    b(arguments) {
      return arguments;
    }

    Expect.equals(10, a(10));
    Expect.equals(10, b(10));
  }

  static testPseudoTokens() {
    var EOS = 400;
    var ILLEGAL = 99;
    Expect.equals(499, EOS + ILLEGAL);
  }

  static testDollar() {
    Expect.equals(123, $(123).wrapped);
    var x = new Object(), y = new Object();
    Expect.identical(x, $(x).wrapped);
    Expect.identical(y, $(x).$add(y));
    Expect.identical(x, $(x).$negate());
    Expect.equals(123, $(x) + x);
    Expect.equals(444, -$(x));
  }

  static void testMain() {
    count = 0;
    testExceptionNaming();
    testTmpNaming();
    testScopeNaming();
    testGlobalMangling();
    testMemberMangling();
    testFactoryMangling();
    testFunctionParameters();
    Bug4082360.test();
    Hoisting.test();
    testPseudoTokens();
    testDollar();
  }
}

// Test that the generated JS names don't conflict with "$"
class DartQuery {
  Object wrapped;
  DartQuery(this.wrapped);

  $add(Object other) => other;
  $negate() => wrapped;

  operator +(Object other) => 123;
  operator -() => 444;
}

$add(Object first, Object second) => second;
DartQuery $(Object obj) => new DartQuery(obj);

// Ensure we don't have false positive.
class Naming2Test {
  Naming2Test() {}
  int get foo {
    return 1;
  }

  set foo(x) {}

  static void main(args) {
    var a = new Naming2Test() as dynamic;
    Expect.throwsNoSuchMethodError(() => a.foo(2));
  }
}

main() {
  NamingTest.testMain();
  Naming2Test.main(null);
}
