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

// @dart = 2.9

import "package:expect/expect.dart";

// Test that implicitly bound closures work correctly

class A {
  foo() => 499;
  fooo() => 4999; // Implicit closure class can be shared with foo.
  bar(x, {y: 8, z: 10}) => "1 $x $y $z";
  gee(x, {y: 9, z: 11}) => "2 $x $y $z"; // Must not be shared with "bar".
  toto(x, {y: 8, z: 10}) => "3 $x $y $z"; // Could be shared with "bar".

  fisk(x, {y: 8, zz: 10}) => "4 $x $y $zz";
  titi(x, {y: 8, zz: 77}) => "5 $x $y $zz"; // Could be shared with "fisk",
  // because default-val is never used.
}

class B {
  // All implicit closures of B can be shared with their equivalent functions
  // of A.
  foo() => 4990;
  fooo() => 49990;
  bar(x, {y: 8, z: 10}) => "1B $x $y $z";
  gee(x, {y: 9, z: 11}) => "2B $x $y $z";
  toto(x, {y: 8, z: 10}) => "3B $x $y $z";
  fisk(x, {y: 8, zz: 10}) => "4B $x $y $zz";
  titi(x, {y: 8, zz: 77}) => "5B $x $y $zz";
}

tearOffFoo(o) => o.foo;
tearOffFooo(o) => o.fooo;
tearOffBar(o) => o.bar;
tearOffGee(o) => o.gee;
tearOffToto(o) => o.toto;
tearOffFisk(o) => o.fisk;
tearOffTiti(o) => o.titi;

main() {
  var a = new A();
  var b = new B();
  Expect.equals(499, tearOffFoo(a)());
  Expect.equals(4990, tearOffFoo(b)());
  Expect.equals(4999, tearOffFooo(a)());
  Expect.equals(49990, tearOffFooo(b)());

  var barA = tearOffBar(a);
  var barB = tearOffBar(b);
  var geeA = tearOffGee(a);
  var geeB = tearOffGee(b);
  var totoA = tearOffToto(a);
  var totoB = tearOffToto(b);
  Expect.equals("1 33 8 10", barA(33));
  Expect.equals("1B 33 8 10", barB(33));
  Expect.equals("2 33 9 11", geeA(33));
  Expect.equals("2B 33 9 11", geeB(33));
  Expect.equals("3 33 8 10", totoA(33));
  Expect.equals("3B 33 8 10", totoB(33));

  Expect.equals("1 35 8 10", barA(35));
  Expect.equals("1B 35 8 10", barB(35));
  Expect.equals("2 35 9 11", geeA(35));
  Expect.equals("2B 35 9 11", geeB(35));
  Expect.equals("3 35 8 10", totoA(35));
  Expect.equals("3B 35 8 10", totoB(35));

  Expect.equals("1 35 8 77", barA(35, z: 77));
  Expect.equals("1B 35 8 77", barB(35, z: 77));
  Expect.equals("2 35 9 77", geeA(35, z: 77));
  Expect.equals("2B 35 9 77", geeB(35, z: 77));
  Expect.equals("3 35 8 77", totoA(35, z: 77));
  Expect.equals("3B 35 8 77", totoB(35, z: 77));

  Expect.equals("1 35 8 77", barA(35, z: 77));
  Expect.equals("1B 35 8 77", barB(35, z: 77));
  Expect.equals("2 35 9 77", geeA(35, z: 77));
  Expect.equals("2B 35 9 77", geeB(35, z: 77));
  Expect.equals("3 35 8 77", totoA(35, z: 77));
  Expect.equals("3B 35 8 77", totoB(35, z: 77));

  var fiskA = tearOffFisk(a);
  var fiskB = tearOffFisk(b);
  var titiA = tearOffTiti(a);
  var titiB = tearOffTiti(b);

  Expect.equals("4 311 8 987", fiskA(311, zz: 987));
  Expect.equals("4B 311 8 987", fiskB(311, zz: 987));
  Expect.equals("5 311 8 987", titiA(311, zz: 987));
  Expect.equals("5B 311 8 987", titiB(311, zz: 987));

  Expect.equals("4 311 765 987", fiskA(311, y: 765, zz: 987));
  Expect.equals("4B 311 765 987", fiskB(311, y: 765, zz: 987));
  Expect.equals("5 311 765 987", titiA(311, y: 765, zz: 987));
  Expect.equals("5B 311 765 987", titiB(311, y: 765, zz: 987));
}
