// 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";

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

bool testPassed1([int x]) => ?x;
bool testPassedX({int x}) => ?x;

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

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

confuse() {
  try {
    throw [Function.apply];
  } catch (e) {
    return e[0];
  }
  return null;
}

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, {}));
  }
  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});

  testList(false, testPassed1, null);
  testList(false, testPassed1, []);
  testList(true, testPassed1, [42]);

  testMap(false, testPassedX, null);
  testMap(false, testPassedX, {});
  testMap(true, testPassedX, {"x": 42});

  // 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();
  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.
  testList(42, new Callable(), [13, 29]);
}
