// 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.reflect_model_test; import 'dart:mirrors'; import 'package:expect/expect.dart'; import 'model.dart'; import 'stringify.dart'; variablesOf(ClassMirror cm) { var result = new Map(); cm.declarations.forEach((k, v) { if (v is VariableMirror) result[k] = v; }); return result; } gettersOf(ClassMirror cm) { var result = new Map(); cm.declarations.forEach((k, v) { if (v is MethodMirror && v.isGetter) result[k] = v; }); return result; } settersOf(ClassMirror cm) { var result = new Map(); cm.declarations.forEach((k, v) { if (v is MethodMirror && v.isSetter) result[k] = v; }); return result; } methodsOf(ClassMirror cm) { var result = new Map(); cm.declarations.forEach((k, v) { if (v is MethodMirror && v.isRegularMethod) result[k] = v; }); return result; } main() { var unnamed = new Symbol(''); var field = new Symbol('field'); var instanceMethod = new Symbol('instanceMethod'); var accessor = new Symbol('accessor'); var aMethod = new Symbol('aMethod'); var bMethod = new Symbol('bMethod'); var cMethod = new Symbol('cMethod'); var aClass = reflectClass(A); var bClass = reflectClass(B); var cClass = reflectClass(C); var a = aClass.newInstance(unnamed, []); var b = bClass.newInstance(unnamed, []); var c = cClass.newInstance(unnamed, []); expect('{field: Variable(s(field) in s(A))}', variablesOf(aClass)); expect('{}', variablesOf(bClass)); expect('{}', variablesOf(cClass)); Expect.isNull(a.getField(field).reflectee); Expect.equals('B:get field', b.getField(field).reflectee); Expect.equals('B:get field', c.getField(field).reflectee); Expect.equals(42, a.setField(field, 42).reflectee); Expect.equals(87, b.setField(field, 87).reflectee); Expect.equals(89, c.setField(field, 89).reflectee); Expect.equals(42, a.getField(field).reflectee); Expect.equals('B:get field', b.getField(field).reflectee); Expect.equals('B:get field', c.getField(field).reflectee); Expect.equals(89, fieldC); expect( '{accessor: Method(s(accessor) in s(A), getter)' '}', gettersOf(aClass)); expect( '{accessor: Method(s(accessor) in s(B), getter)' ', field: Method(s(field) in s(B), getter)}', gettersOf(bClass)); expect('{accessor: Method(s(accessor) in s(C), getter)}', gettersOf(cClass)); expect( '{accessor=: Method(s(accessor=) in s(A), setter)' '}', settersOf(aClass)); expect( '{accessor=: Method(s(accessor=) in s(B), setter)}', settersOf(bClass)); expect( '{accessor=: Method(s(accessor=) in s(C), setter)' ', field=: Method(s(field=) in s(C), setter)}', settersOf(cClass)); Expect.equals('A:instanceMethod(7)', a.invoke(instanceMethod, [7]).reflectee); Expect.equals('B:instanceMethod(9)', b.invoke(instanceMethod, [9]).reflectee); Expect.equals( 'C:instanceMethod(13)', c.invoke(instanceMethod, [13]).reflectee); expect( '{aMethod: Method(s(aMethod) in s(A))' ', instanceMethod: Method(s(instanceMethod) in s(A))}', methodsOf(aClass)); expect( '{bMethod: Method(s(bMethod) in s(B))' ', instanceMethod: Method(s(instanceMethod) in s(B))}', methodsOf(bClass)); expect( '{cMethod: Method(s(cMethod) in s(C))' ', instanceMethod: Method(s(instanceMethod) in s(C))}', methodsOf(cClass)); Expect.equals('A:get accessor', a.getField(accessor).reflectee); Expect.equals('B:get accessor', b.getField(accessor).reflectee); Expect.equals('C:get accessor', c.getField(accessor).reflectee); Expect.equals('foo', a.setField(accessor, 'foo').reflectee); Expect.equals('bar', b.setField(accessor, 'bar').reflectee); Expect.equals('baz', c.setField(accessor, 'baz').reflectee); Expect.equals('foo', accessorA); Expect.equals('bar', accessorB); Expect.equals('baz', accessorC); Expect.equals('aMethod', a.invoke(aMethod, []).reflectee); Expect.equals('aMethod', b.invoke(aMethod, []).reflectee); Expect.equals('aMethod', c.invoke(aMethod, []).reflectee); Expect.throwsNoSuchMethodError(() => a.invoke(bMethod, [])); Expect.equals('bMethod', b.invoke(bMethod, []).reflectee); Expect.equals('bMethod', c.invoke(bMethod, []).reflectee); Expect.throwsNoSuchMethodError(() => a.invoke(cMethod, [])); Expect.throwsNoSuchMethodError(() => b.invoke(cMethod, [])); Expect.equals('cMethod', c.invoke(cMethod, []).reflectee); }