| 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 // TODO(rmacnak): Move the existing mirror tests here (a place for | 5 // TODO(rmacnak): Move the existing mirror tests here (a place for |
| 6 // cross-implementation tests). | 6 // cross-implementation tests). |
| 7 | 7 |
| 8 library MirrorsTest; | 8 library MirrorsTest; |
| 9 import "dart:mirrors"; | 9 import "dart:mirrors"; |
| 10 import "../../../pkg/unittest/lib/unittest.dart"; | 10 import "../../../pkg/unittest/lib/unittest.dart"; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 typedef Typedef(); | 23 typedef Typedef(); |
| 24 | 24 |
| 25 testInvoke(mirrors) { | 25 testInvoke(mirrors) { |
| 26 var instance = new Class(); | 26 var instance = new Class(); |
| 27 var instMirror = reflect(instance); | 27 var instMirror = reflect(instance); |
| 28 | 28 |
| 29 expect(instMirror.invoke(const Symbol("m"),['A', 'B', instance]).reflectee, | 29 expect(instMirror.invoke(const Symbol("m"),['A', 'B', instance]).reflectee, |
| 30 equals({"a": 'A', "b":'B', "c": instance})); | 30 equals({"a": 'A', "b":'B', "c": instance})); |
| 31 } | 31 } |
| 32 | 32 |
| 33 testInstanceFieldAccess(mirrors) { |
| 34 var instance = new Class(); |
| 35 var instMirror = reflect(instance); |
| 36 |
| 37 instMirror.setFieldAsync(const Symbol('field'), 44); |
| 38 instMirror.getFieldAsync(const Symbol('field')).then( |
| 39 expectAsync1((resultMirror) { |
| 40 expect(resultMirror.reflectee, equals(44)); |
| 41 expect(instance.field, equals(44)); |
| 42 })); |
| 43 } |
| 44 |
| 45 /// In dart2js, lists, numbers, and other objects are treated special |
| 46 /// and their methods are invoked through a techique called interceptors. |
| 47 testIntercepted(mirrors) { |
| 48 var instance = 1; |
| 49 var instMirror = reflect(instance); |
| 50 |
| 51 expect(instMirror.invoke(const Symbol('toString'), []).reflectee, |
| 52 equals('1')); |
| 53 |
| 54 instance = []; |
| 55 instMirror = reflect(instance); |
| 56 instMirror.setField(const Symbol('length'), 44); |
| 57 var resultMirror = instMirror.getField(const Symbol('length')); |
| 58 expect(resultMirror.reflectee, equals(44)); |
| 59 expect(instance.length, equals(44)); |
| 60 |
| 61 expect(instMirror.invoke(const Symbol('toString'), []).reflectee, |
| 62 equals('[null, null, null, null, null, null, null, null, null, null,' |
| 63 ' null, null, null, null, null, null, null, null, null, null,' |
| 64 ' null, null, null, null, null, null, null, null, null, null,' |
| 65 ' null, null, null, null, null, null, null, null, null, null,' |
| 66 ' null, null, null, null]')); |
| 67 } |
| 68 |
| 33 testFieldAccess(mirrors) { | 69 testFieldAccess(mirrors) { |
| 34 var instance = new Class(); | 70 var instance = new Class(); |
| 35 | 71 |
| 36 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; | 72 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; |
| 37 var classMirror = libMirror.classes[const Symbol("Class")]; | 73 var classMirror = libMirror.classes[const Symbol("Class")]; |
| 38 var instMirror = reflect(instance); | 74 var instMirror = reflect(instance); |
| 39 var fieldMirror = classMirror.members[new Symbol('field')]; | 75 var fieldMirror = classMirror.members[const Symbol('field')]; |
| 40 | 76 |
| 41 expect(fieldMirror is VariableMirror, isTrue); | 77 expect(fieldMirror is VariableMirror, isTrue); |
| 42 expect(fieldMirror.type, equals(mirrors.dynamicType)); | 78 expect(fieldMirror.type, equals(mirrors.dynamicType)); |
| 43 | 79 |
| 44 libMirror.setField(const Symbol('topLevelField'), [91]); | 80 libMirror.setField(const Symbol('topLevelField'), [91]); |
| 45 expect(libMirror.getField(const Symbol('topLevelField')).reflectee, | 81 expect(libMirror.getField(const Symbol('topLevelField')).reflectee, |
| 46 equals([91])); | 82 equals([91])); |
| 47 expect(topLevelField, equals([91])); | 83 expect(topLevelField, equals([91])); |
| 48 | 84 |
| 49 libMirror.setFieldAsync(new Symbol('topLevelField'), 42); | 85 libMirror.setFieldAsync(const Symbol('topLevelField'), 42); |
| 50 var future = libMirror.getFieldAsync(new Symbol('topLevelField')); | 86 var future = libMirror.getFieldAsync(const Symbol('topLevelField')); |
| 51 future.then(expectAsync1((resultMirror) { | 87 future.then(expectAsync1((resultMirror) { |
| 52 expect(resultMirror.reflectee, equals(42)); | 88 expect(resultMirror.reflectee, equals(42)); |
| 53 expect(topLevelField, equals(42)); | 89 expect(topLevelField, equals(42)); |
| 54 })); | 90 })); |
| 55 | 91 |
| 56 classMirror.setFieldAsync(new Symbol('staticField'), 43); | 92 classMirror.setFieldAsync(const Symbol('staticField'), 43); |
| 57 future = classMirror.getFieldAsync(new Symbol('staticField')); | 93 future = classMirror.getFieldAsync(const Symbol('staticField')); |
| 58 future.then(expectAsync1((resultMirror) { | 94 future.then(expectAsync1((resultMirror) { |
| 59 expect(resultMirror.reflectee, equals(43)); | 95 expect(resultMirror.reflectee, equals(43)); |
| 60 expect(Class.staticField, equals(43)); | 96 expect(Class.staticField, equals(43)); |
| 61 })); | 97 })); |
| 62 | 98 |
| 63 instMirror.setFieldAsync(new Symbol('field'), 44); | 99 instMirror.setFieldAsync(const Symbol('field'), 44); |
| 64 future = instMirror.getFieldAsync(new Symbol('field')); | 100 future = instMirror.getFieldAsync(const Symbol('field')); |
| 65 future.then(expectAsync1((resultMirror) { | 101 future.then(expectAsync1((resultMirror) { |
| 66 expect(resultMirror.reflectee, equals(44)); | 102 expect(resultMirror.reflectee, equals(44)); |
| 67 expect(instance.field, equals(44)); | 103 expect(instance.field, equals(44)); |
| 68 })); | 104 })); |
| 69 } | 105 } |
| 70 | 106 |
| 71 testClosureMirrors(mirrors) { | 107 testClosureMirrors(mirrors) { |
| 72 var closure = (x, y, z) { return x + y + z; }; | 108 var closure = (x, y, z) { return x + y + z; }; |
| 73 | 109 |
| 74 var mirror = reflect(closure); | 110 var mirror = reflect(closure); |
| 75 expect(mirror is ClosureMirror, equals(true)); | 111 expect(mirror is ClosureMirror, equals(true)); |
| 76 | 112 |
| 77 var funcMirror = mirror.function; | 113 var funcMirror = mirror.function; |
| 78 expect(funcMirror is MethodMirror, equals(true)); | 114 expect(funcMirror is MethodMirror, equals(true)); |
| 79 expect(funcMirror.parameters.length, equals(3)); | 115 expect(funcMirror.parameters.length, equals(3)); |
| 80 | 116 |
| 81 expect(mirror.apply([7, 8, 9]).reflectee, equals(24)); | 117 expect(mirror.apply([7, 8, 9]).reflectee, equals(24)); |
| 82 | 118 |
| 83 var future = mirror.applyAsync([2, 4, 8]); | 119 var future = mirror.applyAsync([2, 4, 8]); |
| 84 future.then(expectAsync1((resultMirror) { | 120 future.then(expectAsync1((resultMirror) { |
| 85 expect(resultMirror.reflectee, equals(14)); | 121 expect(resultMirror.reflectee, equals(14)); |
| 86 })); | 122 })); |
| 87 } | 123 } |
| 88 | 124 |
| 89 testInvokeConstructor(mirrors) { | 125 testInvokeConstructor(mirrors) { |
| 90 var libMirror = mirrors.findLibrary(const Symbol("MirrorsTest")).single; | 126 var classMirror = reflectClass(Class); |
| 91 var classMirror = libMirror.classes[const Symbol("Class")]; | |
| 92 | 127 |
| 93 var instanceMirror = classMirror.newInstance(const Symbol(''),[]); | 128 var instanceMirror = classMirror.newInstance(const Symbol(''),[]); |
| 94 expect(instanceMirror.reflectee is Class, equals(true)); | 129 expect(instanceMirror.reflectee is Class, equals(true)); |
| 95 expect(instanceMirror.reflectee.field, equals("default value")); | 130 expect(instanceMirror.reflectee.field, equals("default value")); |
| 96 | 131 |
| 97 instanceMirror = classMirror.newInstance(const Symbol('withInitialValue'), | 132 instanceMirror = classMirror.newInstance(const Symbol('withInitialValue'), |
| 98 [45]); | 133 [45]); |
| 99 expect(instanceMirror.reflectee is Class, equals(true)); | 134 expect(instanceMirror.reflectee is Class, equals(true)); |
| 100 expect(instanceMirror.reflectee.field, equals(45)); | 135 expect(instanceMirror.reflectee.field, equals(45)); |
| 101 | 136 |
| 102 var future = classMirror.newInstanceAsync(new Symbol(''), []); | 137 var future = classMirror.newInstanceAsync(const Symbol(''), []); |
| 103 future.then(expectAsync1((resultMirror) { | 138 future.then(expectAsync1((resultMirror) { |
| 104 var instance = resultMirror.reflectee; | 139 var instance = resultMirror.reflectee; |
| 105 expect(instance is Class, equals(true)); | 140 expect(instance is Class, equals(true)); |
| 106 expect(instance.field, equals("default value")); | 141 expect(instance.field, equals("default value")); |
| 107 })); | 142 })); |
| 108 | 143 |
| 109 future = classMirror.newInstanceAsync(new Symbol('withInitialValue'), [45]); | 144 future = classMirror.newInstanceAsync(const Symbol('withInitialValue'), [45]); |
| 110 future.then(expectAsync1((resultMirror) { | 145 future.then(expectAsync1((resultMirror) { |
| 111 var instance = resultMirror.reflectee; | 146 var instance = resultMirror.reflectee; |
| 112 expect(instance is Class, equals(true)); | 147 expect(instance is Class, equals(true)); |
| 113 expect(instance.field, equals(45)); | 148 expect(instance.field, equals(45)); |
| 114 })); | 149 })); |
| 115 } | 150 } |
| 116 | 151 |
| 117 testReflectClass(mirrors) { | 152 testReflectClass(mirrors) { |
| 118 var classMirror = reflectClass(Class); | 153 var classMirror = reflectClass(Class); |
| 119 expect(classMirror is ClassMirror, equals(true)); | 154 expect(classMirror is ClassMirror, equals(true)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 equals(const Symbol('MirrorsTest.Class.field'))); | 191 equals(const Symbol('MirrorsTest.Class.field'))); |
| 157 } | 192 } |
| 158 | 193 |
| 159 testLibraryUri(var value, bool check(Uri)) { | 194 testLibraryUri(var value, bool check(Uri)) { |
| 160 var valueMirror = reflect(value); | 195 var valueMirror = reflect(value); |
| 161 ClassMirror valueClass = valueMirror.type; | 196 ClassMirror valueClass = valueMirror.type; |
| 162 LibraryMirror valueLibrary = valueClass.owner; | 197 LibraryMirror valueLibrary = valueClass.owner; |
| 163 expect(check(valueLibrary.uri), isTrue); | 198 expect(check(valueLibrary.uri), isTrue); |
| 164 } | 199 } |
| 165 | 200 |
| 166 main() { | 201 mainWithArgument({bool isDart2js}) { |
| 167 var mirrors = currentMirrorSystem(); | 202 var mirrors = currentMirrorSystem(); |
| 168 test("Test reflective method invocation", () { testInvoke(mirrors); }); | 203 test("Test reflective method invocation", () { testInvoke(mirrors); }); |
| 204 test("Test instance field access", () { testInstanceFieldAccess(mirrors); }); |
| 205 test('Test intercepted objects', () { testIntercepted(mirrors); }); |
| 206 if (isDart2js) return; |
| 169 test("Test field access", () { testFieldAccess(mirrors); }); | 207 test("Test field access", () { testFieldAccess(mirrors); }); |
| 170 test("Test closure mirrors", () { testClosureMirrors(mirrors); }); | 208 test("Test closure mirrors", () { testClosureMirrors(mirrors); }); |
| 171 test("Test invoke constructor", () { testInvokeConstructor(mirrors); }); | 209 test("Test invoke constructor", () { testInvokeConstructor(mirrors); }); |
| 172 test("Test reflect type", () { testReflectClass(mirrors); }); | 210 test("Test reflect type", () { testReflectClass(mirrors); }); |
| 173 test("Test simple and qualifiedName", () { testNames(mirrors); }); | 211 test("Test simple and qualifiedName", () { testNames(mirrors); }); |
| 174 test("Test current library uri", () { | 212 test("Test current library uri", () { |
| 175 testLibraryUri(new Class(), | 213 testLibraryUri(new Class(), |
| 176 (Uri uri) => uri.path.endsWith('/mirrors_test.dart')); | 214 (Uri uri) => uri.path.endsWith('/mirrors_test.dart')); |
| 177 }); | 215 }); |
| 178 test("Test dart library uri", () { | 216 test("Test dart library uri", () { |
| 179 testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core')); | 217 testLibraryUri("test", (Uri uri) => uri == Uri.parse('dart:core')); |
| 180 }); | 218 }); |
| 181 } | 219 } |
| 220 |
| 221 main() { |
| 222 mainWithArgument(isDart2js: false); |
| 223 } |
| OLD | NEW |