| // 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. |
| |
| // @dart = 2.9 |
| |
| // 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)); |
| } |