| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } | |
| OLD | NEW |