// 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]);
}
