| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.reflect_model_test; | 5 library test.reflect_model_test; |
| 6 | 6 |
| 7 import 'dart:mirrors'; | 7 import 'dart:mirrors'; |
| 8 | 8 |
| 9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
| 10 | 10 |
| 11 import 'model.dart'; | 11 import 'model.dart'; |
| 12 import 'stringify.dart'; | 12 import 'stringify.dart'; |
| 13 | 13 |
| 14 isNoSuchMethodError(e) => e is NoSuchMethodError; | 14 isNoSuchMethodError(e) => e is NoSuchMethodError; |
| 15 | 15 |
| 16 variablesOf(ClassMirror cm) { | |
| 17 var result = new Map(); | |
| 18 cm.declarations.forEach((k,v) { | |
| 19 if (v is VariableMirror) result[k] = v; | |
| 20 }); | |
| 21 return result; | |
| 22 } | |
| 23 | |
| 24 gettersOf(ClassMirror cm) { | |
| 25 var result = new Map(); | |
| 26 cm.declarations.forEach((k,v) { | |
| 27 if (v is MethodMirror && v.isGetter) result[k] = v; | |
| 28 }); | |
| 29 return result; | |
| 30 } | |
| 31 | |
| 32 settersOf(ClassMirror cm) { | |
| 33 var result = new Map(); | |
| 34 cm.declarations.forEach((k,v) { | |
| 35 if (v is MethodMirror && v.isSetter) result[k] = v; | |
| 36 }); | |
| 37 return result; | |
| 38 } | |
| 39 | |
| 40 methodsOf(ClassMirror cm) { | |
| 41 var result = new Map(); | |
| 42 cm.declarations.forEach((k,v) { | |
| 43 if (v is MethodMirror && v.isRegularMethod) result[k] = v; | |
| 44 }); | |
| 45 return result; | |
| 46 } | |
| 47 | |
| 48 main() { | 16 main() { |
| 49 var unnamed = new Symbol(''); | 17 var unnamed = new Symbol(''); |
| 50 var field = new Symbol('field'); | 18 var field = new Symbol('field'); |
| 51 var instanceMethod = new Symbol('instanceMethod'); | 19 var instanceMethod = new Symbol('instanceMethod'); |
| 52 var accessor = new Symbol('accessor'); | 20 var accessor = new Symbol('accessor'); |
| 53 var aMethod = new Symbol('aMethod'); | 21 var aMethod = new Symbol('aMethod'); |
| 54 var bMethod = new Symbol('bMethod'); | 22 var bMethod = new Symbol('bMethod'); |
| 55 var cMethod = new Symbol('cMethod'); | 23 var cMethod = new Symbol('cMethod'); |
| 56 | 24 |
| 57 var aClass = reflectClass(A); | 25 var aClass = reflectClass(A); |
| 58 var bClass = reflectClass(B); | 26 var bClass = reflectClass(B); |
| 59 var cClass = reflectClass(C); | 27 var cClass = reflectClass(C); |
| 60 var a = aClass.newInstance(unnamed, []); | 28 var a = aClass.newInstance(unnamed, []); |
| 61 var b = bClass.newInstance(unnamed, []); | 29 var b = bClass.newInstance(unnamed, []); |
| 62 var c = cClass.newInstance(unnamed, []); | 30 var c = cClass.newInstance(unnamed, []); |
| 63 | 31 |
| 64 expect('{field: Variable(s(field) in s(A))}', variablesOf(aClass)); | 32 expect('{field: Variable(s(field) in s(A))}', aClass.variables); |
| 65 expect('{}', variablesOf(bClass)); | 33 expect('{}', bClass.variables); |
| 66 expect('{}', variablesOf(cClass)); | 34 expect('{}', cClass.variables); |
| 67 | 35 |
| 68 Expect.isNull(a.getField(field).reflectee); | 36 Expect.isNull(a.getField(field).reflectee); |
| 69 Expect.equals('B:get field', b.getField(field).reflectee); | 37 Expect.equals('B:get field', b.getField(field).reflectee); |
| 70 Expect.equals('B:get field', c.getField(field).reflectee); | 38 Expect.equals('B:get field', c.getField(field).reflectee); |
| 71 | 39 |
| 72 Expect.equals(42, a.setField(field, 42).reflectee); | 40 Expect.equals(42, a.setField(field, 42).reflectee); |
| 73 Expect.equals(87, b.setField(field, 87).reflectee); | 41 Expect.equals(87, b.setField(field, 87).reflectee); |
| 74 Expect.equals(89, c.setField(field, 89).reflectee); | 42 Expect.equals(89, c.setField(field, 89).reflectee); |
| 75 | 43 |
| 76 Expect.equals(42, a.getField(field).reflectee); | 44 Expect.equals(42, a.getField(field).reflectee); |
| 77 Expect.equals('B:get field', b.getField(field).reflectee); | 45 Expect.equals('B:get field', b.getField(field).reflectee); |
| 78 Expect.equals('B:get field', c.getField(field).reflectee); | 46 Expect.equals('B:get field', c.getField(field).reflectee); |
| 79 Expect.equals(89, fieldC); | 47 Expect.equals(89, fieldC); |
| 80 | 48 |
| 81 expect('{accessor: Method(s(accessor) in s(A), getter)' | 49 expect('{accessor: Method(s(accessor) in s(A), getter)' |
| 82 '}', | 50 '}', |
| 83 gettersOf(aClass)); | 51 aClass.getters); |
| 84 expect('{accessor: Method(s(accessor) in s(B), getter)' | 52 expect('{accessor: Method(s(accessor) in s(B), getter)' |
| 85 ', field: Method(s(field) in s(B), getter)}', | 53 ', field: Method(s(field) in s(B), getter)}', |
| 86 gettersOf(bClass)); | 54 bClass.getters); |
| 87 expect('{accessor: Method(s(accessor) in s(C), getter)}', | 55 expect('{accessor: Method(s(accessor) in s(C), getter)}', |
| 88 gettersOf(cClass)); | 56 cClass.getters); |
| 89 | 57 |
| 90 expect('{accessor=: Method(s(accessor=) in s(A), setter)' | 58 expect('{accessor=: Method(s(accessor=) in s(A), setter)' |
| 91 '}', | 59 '}', |
| 92 settersOf(aClass)); | 60 aClass.setters); |
| 93 expect('{accessor=: Method(s(accessor=) in s(B), setter)}', | 61 expect('{accessor=: Method(s(accessor=) in s(B), setter)}', |
| 94 settersOf(bClass)); | 62 bClass.setters); |
| 95 expect('{accessor=: Method(s(accessor=) in s(C), setter)' | 63 expect('{accessor=: Method(s(accessor=) in s(C), setter)' |
| 96 ', field=: Method(s(field=) in s(C), setter)}', | 64 ', field=: Method(s(field=) in s(C), setter)}', |
| 97 settersOf(cClass)); | 65 cClass.setters); |
| 98 | 66 |
| 99 Expect.equals('A:instanceMethod(7)', a.invoke(instanceMethod, [7]).reflectee); | 67 Expect.equals('A:instanceMethod(7)', a.invoke(instanceMethod, [7]).reflectee); |
| 100 Expect.equals('B:instanceMethod(9)', b.invoke(instanceMethod, [9]).reflectee); | 68 Expect.equals('B:instanceMethod(9)', b.invoke(instanceMethod, [9]).reflectee); |
| 101 Expect.equals( | 69 Expect.equals( |
| 102 'C:instanceMethod(13)', c.invoke(instanceMethod, [13]).reflectee); | 70 'C:instanceMethod(13)', c.invoke(instanceMethod, [13]).reflectee); |
| 103 | 71 |
| 104 expect( | 72 expect( |
| 105 '{aMethod: Method(s(aMethod) in s(A))' | 73 '{aMethod: Method(s(aMethod) in s(A))' |
| 106 ', instanceMethod: Method(s(instanceMethod) in s(A))}', | 74 ', instanceMethod: Method(s(instanceMethod) in s(A))}', |
| 107 methodsOf(aClass)); | 75 aClass.methods); |
| 108 | 76 |
| 109 expect( | 77 expect( |
| 110 '{bMethod: Method(s(bMethod) in s(B))' | 78 '{bMethod: Method(s(bMethod) in s(B))' |
| 111 ', instanceMethod: Method(s(instanceMethod) in s(B))}', | 79 ', instanceMethod: Method(s(instanceMethod) in s(B))}', |
| 112 methodsOf(bClass)); | 80 bClass.methods); |
| 113 expect( | 81 expect( |
| 114 '{cMethod: Method(s(cMethod) in s(C))' | 82 '{cMethod: Method(s(cMethod) in s(C))' |
| 115 ', instanceMethod: Method(s(instanceMethod) in s(C))}', | 83 ', instanceMethod: Method(s(instanceMethod) in s(C))}', |
| 116 methodsOf(cClass)); | 84 cClass.methods); |
| 117 | 85 |
| 118 Expect.equals('A:get accessor', a.getField(accessor).reflectee); | 86 Expect.equals('A:get accessor', a.getField(accessor).reflectee); |
| 119 Expect.equals('B:get accessor', b.getField(accessor).reflectee); | 87 Expect.equals('B:get accessor', b.getField(accessor).reflectee); |
| 120 Expect.equals('C:get accessor', c.getField(accessor).reflectee); | 88 Expect.equals('C:get accessor', c.getField(accessor).reflectee); |
| 121 | 89 |
| 122 Expect.equals('foo', a.setField(accessor, 'foo').reflectee); | 90 Expect.equals('foo', a.setField(accessor, 'foo').reflectee); |
| 123 Expect.equals('bar', b.setField(accessor, 'bar').reflectee); | 91 Expect.equals('bar', b.setField(accessor, 'bar').reflectee); |
| 124 Expect.equals('baz', c.setField(accessor, 'baz').reflectee); | 92 Expect.equals('baz', c.setField(accessor, 'baz').reflectee); |
| 125 | 93 |
| 126 Expect.equals('foo', accessorA); | 94 Expect.equals('foo', accessorA); |
| 127 Expect.equals('bar', accessorB); | 95 Expect.equals('bar', accessorB); |
| 128 Expect.equals('baz', accessorC); | 96 Expect.equals('baz', accessorC); |
| 129 | 97 |
| 130 Expect.equals('aMethod', a.invoke(aMethod, []).reflectee); | 98 Expect.equals('aMethod', a.invoke(aMethod, []).reflectee); |
| 131 Expect.equals('aMethod', b.invoke(aMethod, []).reflectee); | 99 Expect.equals('aMethod', b.invoke(aMethod, []).reflectee); |
| 132 Expect.equals('aMethod', c.invoke(aMethod, []).reflectee); | 100 Expect.equals('aMethod', c.invoke(aMethod, []).reflectee); |
| 133 | 101 |
| 134 Expect.throws(() { a.invoke(bMethod, []); }, isNoSuchMethodError); | 102 Expect.throws(() { a.invoke(bMethod, []); }, isNoSuchMethodError); |
| 135 Expect.equals('bMethod', b.invoke(bMethod, []).reflectee); | 103 Expect.equals('bMethod', b.invoke(bMethod, []).reflectee); |
| 136 Expect.equals('bMethod', c.invoke(bMethod, []).reflectee); | 104 Expect.equals('bMethod', c.invoke(bMethod, []).reflectee); |
| 137 | 105 |
| 138 Expect.throws(() { a.invoke(cMethod, []); }, isNoSuchMethodError); | 106 Expect.throws(() { a.invoke(cMethod, []); }, isNoSuchMethodError); |
| 139 Expect.throws(() { b.invoke(cMethod, []); }, isNoSuchMethodError); | 107 Expect.throws(() { b.invoke(cMethod, []); }, isNoSuchMethodError); |
| 140 Expect.equals('cMethod', c.invoke(cMethod, []).reflectee); | 108 Expect.equals('cMethod', c.invoke(cMethod, []).reflectee); |
| 141 } | 109 } |
| OLD | NEW |