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

import "package:expect/expect.dart";
import "symbol_map_helper.dart";

// Testing Function.apply calls correctly.
// This test is not testing error handling, only that correct parameters
// cause a correct call.

int test0() => 42;
int test0a({int a}) => 37 + a;
int test1(int i) => i + 1;
int test1a(int i, {int a}) => i + a;
int test2(int i, int j) => i + j;
int test2a(int i, int j, {int a}) => i + j + a;

class C {
  int x = 10;
  int foo(y) => this.x + y;
}

class Callable {
  int call(int x, int y) => x + y;
}

@NoInline()
@AssumeDynamic()
confuse(x) => x;

main() {
  testMap(res, func, map) {
    Expect.equals(res, Function.apply(func, null, map));
    Expect.equals(res, Function.apply(func, [], map));
  }

  testList(res, func, list) {
    Expect.equals(res, Function.apply(func, list));
    Expect.equals(res, Function.apply(func, list, null));
    Expect.equals(res, Function.apply(func, list, new Map<Symbol, dynamic>()));
  }

  testListTyped(res, Function func, list) => testList(res, func, list);

  test(res, func, list, map) {
    Expect.equals(res, Function.apply(func, list, map));
  }

  testList(42, test0, null);
  testList(42, test0, []);
  testMap(42, test0a, {#a: 5});
  testList(42, test1, [41]);
  test(42, test1a, [20], {#a: 22});
  testList(42, test2, [20, 22]);
  test(42, test2a, [10, 15], {#a: 17});

  // Test that "this" is correct when calling closurized functions.
  var cfoo = new C().foo;
  testList(42, cfoo, [32]);

  // Test that apply works even with a different name.
  var app = confuse(Function.apply);
  Expect.equals(42, app(test2, [22, 20]));

  // Test that apply can itself be applied.
  Expect.equals(
      42,
      Function.apply(Function.apply, [
        test2,
        [17, 25]
      ]));

  // Test that apply works on callable objects when it is passed to a method
  // that expects Function (and not dynamic).
  Expect.throws(() => testList(42, new Callable(), [13, 29])); //# 01: ok
  testListTyped(42, new Callable(), [13, 29]); //# 02: ok
}
