// 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. import "dart:mirrors"; import "package:expect/expect.dart"; membersOf(ClassMirror cm) { var result = new Map(); cm.declarations.forEach((k, v) { if (v is MethodMirror && !v.isConstructor) result[k] = v; if (v is VariableMirror) result[k] = v; }); return result; } class WannabeFunction { int call(int a, int b) => a + b; method(x) => x * x; } main() { Expect.isTrue(new WannabeFunction() is Function); ClosureMirror cm = reflect(new WannabeFunction()) as ClosureMirror; Expect.equals(7, cm.invoke(#call, [3, 4]).reflectee); Expect.throwsNoSuchMethodError(() => cm.invoke(#call, [3]), "Wrong arity"); Expect.equals(49, cm.invoke(#method, [7]).reflectee); Expect.throwsNoSuchMethodError(() => cm.invoke(#method, [3, 4]), "Wrong arity"); Expect.equals(7, cm.apply([3, 4]).reflectee); Expect.throwsNoSuchMethodError(() => cm.apply([3]), "Wrong arity"); MethodMirror mm = cm.function; Expect.equals(#call, mm.simpleName); Expect.equals(reflectClass(WannabeFunction), mm.owner); Expect.isTrue(mm.isRegularMethod); Expect.equals(#int, mm.returnType.simpleName); Expect.equals(#int, mm.parameters[0].type.simpleName); Expect.equals(#int, mm.parameters[1].type.simpleName); ClassMirror km = cm.type; Expect.equals(reflectClass(WannabeFunction), km); Expect.equals(#WannabeFunction, km.simpleName); Expect.equals(mm.hashCode, km.declarations[#call].hashCode); Expect.setEquals([#call, #method], membersOf(km).keys); }