| // Copyright (c) 2013, 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. | 
 |  | 
 | // Test [Function.apply] on user-defined classes that implement [noSuchMethod]. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 | import 'dart:mirrors'; | 
 |  | 
 | class F { | 
 |   call([p1]) => "call"; | 
 |   noSuchMethod(Invocation invocation) => "NSM"; | 
 | } | 
 |  | 
 | class G { | 
 |   call() => '42'; | 
 |   noSuchMethod(Invocation invocation) => invocation; | 
 | } | 
 |  | 
 | class H { | 
 |   call(required, {a}) => required + a; | 
 | } | 
 |  | 
 | main() { | 
 |   Expect.equals('call', Function.apply(new F(), [])); | 
 |   Expect.equals('call', Function.apply(new F(), [1])); | 
 |   Expect.equals('NSM', Function.apply(new F(), [1, 2])); | 
 |   Expect.equals('NSM', Function.apply(new F(), [1, 2, 3])); | 
 |  | 
 |   var symbol = const Symbol('a'); | 
 |   var requiredParameters = [1]; | 
 |   var optionalParameters = new Map<Symbol, int>()..[symbol] = 42; | 
 |   Invocation i = | 
 |       Function.apply(new G(), requiredParameters, optionalParameters); | 
 |  | 
 |   Expect.equals(const Symbol('call'), i.memberName); | 
 |   Expect.listEquals(requiredParameters, i.positionalArguments); | 
 |   Expect.mapEquals(optionalParameters, i.namedArguments); | 
 |   Expect.isTrue(i.isMethod); | 
 |   Expect.isFalse(i.isGetter); | 
 |   Expect.isFalse(i.isSetter); | 
 |   Expect.isFalse(i.isAccessor); | 
 |  | 
 |   // Check that changing the passed list and map for parameters does | 
 |   // not affect [i]. | 
 |   requiredParameters[0] = 42; | 
 |   optionalParameters[symbol] = 12; | 
 |   Expect.listEquals([1], i.positionalArguments); | 
 |   Expect.mapEquals(new Map()..[symbol] = 42, i.namedArguments); | 
 |  | 
 |   // Check that using [i] for invocation yields the same [Invocation] | 
 |   // object. | 
 |   var mirror = reflect(new G()); | 
 |   Invocation other = mirror.delegate(i); | 
 |   Expect.equals(i.memberName, other.memberName); | 
 |   Expect.listEquals(i.positionalArguments, other.positionalArguments); | 
 |   Expect.mapEquals(i.namedArguments, other.namedArguments); | 
 |   Expect.equals(i.isMethod, other.isMethod); | 
 |   Expect.equals(i.isGetter, other.isGetter); | 
 |   Expect.equals(i.isSetter, other.isSetter); | 
 |   Expect.equals(i.isAccessor, other.isAccessor); | 
 |  | 
 |   // Test that [i] can be used to hit an existing method. | 
 |   Expect.equals(43, new H().call(1, a: 42)); | 
 |   Expect.equals(43, Function.apply(new H(), [1], new Map()..[symbol] = 42)); | 
 |   mirror = reflect(new H()); | 
 |   Expect.equals(43, mirror.delegate(i)); | 
 |   Expect.equals(43, mirror.delegate(other)); | 
 | } |