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 |