|  | // 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. | 
|  |  | 
|  | library test.invoke_test; | 
|  |  | 
|  | import 'dart:mirrors'; | 
|  |  | 
|  | import 'dart:async' show Future; | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | class C { | 
|  | var field; | 
|  | C() : this.field = 'default'; | 
|  | C.named(this.field); | 
|  |  | 
|  | get getter => 'get $field'; | 
|  | set setter(v) => field = 'set $v'; | 
|  | method(x, y, z) => '$x+$y+$z'; | 
|  | toString() => 'a C'; | 
|  |  | 
|  | noSuchMethod(invocation) => 'DNU'; | 
|  |  | 
|  | static var staticField = 'initial'; | 
|  | static get staticGetter => 'sget $staticField'; | 
|  | static set staticSetter(v) => staticField = 'sset $v'; | 
|  | static staticFunction(x, y) => "($x,$y)"; | 
|  | } | 
|  |  | 
|  | var libraryField = 'a priori'; | 
|  | get libraryGetter => 'lget $libraryField'; | 
|  | set librarySetter(v) => libraryField = 'lset $v'; | 
|  | libraryFunction(x, y) => '$x$y'; | 
|  |  | 
|  | testSync() { | 
|  | var result; | 
|  |  | 
|  | // InstanceMirror invoke | 
|  | C c = new C(); | 
|  | InstanceMirror im = reflect(c); | 
|  | result = im.invoke(const Symbol('method'), [2, 4, 8]); | 
|  | Expect.equals('2+4+8', result.reflectee); | 
|  | result = im.invoke(const Symbol('doesntExist'), [2, 4, 8]); | 
|  | Expect.equals('DNU', result.reflectee); | 
|  | result = im.invoke(const Symbol('method'), [2, 4]); // Wrong arity. | 
|  | Expect.equals('DNU', result.reflectee); | 
|  |  | 
|  | // InstanceMirror invokeGetter | 
|  | result = im.getField(const Symbol('getter')); | 
|  | Expect.equals('get default', result.reflectee); | 
|  | result = im.getField(const Symbol('field')); | 
|  | Expect.equals('default', result.reflectee); | 
|  | result = im.getField(const Symbol('doesntExist')); | 
|  | Expect.equals('DNU', result.reflectee); | 
|  |  | 
|  | // InstanceMirror invokeSetter | 
|  | result = im.setField(const Symbol('setter'), 'foo'); | 
|  | Expect.equals('foo', result.reflectee); | 
|  | Expect.equals('set foo', c.field); | 
|  | Expect.equals('set foo', im.getField(const Symbol('field')).reflectee); | 
|  | result = im.setField(const Symbol('field'), 'bar'); | 
|  | Expect.equals('bar', result.reflectee); | 
|  | Expect.equals('bar', c.field); | 
|  | Expect.equals('bar', im.getField(const Symbol('field')).reflectee); | 
|  | result = im.setField(const Symbol('doesntExist'), 'bar'); | 
|  | Expect.equals('bar', result.reflectee); | 
|  |  | 
|  | // ClassMirror invoke | 
|  | ClassMirror cm = reflectClass(C); | 
|  | result = cm.invoke(const Symbol('staticFunction'), [3, 4]); | 
|  | Expect.equals('(3,4)', result.reflectee); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => cm.invoke(const Symbol('doesntExist'), [3, 4]), 'Not defined'); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => cm.invoke(const Symbol('staticFunction'), [3]), 'Wrong arity'); | 
|  |  | 
|  | // ClassMirror invokeGetter | 
|  | result = cm.getField(const Symbol('staticGetter')); | 
|  | Expect.equals('sget initial', result.reflectee); | 
|  | result = cm.getField(const Symbol('staticField')); | 
|  | Expect.equals('initial', result.reflectee); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => cm.getField(const Symbol('doesntExist')), 'Not defined'); | 
|  |  | 
|  | // ClassMirror invokeSetter | 
|  | result = cm.setField(const Symbol('staticSetter'), 'sfoo'); | 
|  | Expect.equals('sfoo', result.reflectee); | 
|  | Expect.equals('sset sfoo', C.staticField); | 
|  | Expect.equals( | 
|  | 'sset sfoo', cm.getField(const Symbol('staticField')).reflectee); | 
|  | result = cm.setField(const Symbol('staticField'), 'sbar'); | 
|  | Expect.equals('sbar', result.reflectee); | 
|  | Expect.equals('sbar', C.staticField); | 
|  | Expect.equals('sbar', cm.getField(const Symbol('staticField')).reflectee); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => cm.setField(const Symbol('doesntExist'), 'sbar'), 'Not defined'); | 
|  |  | 
|  | // ClassMirror invokeConstructor | 
|  | result = cm.newInstance(Symbol.empty, []); | 
|  | Expect.isTrue(result.reflectee is C); | 
|  | Expect.equals('default', result.reflectee.field); | 
|  | result = cm.newInstance(const Symbol('named'), ['my value']); | 
|  | Expect.isTrue(result.reflectee is C); | 
|  | Expect.equals('my value', result.reflectee.field); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => cm.newInstance(const Symbol('doesntExist'), ['my value']), | 
|  | 'Not defined'); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => cm.newInstance(const Symbol('named'), []), 'Wrong arity'); | 
|  |  | 
|  | // LibraryMirror invoke | 
|  | LibraryMirror lm = cm.owner as LibraryMirror; | 
|  | result = lm.invoke(const Symbol('libraryFunction'), [':', ')']); | 
|  | Expect.equals(':)', result.reflectee); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => lm.invoke(const Symbol('doesntExist'), [':', ')']), 'Not defined'); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => lm.invoke(const Symbol('libraryFunction'), [':']), 'Wrong arity'); | 
|  |  | 
|  | // LibraryMirror invokeGetter | 
|  | result = lm.getField(const Symbol('libraryGetter')); | 
|  | Expect.equals('lget a priori', result.reflectee); | 
|  | result = lm.getField(const Symbol('libraryField')); | 
|  | Expect.equals('a priori', result.reflectee); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => lm.getField(const Symbol('doesntExist')), 'Not defined'); | 
|  |  | 
|  | // LibraryMirror invokeSetter | 
|  | result = lm.setField(const Symbol('librarySetter'), 'lfoo'); | 
|  | Expect.equals('lfoo', result.reflectee); | 
|  | Expect.equals('lset lfoo', libraryField); | 
|  | Expect.equals( | 
|  | 'lset lfoo', lm.getField(const Symbol('libraryField')).reflectee); | 
|  | result = lm.setField(const Symbol('libraryField'), 'lbar'); | 
|  | Expect.equals('lbar', result.reflectee); | 
|  | Expect.equals('lbar', libraryField); | 
|  | Expect.equals('lbar', lm.getField(const Symbol('libraryField')).reflectee); | 
|  | Expect.throwsNoSuchMethodError( | 
|  | () => lm.setField(const Symbol('doesntExist'), 'lbar'), 'Not defined'); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | testSync(); | 
|  | } |