// Copyright (c) 2014, 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 {
  bar([var optional = 1]) => 498 + optional;
  bar2({namedOptional: 2}) => 40 + namedOptional;
  bar3(x, [var optional = 3]) => x + 498 + optional;
  bar4(x, {namedOptional: 4}) => 422 + x + namedOptional;

  // Gee is the same as bar, but we make sure that gee is used. Potentially
  // this yields different code if the redirecting stub exists.
  gee([var optional = 1]) => 498 + optional;
  gee2({namedOptional: 2}) => 40 + namedOptional;
  gee3(x, [var optional = 3]) => x + 498 + optional;
  gee4(x, {namedOptional: 4}) => 422 + x + namedOptional;

  // Use identifiers that could be intercepted.
  add([var optional = 33]) => 1234 + optional;
  trim({namedOptional: 22}) => 1313 + namedOptional;
  sublist(x, [optional = 44]) => 4321 + optional + x;
  splitMapJoin(x, {onMatch: 55, onNonMatch: 66}) =>
      111 + x + onMatch + onNonMatch;

  // Other interceptable identifiers, but all of them are used.
  shuffle([var optional = 121]) => 12342 + optional;
  toList({growable: 2233}) => 13131 + growable;
  lastIndexOf(x, [optional = 424]) => 14321 + optional + x;
  lastWhere(x, {orElse: 555}) => x + 1213 + 555;
}

class B extends A {
  // The closure `super.bar` is invoked without the optional argument.
  // Dart2js must not generate a `bar$0 => bar$1(null)` closure, since that
  // would redirect to B's `bar$1`. Instead it must enforce that `bar$0` in
  // `A` redirects to A's bar$1.
  foo() => confuse(super.bar)();
  foo2() => confuse(super.bar)(2);
  foo3() => confuse(super.bar2)();
  foo4() => confuse(super.bar2)(namedOptional: 77);
  foo5() => confuse(super.bar3)(-3);
  foo6() => confuse(super.bar3)(-11, -19);
  foo7() => confuse(super.bar4)(0);
  foo8() => confuse(super.bar4)(3, namedOptional: 77);

  fooGee() => confuse(super.gee)();
  fooGee2() => confuse(super.gee)(2);
  fooGee3() => confuse(super.gee2)();
  fooGee4() => confuse(super.gee2)(namedOptional: 77);
  fooGee5() => confuse(super.gee3)(-3);
  fooGee6() => confuse(super.gee3)(-11, -19);
  fooGee7() => confuse(super.gee4)(0);
  fooGee8() => confuse(super.gee4)(3, namedOptional: 77);

  fooIntercept() => confuse(super.add)();
  fooIntercept2() => confuse(super.add)(2);
  fooIntercept3() => confuse(super.trim)();
  fooIntercept4() => confuse(super.trim)(namedOptional: 77);
  fooIntercept5() => confuse(super.sublist)(-3);
  fooIntercept6() => confuse(super.sublist)(-11, -19);
  fooIntercept7() => confuse(super.splitMapJoin)(0);
  fooIntercept8() => confuse(super.splitMapJoin)(3, onMatch: 77, onNonMatch: 8);

  fooIntercept21() => confuse(super.shuffle)();
  fooIntercept22() => confuse(super.shuffle)(2);
  fooIntercept23() => confuse(super.toList)();
  fooIntercept24() => confuse(super.toList)(growable: 77);
  fooIntercept25() => confuse(super.lastIndexOf)(-3);
  fooIntercept26() => confuse(super.lastIndexOf)(-11, -19);
  fooIntercept27() => confuse(super.lastWhere)(0);
  fooIntercept28() => confuse(super.lastWhere)(3, orElse: 77);

  bar([var optional]) => -1; //       //# 01: compile-time error
  bar2({namedOptional}) => -1; //   //# 01: continued
  bar3(x, [var optional]) => -1; //   //# 01: continued
  bar4(x, {namedOptional}) => -1; //# 01: continued

  gee([var optional]) => -1; //       //# 01: continued
  gee2({namedOptional}) => -1; //   //# 01: continued
  gee3(x, [var optional]) => -1; //   //# 01: continued
  gee4(x, {namedOptional}) => -1; //# 01: continued

  add([var optional = 33]) => -1;
  trim({namedOptional: 22}) => -1;
  sublist(x, [optional = 44]) => -1;
  splitMapJoin(x, {onMatch: 55, onNonMatch: 66}) => -1;

  shuffle([var optional = 121]) => -1;
  toList({growable: 2233}) => -1;
  lastIndexOf(x, [optional = 424]) => -1;
  lastWhere(x, {orElse: 555}) => -1;
}

confuse(x) {
  if (new DateTime.now().millisecondsSinceEpoch == 42) return confuse(x - 1);
  return x;
}

main() {
  var list = [new A(), new B(), [], "foo"];
  var a = list[confuse(0)];
  var b = list[confuse(1)];
  var ignored = list[confuse(2)];
  var ignored2 = list[confuse(3)];

  var t = b.gee() + b.gee2() + b.gee3(9) + b.gee4(19);
  Expect.equals(-4, t); //# 01: continued
  t = b.shuffle() + b.toList() + b.lastIndexOf(1) + b.lastWhere(2);
  Expect.equals(-4, t);

  Expect.equals(499, b.foo()); // //# 01: continued
  Expect.equals(500, b.foo2()); //# 01: continued
  Expect.equals(42, b.foo3()); // //# 01: continued
  Expect.equals(117, b.foo4()); //# 01: continued
  Expect.equals(498, b.foo5()); //# 01: continued
  Expect.equals(468, b.foo6()); //# 01: continued
  Expect.equals(426, b.foo7()); //# 01: continued
  Expect.equals(502, b.foo8()); //# 01: continued

  Expect.equals(499, b.fooGee()); // //# 01: continued
  Expect.equals(500, b.fooGee2()); //# 01: continued
  Expect.equals(42, b.fooGee3()); // //# 01: continued
  Expect.equals(117, b.fooGee4()); //# 01: continued
  Expect.equals(498, b.fooGee5()); //# 01: continued
  Expect.equals(468, b.fooGee6()); //# 01: continued
  Expect.equals(426, b.fooGee7()); //# 01: continued
  Expect.equals(502, b.fooGee8()); //# 01: continued

  Expect.equals(1267, b.fooIntercept());
  Expect.equals(1236, b.fooIntercept2());
  Expect.equals(1335, b.fooIntercept3());
  Expect.equals(1390, b.fooIntercept4());
  Expect.equals(4362, b.fooIntercept5());
  Expect.equals(4291, b.fooIntercept6());
  Expect.equals(232, b.fooIntercept7());
  Expect.equals(199, b.fooIntercept8());

  Expect.equals(12463, b.fooIntercept21());
  Expect.equals(12344, b.fooIntercept22());
  Expect.equals(15364, b.fooIntercept23());
  Expect.equals(13208, b.fooIntercept24());
  Expect.equals(14742, b.fooIntercept25());
  Expect.equals(14291, b.fooIntercept26());
  Expect.equals(1768, b.fooIntercept27());
  Expect.equals(1771, b.fooIntercept28());
}
