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