| 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 | 6 |
| 7 import 'dart:mirrors'; | 7 import 'dart:mirrors'; |
| 8 | 8 |
| 9 import '../../light_unittest.dart'; | 9 import '../../light_unittest.dart'; |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 static s(a, b, c) => {"a": a, "b": b, "c": c}; | 32 static s(a, b, c) => {"a": a, "b": b, "c": c}; |
| 33 static _t(a, b) => a + b; | 33 static _t(a, b) => a + b; |
| 34 } | 34 } |
| 35 | 35 |
| 36 typedef Typedef(); | 36 typedef Typedef(); |
| 37 | 37 |
| 38 testInvoke(mirrors) { | 38 testInvoke(mirrors) { |
| 39 var instance = new Class(); | 39 var instance = new Class(); |
| 40 var instMirror = reflect(instance); | 40 var instMirror = reflect(instance); |
| 41 | 41 |
| 42 expect(instMirror.invoke(const Symbol("m"),['A', 'B', instance]).reflectee, | 42 expect(instMirror.invoke(#m, ['A', 'B', instance]).reflectee, |
| 43 equals({"a": 'A', "b":'B', "c": instance})); | 43 equals({"a": 'A', "b":'B', "c": instance})); |
| 44 expect(instMirror.invoke(const Symbol("notDefined"), []).reflectee, | 44 expect(instMirror.invoke(#notDefined, []).reflectee, |
| 45 equals("DNU")); | 45 equals("DNU")); |
| 46 expect(instMirror.invoke(const Symbol("m"), []).reflectee, | 46 expect(instMirror.invoke(#m, []).reflectee, |
| 47 equals("DNU")); // Wrong arity. | 47 equals("DNU")); // Wrong arity. |
| 48 // TODO(rmacnak): Implement access to private members. | |
| 49 // expect(instMirror.invoke(const Symbol("_n"), [3, 4]).reflectee, | |
| 50 // equals(7)); | |
| 51 | 48 |
| 52 var classMirror = instMirror.type; | 49 var classMirror = instMirror.type; |
| 53 expect(classMirror.invoke(const Symbol("s"),['A', 'B', instance]).reflectee, | 50 expect(classMirror.invoke(#s, ['A', 'B', instance]).reflectee, |
| 54 equals({"a": 'A', "b":'B', "c": instance})); | 51 equals({"a": 'A', "b":'B', "c": instance})); |
| 55 expect(() => classMirror.invoke(const Symbol("notDefined"), []).reflectee, | 52 expect(() => classMirror.invoke(#notDefined, []).reflectee, |
| 56 throws); | 53 throws); |
| 57 expect(() => classMirror.invoke(const Symbol("s"), []).reflectee, | 54 expect(() => classMirror.invoke(#s, []).reflectee, |
| 58 throws); // Wrong arity. | 55 throws); // Wrong arity. |
| 59 // TODO(rmacnak): Implement access to private members. | |
| 60 // expect(classMirror.invoke(const Symbol("_t"), [3, 4]).reflectee, | |
| 61 // equals(7)); | |
| 62 | 56 |
| 63 var libMirror = classMirror.owner; | 57 var libMirror = classMirror.owner; |
| 64 expect(libMirror.invoke(const Symbol("u"),['A', 'B', instance]).reflectee, | 58 expect(libMirror.invoke(#u, ['A', 'B', instance]).reflectee, |
| 65 equals({"a": 'A', "b":'B', "c": instance})); | 59 equals({"a": 'A', "b":'B', "c": instance})); |
| 66 expect(() => libMirror.invoke(const Symbol("notDefined"), []).reflectee, | 60 expect(() => libMirror.invoke(#notDefined, []).reflectee, |
| 67 throws); | 61 throws); |
| 68 expect(() => libMirror.invoke(const Symbol("u"), []).reflectee, | 62 expect(() => libMirror.invoke(#u, []).reflectee, |
| 69 throws); // Wrong arity. | 63 throws); // Wrong arity. |
| 70 // NB: This works on the VM but fails at compile-time on dart2js. | |
| 71 // expect(libMirror.invoke(const Symbol("_v"), [3, 4]).reflectee, | |
| 72 // equals(7)); | |
| 73 } | 64 } |
| 74 | 65 |
| 75 testInstanceFieldAccess(mirrors) { | 66 testInstanceFieldAccess(mirrors) { |
| 76 var instance = new Class(); | 67 var instance = new Class(); |
| 77 var instMirror = reflect(instance); | 68 var instMirror = reflect(instance); |
| 78 | 69 |
| 79 instMirror.setFieldAsync(const Symbol('field'), 44); | 70 instMirror.setFieldAsync(#field, 44); |
| 80 instMirror.getFieldAsync(const Symbol('field')).then( | 71 instMirror.getFieldAsync(#field).then( |
| 81 expectAsync1((resultMirror) { | 72 expectAsync1((resultMirror) { |
| 82 expect(resultMirror.reflectee, equals(44)); | 73 expect(resultMirror.reflectee, equals(44)); |
| 83 expect(instance.field, equals(44)); | 74 expect(instance.field, equals(44)); |
| 84 })); | 75 })); |
| 85 } | 76 } |
| 86 | 77 |
| 87 /// In dart2js, lists, numbers, and other objects are treated special | 78 /// In dart2js, lists, numbers, and other objects are treated special |
| 88 /// and their methods are invoked through a techique called interceptors. | 79 /// and their methods are invoked through a techique called interceptors. |
| 89 testIntercepted(mirrors) { | 80 testIntercepted(mirrors) { |
| 90 var instance = 1; | 81 var instance = 1; |
| 91 var instMirror = reflect(instance); | 82 var instMirror = reflect(instance); |
| 92 | 83 |
| 93 expect(instMirror.invoke(const Symbol('toString'), []).reflectee, | 84 expect(instMirror.invoke(#toString, []).reflectee, |
| 94 equals('1')); | 85 equals('1')); |
| 95 | 86 |
| 96 instance = []; | 87 instance = []; |
| 97 instMirror = reflect(instance); | 88 instMirror = reflect(instance); |
| 98 instMirror.setField(const Symbol('length'), 44); | 89 instMirror.setField(#length, 44); |
| 99 var resultMirror = instMirror.getField(const Symbol('length')); | 90 var resultMirror = instMirror.getField(#length); |
| 100 expect(resultMirror.reflectee, equals(44)); | 91 expect(resultMirror.reflectee, equals(44)); |
| 101 expect(instance.length, equals(44)); | 92 expect(instance.length, equals(44)); |
| 102 | 93 |
| 103 expect(instMirror.invoke(const Symbol('toString'), []).reflectee, | 94 expect(instMirror.invoke(#toString, []).reflectee, |
| 104 equals('[null, null, null, null, null, null, null, null, null, null,' | 95 equals('[null, null, null, null, null, null, null, null, null, null,' |
| 105 ' null, null, null, null, null, null, null, null, null, null,' | 96 ' null, null, null, null, null, null, null, null, null, null,' |
| 106 ' null, null, null, null, null, null, null, null, null, null,' | 97 ' null, null, null, null, null, null, null, null, null, null,' |
| 107 ' null, null, null, null, null, null, null, null, null, null,' | 98 ' null, null, null, null, null, null, null, null, null, null,' |
| 108 ' null, null, null, null]')); | 99 ' null, null, null, null]')); |
| 109 } | 100 } |
| 110 | 101 |
| 111 testFieldAccess(mirrors) { | 102 testFieldAccess(mirrors) { |
| 112 var instance = new Class(); | 103 var instance = new Class(); |
| 113 | 104 |
| 114 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; | 105 var libMirror = mirrors.findLibrary(#MirrorsTest).single; |
| 115 var classMirror = libMirror.classes[const Symbol("Class")]; | 106 var classMirror = libMirror.classes[#Class]; |
| 116 var instMirror = reflect(instance); | 107 var instMirror = reflect(instance); |
| 117 var fieldMirror = classMirror.members[const Symbol('field')]; | 108 var fieldMirror = classMirror.members[#field]; |
| 118 var future; | 109 var future; |
| 119 | 110 |
| 120 expect(fieldMirror is VariableMirror, isTrue); | 111 expect(fieldMirror is VariableMirror, isTrue); |
| 121 expect(fieldMirror.type, equals(mirrors.dynamicType)); | 112 expect(fieldMirror.type, equals(mirrors.dynamicType)); |
| 122 | 113 |
| 123 libMirror.setField(const Symbol('topLevelField'), [91]); | 114 libMirror.setField(#topLevelField, [91]); |
| 124 expect(libMirror.getField(const Symbol('topLevelField')).reflectee, | 115 expect(libMirror.getField(#topLevelField).reflectee, |
| 125 equals([91])); | 116 equals([91])); |
| 126 expect(topLevelField, equals([91])); | 117 expect(topLevelField, equals([91])); |
| 127 | 118 |
| 128 libMirror.setFieldAsync(const Symbol('topLevelField'), 42); | 119 libMirror.setFieldAsync(#topLevelField, 42); |
| 129 future = libMirror.getFieldAsync(const Symbol('topLevelField')); | 120 future = libMirror.getFieldAsync(#topLevelField); |
| 130 future.then(expectAsync1((resultMirror) { | 121 future.then(expectAsync1((resultMirror) { |
| 131 expect(resultMirror.reflectee, equals(42)); | 122 expect(resultMirror.reflectee, equals(42)); |
| 132 expect(topLevelField, equals(42)); | 123 expect(topLevelField, equals(42)); |
| 133 })); | 124 })); |
| 134 | 125 |
| 135 classMirror.setFieldAsync(const Symbol('staticField'), 43); | 126 classMirror.setFieldAsync(#staticField, 43); |
| 136 future = classMirror.getFieldAsync(const Symbol('staticField')); | 127 future = classMirror.getFieldAsync(#staticField); |
| 137 future.then(expectAsync1((resultMirror) { | 128 future.then(expectAsync1((resultMirror) { |
| 138 expect(resultMirror.reflectee, equals(43)); | 129 expect(resultMirror.reflectee, equals(43)); |
| 139 expect(Class.staticField, equals(43)); | 130 expect(Class.staticField, equals(43)); |
| 140 })); | 131 })); |
| 141 | 132 |
| 142 instMirror.setFieldAsync(const Symbol('field'), 44); | 133 instMirror.setFieldAsync(#field, 44); |
| 143 future = instMirror.getFieldAsync(const Symbol('field')); | 134 future = instMirror.getFieldAsync(#field); |
| 144 future.then(expectAsync1((resultMirror) { | 135 future.then(expectAsync1((resultMirror) { |
| 145 expect(resultMirror.reflectee, equals(44)); | 136 expect(resultMirror.reflectee, equals(44)); |
| 146 expect(instance.field, equals(44)); | 137 expect(instance.field, equals(44)); |
| 147 })); | 138 })); |
| 148 } | 139 } |
| 149 | 140 |
| 150 testClosureMirrors(mirrors) { | 141 testClosureMirrors(mirrors) { |
| 151 // TODO(ahe): Test optional parameters (named or not). | 142 // TODO(ahe): Test optional parameters (named or not). |
| 152 var closure = (x, y, z) { return x + y + z; }; | 143 var closure = (x, y, z) { return x + y + z; }; |
| 153 | 144 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 166 })); | 157 })); |
| 167 } | 158 } |
| 168 | 159 |
| 169 testInvokeConstructor(mirrors) { | 160 testInvokeConstructor(mirrors) { |
| 170 var classMirror = reflectClass(Class); | 161 var classMirror = reflectClass(Class); |
| 171 | 162 |
| 172 var instanceMirror = classMirror.newInstance(const Symbol(''),[]); | 163 var instanceMirror = classMirror.newInstance(const Symbol(''),[]); |
| 173 expect(instanceMirror.reflectee is Class, equals(true)); | 164 expect(instanceMirror.reflectee is Class, equals(true)); |
| 174 expect(instanceMirror.reflectee.field, equals("default value")); | 165 expect(instanceMirror.reflectee.field, equals("default value")); |
| 175 | 166 |
| 176 instanceMirror = classMirror.newInstance(const Symbol('withInitialValue'), | 167 instanceMirror = classMirror.newInstance(#withInitialValue, |
| 177 [45]); | 168 [45]); |
| 178 expect(instanceMirror.reflectee is Class, equals(true)); | 169 expect(instanceMirror.reflectee is Class, equals(true)); |
| 179 expect(instanceMirror.reflectee.field, equals(45)); | 170 expect(instanceMirror.reflectee.field, equals(45)); |
| 180 | 171 |
| 181 | 172 |
| 182 instanceMirror = classMirror.newInstance(const Symbol('generative'), | 173 instanceMirror = classMirror.newInstance(#generative, |
| 183 [7]); | 174 [7]); |
| 184 expect(instanceMirror.reflectee is Class, equals(true)); | 175 expect(instanceMirror.reflectee is Class, equals(true)); |
| 185 expect(instanceMirror.reflectee.field, equals(7)); | 176 expect(instanceMirror.reflectee.field, equals(7)); |
| 186 | 177 |
| 187 instanceMirror = classMirror.newInstance(const Symbol('redirecting'), | 178 instanceMirror = classMirror.newInstance(#redirecting, |
| 188 [8]); | 179 [8]); |
| 189 expect(instanceMirror.reflectee is Class, equals(true)); | 180 expect(instanceMirror.reflectee is Class, equals(true)); |
| 190 expect(instanceMirror.reflectee.field, equals(16)); | 181 expect(instanceMirror.reflectee.field, equals(16)); |
| 191 | 182 |
| 192 instanceMirror = classMirror.newInstance(const Symbol('faktory'), | 183 instanceMirror = classMirror.newInstance(#faktory, |
| 193 [9]); | 184 [9]); |
| 194 expect(instanceMirror.reflectee is Class, equals(true)); | 185 expect(instanceMirror.reflectee is Class, equals(true)); |
| 195 expect(instanceMirror.reflectee.field, equals(27)); | 186 expect(instanceMirror.reflectee.field, equals(27)); |
| 196 | 187 |
| 197 instanceMirror = classMirror.newInstance(const Symbol('redirectingFactory'), | 188 instanceMirror = classMirror.newInstance(#redirectingFactory, |
| 198 [10]); | 189 [10]); |
| 199 expect(instanceMirror.reflectee is Class, equals(true)); | 190 expect(instanceMirror.reflectee is Class, equals(true)); |
| 200 expect(instanceMirror.reflectee.field, equals(30)); | 191 expect(instanceMirror.reflectee.field, equals(30)); |
| 201 | 192 |
| 202 | 193 |
| 203 var future = classMirror.newInstanceAsync(const Symbol(''), []); | 194 var future = classMirror.newInstanceAsync(const Symbol(''), []); |
| 204 future.then(expectAsync1((resultMirror) { | 195 future.then(expectAsync1((resultMirror) { |
| 205 var instance = resultMirror.reflectee; | 196 var instance = resultMirror.reflectee; |
| 206 expect(instance is Class, equals(true)); | 197 expect(instance is Class, equals(true)); |
| 207 expect(instance.field, equals("default value")); | 198 expect(instance.field, equals("default value")); |
| 208 })); | 199 })); |
| 209 | 200 |
| 210 future = classMirror.newInstanceAsync(const Symbol('withInitialValue'), [45]); | 201 future = classMirror.newInstanceAsync(#withInitialValue, [45]); |
| 211 future.then(expectAsync1((resultMirror) { | 202 future.then(expectAsync1((resultMirror) { |
| 212 var instance = resultMirror.reflectee; | 203 var instance = resultMirror.reflectee; |
| 213 expect(instance is Class, equals(true)); | 204 expect(instance is Class, equals(true)); |
| 214 expect(instance.field, equals(45)); | 205 expect(instance.field, equals(45)); |
| 215 })); | 206 })); |
| 216 } | 207 } |
| 217 | 208 |
| 218 testReflectClass(mirrors) { | 209 testReflectClass(mirrors) { |
| 219 var classMirror = reflectClass(Class); | 210 var classMirror = reflectClass(Class); |
| 220 expect(classMirror is ClassMirror, equals(true)); | 211 expect(classMirror is ClassMirror, equals(true)); |
| 221 var symbolClassMirror = reflectClass(Symbol); | 212 var symbolClassMirror = reflectClass(Symbol); |
| 222 var symbolMirror = symbolClassMirror.newInstance(const Symbol(''), | 213 var symbolMirror = symbolClassMirror.newInstance(const Symbol(''), |
| 223 ['withInitialValue']); | 214 ['withInitialValue']); |
| 224 var objectMirror = classMirror.newInstance(symbolMirror.reflectee,[1234]); | 215 var objectMirror = classMirror.newInstance(symbolMirror.reflectee,[1234]); |
| 225 expect(objectMirror.reflectee is Class, equals(true)); | 216 expect(objectMirror.reflectee is Class, equals(true)); |
| 226 expect(objectMirror.reflectee.field, equals(1234)); | 217 expect(objectMirror.reflectee.field, equals(1234)); |
| 227 } | 218 } |
| 228 | 219 |
| 229 testNames(mirrors) { | 220 testNames(mirrors) { |
| 230 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; | 221 var libMirror = mirrors.findLibrary(#MirrorsTest).single; |
| 231 var classMirror = libMirror.classes[const Symbol('Class')]; | 222 var classMirror = libMirror.classes[#Class]; |
| 232 var typedefMirror = libMirror.members[const Symbol('Typedef')]; | 223 var typedefMirror = libMirror.members[#Typedef]; |
| 233 var methodMirror = libMirror.functions[const Symbol('testNames')]; | 224 var methodMirror = libMirror.functions[#testNames]; |
| 234 var variableMirror = classMirror.variables[const Symbol('field')]; | 225 var variableMirror = classMirror.variables[#field]; |
| 235 | 226 |
| 236 expect(libMirror.simpleName, equals(const Symbol('MirrorsTest'))); | 227 expect(libMirror.simpleName, equals(#MirrorsTest)); |
| 237 expect(libMirror.qualifiedName, equals(const Symbol('MirrorsTest'))); | 228 expect(libMirror.qualifiedName, equals(#MirrorsTest)); |
| 238 | 229 |
| 239 expect(classMirror.simpleName, equals(const Symbol('Class'))); | 230 expect(classMirror.simpleName, equals(#Class)); |
| 240 expect(classMirror.qualifiedName, equals(const Symbol('MirrorsTest.Class'))); | 231 expect(classMirror.qualifiedName, equals(#MirrorsTest.Class)); |
| 241 | 232 |
| 242 TypeVariableMirror typeVariable = classMirror.typeVariables.single; | 233 TypeVariableMirror typeVariable = classMirror.typeVariables.single; |
| 243 expect(typeVariable.simpleName, equals(const Symbol('T'))); | 234 expect(typeVariable.simpleName, equals(#T)); |
| 244 expect(typeVariable.qualifiedName, | 235 expect(typeVariable.qualifiedName, |
| 245 equals(const Symbol('MirrorsTest.Class.T'))); | 236 equals(const Symbol('MirrorsTest.Class.T'))); |
| 246 | 237 |
| 247 if (!isDart2js) { // TODO(ahe): Implement this in dart2js. | 238 if (!isDart2js) { // TODO(ahe): Implement this in dart2js. |
| 248 expect(typedefMirror.simpleName, equals(const Symbol('Typedef'))); | 239 expect(typedefMirror.simpleName, equals(#Typedef)); |
| 249 expect(typedefMirror.qualifiedName, | 240 expect(typedefMirror.qualifiedName, |
| 250 equals(const Symbol('MirrorsTest.Typedef'))); | 241 equals(const Symbol('MirrorsTest.Typedef'))); |
| 251 | 242 |
| 252 var typedefMirrorDeNovo = reflectClass(Typedef); | 243 var typedefMirrorDeNovo = reflectType(Typedef); |
| 253 expect(typedefMirrorDeNovo.simpleName, equals(const Symbol('Typedef'))); | 244 expect(typedefMirrorDeNovo.simpleName, equals(#Typedef)); |
| 254 expect(typedefMirrorDeNovo.qualifiedName, | 245 expect(typedefMirrorDeNovo.qualifiedName, |
| 255 equals(const Symbol('MirrorsTest.Typedef'))); | 246 equals(const Symbol('MirrorsTest.Typedef'))); |
| 256 } | 247 } |
| 257 | 248 |
| 258 expect(methodMirror.simpleName, equals(const Symbol('testNames'))); | 249 expect(methodMirror.simpleName, equals(#testNames)); |
| 259 expect(methodMirror.qualifiedName, | 250 expect(methodMirror.qualifiedName, |
| 260 equals(const Symbol('MirrorsTest.testNames'))); | 251 equals(const Symbol('MirrorsTest.testNames'))); |
| 261 | 252 |
| 262 expect(variableMirror.simpleName, equals(const Symbol('field'))); | 253 expect(variableMirror.simpleName, equals(#field)); |
| 263 expect(variableMirror.qualifiedName, | 254 expect(variableMirror.qualifiedName, |
| 264 equals(const Symbol('MirrorsTest.Class.field'))); | 255 equals(const Symbol('MirrorsTest.Class.field'))); |
| 265 } | 256 } |
| 266 | 257 |
| 267 testLibraryUri(var value, bool check(Uri)) { | 258 testLibraryUri(var value, bool check(Uri)) { |
| 268 var valueMirror = reflect(value); | 259 var valueMirror = reflect(value); |
| 269 ClassMirror valueClass = valueMirror.type; | 260 ClassMirror valueClass = valueMirror.type; |
| 270 LibraryMirror valueLibrary = valueClass.owner; | 261 LibraryMirror valueLibrary = valueClass.owner; |
| 271 expect(check(valueLibrary.uri), isTrue); | 262 expect(check(valueLibrary.uri), isTrue); |
| 272 } | 263 } |
| 273 | 264 |
| 274 main() { | 265 main() { |
| 275 var mirrors = currentMirrorSystem(); | 266 var mirrors = currentMirrorSystem(); |
| 276 test("Test reflective method invocation", () { testInvoke(mirrors); }); | 267 test("Test reflective method invocation", () { testInvoke(mirrors); }); |
| 277 test("Test instance field access", () { testInstanceFieldAccess(mirrors); }); | 268 test("Test instance field access", () { testInstanceFieldAccess(mirrors); }); |
| 278 test('Test intercepted objects', () { testIntercepted(mirrors); }); | 269 test('Test intercepted objects', () { testIntercepted(mirrors); }); |
| 279 test("Test field access", () { testFieldAccess(mirrors); }); | 270 test("Test field access", () { testFieldAccess(mirrors); }); |
| 280 test("Test closure mirrors", () { testClosureMirrors(mirrors); }); | 271 test("Test closure mirrors", () { testClosureMirrors(mirrors); }); |
| 281 test("Test invoke constructor", () { testInvokeConstructor(mirrors); }); | 272 test("Test invoke constructor", () { testInvokeConstructor(mirrors); }); |
| 282 test("Test current library uri", () { | 273 test("Test current library uri", () { |
| 283 testLibraryUri(new Class(), | 274 testLibraryUri(new Class(), |
| 284 (Uri uri) => uri.path.endsWith('/mirrors_test.dart')); | 275 (Uri uri) => uri.path.endsWith('/mirrors_test.dart')); |
| 285 }); | 276 }); |
| 286 test("Test dart library uri", () { | 277 test("Test dart library uri", () { |
| 287 testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core')); | 278 testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core')); |
| 288 }); | 279 }); |
| 289 test("Test simple and qualifiedName", () { testNames(mirrors); }); | 280 test("Test simple and qualifiedName", () { testNames(mirrors); }); |
| 290 test("Test reflect type", () { testReflectClass(mirrors); }); | 281 test("Test reflect type", () { testReflectClass(mirrors); }); |
| 291 } | 282 } |
| OLD | NEW |