// 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 "package:expect/variations.dart" as v;

// 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({required int a}) => 37 + a;
int test1(int i) => i + 1;
int test1a(int i, {required int a}) => i + a;
int test2(int i, int j) => i + j;
int test2a(int i, int j, {required int a}) => i + j + a;

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

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

@pragma('dart2js:noInline')
@pragma('dart2js: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.throwsWhen(
      v.checkedImplicitDowncasts, () => testList(42, new Callable(), [13, 29]));

  testListTyped(42, new Callable(), [13, 29]);
}
