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 |