Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: dart/tests/lib/mirrors/mirrors_test.dart

Issue 19576003: Implement invocation of statics. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add comment and update status file. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « dart/tests/compiler/dart2js_extra/mirrors_test.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 MirrorsTest; 5 library MirrorsTest;
6 import "dart:mirrors"; 6 import "dart:mirrors";
7 import "../../../pkg/unittest/lib/unittest.dart"; 7 import "../../../pkg/unittest/lib/unittest.dart";
8 8
9 bool isDart2js = false; // TODO(ahe): Remove this field.
10 bool isMinified = false; // TODO(ahe): Remove this field.
11
9 var topLevelField; 12 var topLevelField;
10 u(a, b, c) => {"a": a, "b": b, "c": c}; 13 u(a, b, c) => {"a": a, "b": b, "c": c};
11 _v(a, b) => a + b; 14 _v(a, b) => a + b;
12 15
13 class Class<T> { 16 class Class<T> {
14 Class() { this.field = "default value"; } 17 Class() { this.field = "default value"; }
15 Class.withInitialValue(this.field); 18 Class.withInitialValue(this.field);
16 var field; 19 var field;
17 20
18 Class.generative(this.field); 21 Class.generative(this.field);
19 Class.redirecting(y) : this.generative(y*2); 22 Class.redirecting(y) : this.generative(y*2);
20 factory Class.faktory(y) => new Class.withInitialValue(y*3); 23 factory Class.faktory(y) => new Class.withInitialValue(y*3);
21 factory Class.redirectingFactory(y) = Class.faktory; 24 factory Class.redirectingFactory(y) = Class.faktory;
22 25
23 m(a, b, c) => {"a": a, "b": b, "c": c}; 26 m(a, b, c) => {"a": a, "b": b, "c": c};
24 _n(a, b) => a + b; 27 _n(a, b) => a + b;
25 noSuchMethod(invocation) => "DNU"; 28 noSuchMethod(invocation) => "DNU";
26 29
27 static var staticField; 30 static var staticField;
28 static s(a, b, c) => {"a": a, "b": b, "c": c}; 31 static s(a, b, c) => {"a": a, "b": b, "c": c};
29 static _t(a, b) => a + b; 32 static _t(a, b) => a + b;
30 } 33 }
31 34
32 typedef Typedef(); 35 typedef Typedef();
33 36
34 testInvoke(mirrors, isDart2js) { 37 testInvoke(mirrors) {
35 var instance = new Class(); 38 var instance = new Class();
36 var instMirror = reflect(instance); 39 var instMirror = reflect(instance);
37 40
38 expect(instMirror.invoke(const Symbol("m"),['A', 'B', instance]).reflectee, 41 expect(instMirror.invoke(const Symbol("m"),['A', 'B', instance]).reflectee,
39 equals({"a": 'A', "b":'B', "c": instance})); 42 equals({"a": 'A', "b":'B', "c": instance}));
40 expect(instMirror.invoke(const Symbol("notDefined"), []).reflectee, 43 expect(instMirror.invoke(const Symbol("notDefined"), []).reflectee,
41 equals("DNU")); 44 equals("DNU"));
42 expect(instMirror.invoke(const Symbol("m"), []).reflectee, 45 expect(instMirror.invoke(const Symbol("m"), []).reflectee,
43 equals("DNU")); // Wrong arity. 46 equals("DNU")); // Wrong arity.
44 // TODO(rmacnak): Implement access to private members. 47 // TODO(rmacnak): Implement access to private members.
45 // expect(instMirror.invoke(const Symbol("_n"), [3, 4]).reflectee, 48 // expect(instMirror.invoke(const Symbol("_n"), [3, 4]).reflectee,
46 // equals(7)); 49 // equals(7));
47 50
48 if (isDart2js) return;
49
50 var classMirror = instMirror.type; 51 var classMirror = instMirror.type;
51 expect(classMirror.invoke(const Symbol("s"),['A', 'B', instance]).reflectee, 52 expect(classMirror.invoke(const Symbol("s"),['A', 'B', instance]).reflectee,
52 equals({"a": 'A', "b":'B', "c": instance})); 53 equals({"a": 'A', "b":'B', "c": instance}));
53 expect(() => classMirror.invoke(const Symbol("notDefined"), []).reflectee, 54 expect(() => classMirror.invoke(const Symbol("notDefined"), []).reflectee,
54 throws); 55 throws);
55 expect(() => classMirror.invoke(const Symbol("s"), []).reflectee, 56 expect(() => classMirror.invoke(const Symbol("s"), []).reflectee,
56 throws); // Wrong arity. 57 throws); // Wrong arity.
57 // TODO(rmacnak): Implement access to private members. 58 // TODO(rmacnak): Implement access to private members.
58 // expect(classMirror.invoke(const Symbol("_t"), [3, 4]).reflectee, 59 // expect(classMirror.invoke(const Symbol("_t"), [3, 4]).reflectee,
59 // equals(7)); 60 // equals(7));
60 61
62 if (isDart2js) return;
63
61 var libMirror = classMirror.owner; 64 var libMirror = classMirror.owner;
62 expect(libMirror.invoke(const Symbol("u"),['A', 'B', instance]).reflectee, 65 expect(libMirror.invoke(const Symbol("u"),['A', 'B', instance]).reflectee,
63 equals({"a": 'A', "b":'B', "c": instance})); 66 equals({"a": 'A', "b":'B', "c": instance}));
64 expect(() => libMirror.invoke(const Symbol("notDefined"), []).reflectee, 67 expect(() => libMirror.invoke(const Symbol("notDefined"), []).reflectee,
65 throws); 68 throws);
66 expect(() => libMirror.invoke(const Symbol("u"), []).reflectee, 69 expect(() => libMirror.invoke(const Symbol("u"), []).reflectee,
67 throws); // Wrong arity. 70 throws); // Wrong arity.
68 // NB: This works on the VM but fails at compile-time on dart2js. 71 // NB: This works on the VM but fails at compile-time on dart2js.
69 // expect(libMirror.invoke(const Symbol("_v"), [3, 4]).reflectee, 72 // expect(libMirror.invoke(const Symbol("_v"), [3, 4]).reflectee,
70 // equals(7)); 73 // equals(7));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 ' null, null, null, null]')); 109 ' null, null, null, null]'));
107 } 110 }
108 111
109 testFieldAccess(mirrors) { 112 testFieldAccess(mirrors) {
110 var instance = new Class(); 113 var instance = new Class();
111 114
112 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; 115 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single;
113 var classMirror = libMirror.classes[const Symbol("Class")]; 116 var classMirror = libMirror.classes[const Symbol("Class")];
114 var instMirror = reflect(instance); 117 var instMirror = reflect(instance);
115 var fieldMirror = classMirror.members[const Symbol('field')]; 118 var fieldMirror = classMirror.members[const Symbol('field')];
119 var future;
116 120
117 expect(fieldMirror is VariableMirror, isTrue); 121 expect(fieldMirror is VariableMirror, isTrue);
118 expect(fieldMirror.type, equals(mirrors.dynamicType)); 122 expect(fieldMirror.type, equals(mirrors.dynamicType));
119 123
120 libMirror.setField(const Symbol('topLevelField'), [91]); 124 if (!isMinified) {
121 expect(libMirror.getField(const Symbol('topLevelField')).reflectee, 125 libMirror.setField(const Symbol('topLevelField'), [91]);
122 equals([91])); 126 expect(libMirror.getField(const Symbol('topLevelField')).reflectee,
123 expect(topLevelField, equals([91])); 127 equals([91]));
128 expect(topLevelField, equals([91]));
124 129
125 libMirror.setFieldAsync(const Symbol('topLevelField'), 42); 130 libMirror.setFieldAsync(const Symbol('topLevelField'), 42);
126 var future = libMirror.getFieldAsync(const Symbol('topLevelField')); 131 future = libMirror.getFieldAsync(const Symbol('topLevelField'));
127 future.then(expectAsync1((resultMirror) { 132 future.then(expectAsync1((resultMirror) {
128 expect(resultMirror.reflectee, equals(42)); 133 expect(resultMirror.reflectee, equals(42));
129 expect(topLevelField, equals(42)); 134 expect(topLevelField, equals(42));
130 })); 135 }));
136 }
131 137
132 classMirror.setFieldAsync(const Symbol('staticField'), 43); 138 classMirror.setFieldAsync(const Symbol('staticField'), 43);
133 future = classMirror.getFieldAsync(const Symbol('staticField')); 139 future = classMirror.getFieldAsync(const Symbol('staticField'));
134 future.then(expectAsync1((resultMirror) { 140 future.then(expectAsync1((resultMirror) {
135 expect(resultMirror.reflectee, equals(43)); 141 expect(resultMirror.reflectee, equals(43));
136 expect(Class.staticField, equals(43)); 142 expect(Class.staticField, equals(43));
137 })); 143 }));
138 144
139 instMirror.setFieldAsync(const Symbol('field'), 44); 145 instMirror.setFieldAsync(const Symbol('field'), 44);
140 future = instMirror.getFieldAsync(const Symbol('field')); 146 future = instMirror.getFieldAsync(const Symbol('field'));
(...skipping 15 matching lines...) Expand all
156 expect(funcMirror.parameters.length, equals(3)); 162 expect(funcMirror.parameters.length, equals(3));
157 163
158 expect(mirror.apply([7, 8, 9]).reflectee, equals(24)); 164 expect(mirror.apply([7, 8, 9]).reflectee, equals(24));
159 165
160 var future = mirror.applyAsync([2, 4, 8]); 166 var future = mirror.applyAsync([2, 4, 8]);
161 future.then(expectAsync1((resultMirror) { 167 future.then(expectAsync1((resultMirror) {
162 expect(resultMirror.reflectee, equals(14)); 168 expect(resultMirror.reflectee, equals(14));
163 })); 169 }));
164 } 170 }
165 171
166 testInvokeConstructor(mirrors, isDart2js) { 172 testInvokeConstructor(mirrors) {
167 var classMirror = reflectClass(Class); 173 var classMirror = reflectClass(Class);
168 174
169 var instanceMirror = classMirror.newInstance(const Symbol(''),[]); 175 var instanceMirror = classMirror.newInstance(const Symbol(''),[]);
170 expect(instanceMirror.reflectee is Class, equals(true)); 176 expect(instanceMirror.reflectee is Class, equals(true));
171 expect(instanceMirror.reflectee.field, equals("default value")); 177 expect(instanceMirror.reflectee.field, equals("default value"));
172 178
173 instanceMirror = classMirror.newInstance(const Symbol('withInitialValue'), 179 instanceMirror = classMirror.newInstance(const Symbol('withInitialValue'),
174 [45]); 180 [45]);
175 expect(instanceMirror.reflectee is Class, equals(true)); 181 expect(instanceMirror.reflectee is Class, equals(true));
176 expect(instanceMirror.reflectee.field, equals(45)); 182 expect(instanceMirror.reflectee.field, equals(45));
177 183
178 184
179 instanceMirror = classMirror.newInstance(const Symbol('generative'), 185 instanceMirror = classMirror.newInstance(const Symbol('generative'),
180 [7]); 186 [7]);
181 expect(instanceMirror.reflectee is Class, equals(true)); 187 expect(instanceMirror.reflectee is Class, equals(true));
182 expect(instanceMirror.reflectee.field, equals(7)); 188 expect(instanceMirror.reflectee.field, equals(7));
183 189
184 instanceMirror = classMirror.newInstance(const Symbol('redirecting'), 190 instanceMirror = classMirror.newInstance(const Symbol('redirecting'),
185 [8]); 191 [8]);
186 expect(instanceMirror.reflectee is Class, equals(true)); 192 expect(instanceMirror.reflectee is Class, equals(true));
187 expect(instanceMirror.reflectee.field, equals(16)); 193 expect(instanceMirror.reflectee.field, equals(16));
188 194
195 instanceMirror = classMirror.newInstance(const Symbol('faktory'),
196 [9]);
197 expect(instanceMirror.reflectee is Class, equals(true));
198 expect(instanceMirror.reflectee.field, equals(27));
189 199
200 instanceMirror = classMirror.newInstance(const Symbol('redirectingFactory'),
201 [10]);
190 if (!isDart2js) { 202 if (!isDart2js) {
191 instanceMirror = classMirror.newInstance(const Symbol('faktory'),
192 [9]);
193 expect(instanceMirror.reflectee is Class, equals(true));
194 expect(instanceMirror.reflectee.field, equals(27));
195
196
197 instanceMirror = classMirror.newInstance(const Symbol('redirectingFactory'),
198 [10]);
199 expect(instanceMirror.reflectee is Class, equals(true)); 203 expect(instanceMirror.reflectee is Class, equals(true));
200 expect(instanceMirror.reflectee.field, equals(30)); 204 expect(instanceMirror.reflectee.field, equals(30));
201 } 205 }
202 206
203 207
204 var future = classMirror.newInstanceAsync(const Symbol(''), []); 208 var future = classMirror.newInstanceAsync(const Symbol(''), []);
205 future.then(expectAsync1((resultMirror) { 209 future.then(expectAsync1((resultMirror) {
206 var instance = resultMirror.reflectee; 210 var instance = resultMirror.reflectee;
207 expect(instance is Class, equals(true)); 211 expect(instance is Class, equals(true));
208 expect(instance.field, equals("default value")); 212 expect(instance.field, equals("default value"));
209 })); 213 }));
210 214
211 future = classMirror.newInstanceAsync(const Symbol('withInitialValue'), [45]); 215 future = classMirror.newInstanceAsync(const Symbol('withInitialValue'), [45]);
212 future.then(expectAsync1((resultMirror) { 216 future.then(expectAsync1((resultMirror) {
213 var instance = resultMirror.reflectee; 217 var instance = resultMirror.reflectee;
214 expect(instance is Class, equals(true)); 218 expect(instance is Class, equals(true));
215 expect(instance.field, equals(45)); 219 expect(instance.field, equals(45));
216 })); 220 }));
217 } 221 }
218 222
219 testReflectClass(mirrors) { 223 testReflectClass(mirrors) {
220 var classMirror = reflectClass(Class); 224 var classMirror = reflectClass(Class);
221 expect(classMirror is ClassMirror, equals(true)); 225 expect(classMirror is ClassMirror, equals(true));
222 var symbolClassMirror = reflectClass(Symbol); 226 var symbolClassMirror = reflectClass(Symbol);
223 var symbolMirror = symbolClassMirror.newInstance(const Symbol(''), 227 var symbolMirror = symbolClassMirror.newInstance(const Symbol(''),
224 ['withInitialValue']); 228 ['withInitialValue']);
229 if (isDart2js) return;
225 var objectMirror = classMirror.newInstance(symbolMirror.reflectee,[1234]); 230 var objectMirror = classMirror.newInstance(symbolMirror.reflectee,[1234]);
226 expect(objectMirror.reflectee is Class, equals(true)); 231 expect(objectMirror.reflectee is Class, equals(true));
227 expect(objectMirror.reflectee.field, equals(1234)); 232 expect(objectMirror.reflectee.field, equals(1234));
228 } 233 }
229 234
230 testNames(mirrors, isDart2js) { 235 testNames(mirrors) {
231 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; 236 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single;
232 var classMirror = libMirror.classes[const Symbol('Class')]; 237 var classMirror = libMirror.classes[const Symbol('Class')];
233 var typedefMirror = libMirror.members[const Symbol('Typedef')]; 238 var typedefMirror = libMirror.members[const Symbol('Typedef')];
234 var methodMirror = libMirror.functions[const Symbol('testNames')]; 239 var methodMirror = libMirror.functions[const Symbol('testNames')];
235 var variableMirror = classMirror.variables[const Symbol('field')]; 240 var variableMirror = classMirror.variables[const Symbol('field')];
236 241
237 expect(libMirror.simpleName, equals(const Symbol('MirrorsTest'))); 242 expect(libMirror.simpleName, equals(const Symbol('MirrorsTest')));
238 expect(libMirror.qualifiedName, equals(const Symbol('MirrorsTest'))); 243 expect(libMirror.qualifiedName, equals(const Symbol('MirrorsTest')));
239 244
240 expect(classMirror.simpleName, equals(const Symbol('Class'))); 245 expect(classMirror.simpleName, equals(const Symbol('Class')));
(...skipping 19 matching lines...) Expand all
260 equals(const Symbol('MirrorsTest.Class.field'))); 265 equals(const Symbol('MirrorsTest.Class.field')));
261 } 266 }
262 267
263 testLibraryUri(var value, bool check(Uri)) { 268 testLibraryUri(var value, bool check(Uri)) {
264 var valueMirror = reflect(value); 269 var valueMirror = reflect(value);
265 ClassMirror valueClass = valueMirror.type; 270 ClassMirror valueClass = valueMirror.type;
266 LibraryMirror valueLibrary = valueClass.owner; 271 LibraryMirror valueLibrary = valueClass.owner;
267 expect(check(valueLibrary.uri), isTrue); 272 expect(check(valueLibrary.uri), isTrue);
268 } 273 }
269 274
270 mainWithArgument({bool isDart2js: false, bool isMinified: false}) { 275 main() {
271 var mirrors = currentMirrorSystem(); 276 var mirrors = currentMirrorSystem();
272 test("Test reflective method invocation", () { testInvoke(mirrors, 277 test("Test reflective method invocation", () { testInvoke(mirrors); });
273 isDart2js); });
274 test("Test instance field access", () { testInstanceFieldAccess(mirrors); }); 278 test("Test instance field access", () { testInstanceFieldAccess(mirrors); });
275 test('Test intercepted objects', () { testIntercepted(mirrors); }); 279 test('Test intercepted objects', () { testIntercepted(mirrors); });
276 if (!isMinified) // TODO(ahe): Remove this line.
277 test("Test field access", () { testFieldAccess(mirrors); }); 280 test("Test field access", () { testFieldAccess(mirrors); });
278 test("Test closure mirrors", () { testClosureMirrors(mirrors); }); 281 test("Test closure mirrors", () { testClosureMirrors(mirrors); });
279 test("Test invoke constructor", () { testInvokeConstructor(mirrors, 282 test("Test invoke constructor", () { testInvokeConstructor(mirrors); });
280 isDart2js); });
281 test("Test current library uri", () { 283 test("Test current library uri", () {
282 testLibraryUri(new Class(), 284 testLibraryUri(new Class(),
283 (Uri uri) => uri.path.endsWith('/mirrors_test.dart')); 285 (Uri uri) => uri.path.endsWith('/mirrors_test.dart'));
284 }); 286 });
285 test("Test dart library uri", () { 287 test("Test dart library uri", () {
286 testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core')); 288 testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core'));
287 }); 289 });
288 if (!isMinified) // TODO(ahe): Remove this line. 290 test("Test simple and qualifiedName", () { testNames(mirrors); });
289 test("Test simple and qualifiedName", () { testNames(mirrors, isDart2js); });
290 if (isDart2js) return; // TODO(ahe): Remove this line.
291 test("Test reflect type", () { testReflectClass(mirrors); }); 291 test("Test reflect type", () { testReflectClass(mirrors); });
292 } 292 }
293
294 main() {
295 mainWithArgument();
296 }
OLDNEW
« no previous file with comments | « dart/tests/compiler/dart2js_extra/mirrors_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698