Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library MirrorsTest; | |
| 6 | |
| 7 import 'dart:mirrors'; | |
| 8 | |
| 9 import '../../light_unittest.dart'; | |
| 10 | |
| 11 bool isDart2js = false; // TODO(ahe): Remove this field. | |
| 12 | |
| 13 var topLevelField; | |
| 14 u(a, b, c) => {"a": a, "b": b, "c": c}; | |
| 15 _v(a, b) => a + b; | |
| 16 | |
| 17 class Class<T> { | |
| 18 Class() { | |
| 19 this.field = "default value"; | |
| 20 } | |
| 21 Class.withInitialValue(this.field); | |
| 22 var field; | |
| 23 | |
| 24 Class.generative(this.field); | |
| 25 Class.redirecting(y) : this.generative(y * 2); | |
| 26 factory Class.faktory(y) => new Class.withInitialValue(y * 3); | |
| 27 factory Class.redirectingFactory(y) = Class<T>.faktory; | |
| 28 | |
| 29 m(a, b, c) => {"a": a, "b": b, "c": c}; | |
| 30 _n(a, b) => a + b; | |
| 31 noSuchMethod(invocation) => "DNU"; | |
| 32 | |
| 33 static var staticField; | |
| 34 static s(a, b, c) => {"a": a, "b": b, "c": c}; | |
| 35 static _t(a, b) => a + b; | |
| 36 } | |
| 37 | |
| 38 typedef Typedef(); | |
| 39 | |
| 40 testInvoke(mirrors) { | |
| 41 var instance = new Class(); | |
| 42 var instMirror = reflect(instance); | |
| 43 | |
| 44 expect(instMirror.invoke(#m, ['A', 'B', instance]).reflectee, | |
| 45 equals({"a": 'A', "b": 'B', "c": instance})); | |
| 46 expect(instMirror.invoke(#notDefined, []).reflectee, equals("DNU")); | |
| 47 expect(instMirror.invoke(#m, []).reflectee, equals("DNU")); // Wrong arity. | |
| 48 | |
| 49 var classMirror = instMirror.type; | |
| 50 expect(classMirror.invoke(#s, ['A', 'B', instance]).reflectee, | |
| 51 equals({"a": 'A', "b": 'B', "c": instance})); | |
| 52 expect(() => classMirror.invoke(#notDefined, []).reflectee, throws); | |
| 53 expect(() => classMirror.invoke(#s, []).reflectee, throws); // Wrong arity. | |
| 54 | |
| 55 var libMirror = classMirror.owner as LibraryMirror; | |
| 56 expect(libMirror.invoke(#u, ['A', 'B', instance]).reflectee, | |
| 57 equals({"a": 'A', "b": 'B', "c": instance})); | |
| 58 expect(() => libMirror.invoke(#notDefined, []).reflectee, throws); | |
| 59 expect(() => libMirror.invoke(#u, []).reflectee, throws); // Wrong arity. | |
| 60 } | |
| 61 | |
| 62 /// In dart2js, lists, numbers, and other objects are treated special | |
| 63 /// and their methods are invoked through a techique called interceptors. | |
| 64 testIntercepted(mirrors) { | |
| 65 { | |
| 66 var instance = 1; | |
| 67 var instMirror = reflect(instance); | |
| 68 | |
| 69 expect(instMirror.invoke(#toString, []).reflectee, equals('1')); | |
| 70 } | |
| 71 | |
| 72 var instance = []; | |
| 73 var instMirror = reflect(instance); | |
| 74 instMirror.setField(#length, 44); | |
| 75 var resultMirror = instMirror.getField(#length); | |
| 76 expect(resultMirror.reflectee, equals(44)); | |
| 77 expect(instance.length, equals(44)); | |
| 78 | |
| 79 expect( | |
| 80 instMirror.invoke(#toString, []).reflectee, | |
| 81 equals('[null, null, null, null, null, null, null, null, null, null,' | |
| 82 ' null, null, null, null, null, null, null, null, null, null,' | |
| 83 ' null, null, null, null, null, null, null, null, null, null,' | |
| 84 ' null, null, null, null, null, null, null, null, null, null,' | |
| 85 ' null, null, null, null]')); | |
| 86 } | |
|
Bob Nystrom
2017/08/23 22:22:07
Do we still need this if we're not supporting mirr
| |
| 87 | |
| 88 testFieldAccess(mirrors) { | |
| 89 var instance = new Class(); | |
| 90 | |
| 91 var libMirror = mirrors.findLibrary(#MirrorsTest); | |
| 92 var classMirror = libMirror.declarations[#Class]; | |
| 93 var instMirror = reflect(instance); | |
| 94 var fieldMirror = classMirror.declarations[#field]; | |
| 95 var future; | |
| 96 | |
| 97 expect(fieldMirror is VariableMirror, isTrue); | |
| 98 expect(fieldMirror.type, equals(mirrors.dynamicType)); | |
| 99 | |
| 100 libMirror.setField(#topLevelField, [91]); | |
| 101 expect(libMirror.getField(#topLevelField).reflectee, equals([91])); | |
| 102 expect(topLevelField, equals([91])); | |
| 103 } | |
| 104 | |
| 105 testClosureMirrors(mirrors) { | |
| 106 // TODO(ahe): Test optional parameters (named or not). | |
| 107 var closure = (x, y, z) { | |
| 108 return x + y + z; | |
| 109 }; | |
| 110 | |
| 111 var mirror = reflect(closure) as ClosureMirror; | |
| 112 | |
| 113 var funcMirror = (mirror.function) as MethodMirror; | |
| 114 expect(funcMirror.parameters.length, equals(3)); | |
| 115 | |
| 116 expect(mirror.apply([7, 8, 9]).reflectee, equals(24)); | |
| 117 } | |
| 118 | |
| 119 testInvokeConstructor(mirrors) { | |
| 120 var classMirror = reflectClass(Class); | |
| 121 | |
| 122 var instanceMirror = classMirror.newInstance(const Symbol(''), []); | |
| 123 expect(instanceMirror.reflectee is Class, equals(true)); | |
| 124 expect(instanceMirror.reflectee.field, equals("default value")); | |
| 125 | |
| 126 instanceMirror = classMirror.newInstance(#withInitialValue, [45]); | |
| 127 expect(instanceMirror.reflectee is Class, equals(true)); | |
| 128 expect(instanceMirror.reflectee.field, equals(45)); | |
| 129 | |
| 130 instanceMirror = classMirror.newInstance(#generative, [7]); | |
| 131 expect(instanceMirror.reflectee is Class, equals(true)); | |
| 132 expect(instanceMirror.reflectee.field, equals(7)); | |
| 133 | |
| 134 instanceMirror = classMirror.newInstance(#redirecting, [8]); | |
| 135 expect(instanceMirror.reflectee is Class, equals(true)); | |
| 136 expect(instanceMirror.reflectee.field, equals(16)); | |
| 137 | |
| 138 instanceMirror = classMirror.newInstance(#faktory, [9]); | |
| 139 expect(instanceMirror.reflectee is Class, equals(true)); | |
| 140 expect(instanceMirror.reflectee.field, equals(27)); | |
| 141 | |
| 142 instanceMirror = classMirror.newInstance(#redirectingFactory, [10]); | |
| 143 expect(instanceMirror.reflectee is Class, equals(true)); | |
| 144 expect(instanceMirror.reflectee.field, equals(30)); | |
| 145 } | |
| 146 | |
| 147 testReflectClass(mirrors) { | |
| 148 var classMirror = reflectClass(Class); | |
| 149 expect(classMirror is ClassMirror, equals(true)); | |
| 150 var symbolClassMirror = reflectClass(Symbol); | |
| 151 var symbolMirror = | |
| 152 symbolClassMirror.newInstance(const Symbol(''), ['withInitialValue']); | |
| 153 var objectMirror = classMirror.newInstance(symbolMirror.reflectee, [1234]); | |
| 154 expect(objectMirror.reflectee is Class, equals(true)); | |
| 155 expect(objectMirror.reflectee.field, equals(1234)); | |
| 156 } | |
| 157 | |
| 158 testNames(mirrors) { | |
| 159 var libMirror = mirrors.findLibrary(#MirrorsTest); | |
| 160 var classMirror = libMirror.declarations[#Class]; | |
| 161 var typedefMirror = libMirror.declarations[#Typedef]; | |
| 162 var methodMirror = libMirror.declarations[#testNames]; | |
| 163 var variableMirror = classMirror.declarations[#field]; | |
| 164 | |
| 165 expect(libMirror.simpleName, equals(#MirrorsTest)); | |
| 166 expect(libMirror.qualifiedName, equals(#MirrorsTest)); | |
| 167 | |
| 168 expect(classMirror.simpleName, equals(#Class)); | |
| 169 expect(classMirror.qualifiedName, equals(#MirrorsTest.Class)); | |
| 170 | |
| 171 TypeVariableMirror typeVariable = classMirror.typeVariables.single; | |
| 172 expect(typeVariable.simpleName, equals(#T)); | |
| 173 expect( | |
| 174 typeVariable.qualifiedName, equals(const Symbol('MirrorsTest.Class.T'))); | |
| 175 | |
| 176 if (!isDart2js) { | |
| 177 // TODO(ahe): Implement this in dart2js. | |
| 178 expect(typedefMirror.simpleName, equals(#Typedef)); | |
| 179 expect(typedefMirror.qualifiedName, | |
| 180 equals(const Symbol('MirrorsTest.Typedef'))); | |
| 181 | |
| 182 var typedefMirrorDeNovo = reflectType(Typedef); | |
| 183 expect(typedefMirrorDeNovo.simpleName, equals(#Typedef)); | |
| 184 expect(typedefMirrorDeNovo.qualifiedName, | |
| 185 equals(const Symbol('MirrorsTest.Typedef'))); | |
| 186 } | |
| 187 | |
| 188 expect(methodMirror.simpleName, equals(#testNames)); | |
| 189 expect(methodMirror.qualifiedName, | |
| 190 equals(const Symbol('MirrorsTest.testNames'))); | |
| 191 | |
| 192 expect(variableMirror.simpleName, equals(#field)); | |
| 193 expect(variableMirror.qualifiedName, | |
| 194 equals(const Symbol('MirrorsTest.Class.field'))); | |
| 195 } | |
| 196 | |
| 197 testLibraryUri(var value, bool check(Uri)) { | |
| 198 var valueMirror = reflect(value); | |
| 199 ClassMirror valueClass = valueMirror.type; | |
| 200 LibraryMirror valueLibrary = valueClass.owner; | |
| 201 Uri uri = valueLibrary.uri; | |
| 202 if (uri.scheme != "https" || | |
| 203 uri.host != "dartlang.org" || | |
| 204 uri.path != "/dart2js-stripped-uri") { | |
| 205 expect(check(uri), isTrue); | |
| 206 } | |
| 207 } | |
| 208 | |
| 209 main() { | |
| 210 var mirrors = currentMirrorSystem(); | |
| 211 test("Test reflective method invocation", () { | |
| 212 testInvoke(mirrors); | |
| 213 }); | |
| 214 test('Test intercepted objects', () { | |
| 215 testIntercepted(mirrors); | |
| 216 }); | |
| 217 test("Test field access", () { | |
| 218 testFieldAccess(mirrors); | |
| 219 }); | |
| 220 test("Test closure mirrors", () { | |
| 221 testClosureMirrors(mirrors); | |
| 222 }); | |
| 223 test("Test invoke constructor", () { | |
| 224 testInvokeConstructor(mirrors); | |
| 225 }); | |
| 226 test("Test current library uri", () { | |
| 227 testLibraryUri( | |
| 228 new Class(), | |
| 229 // TODO(floitsch): change this to "/mirrors_test.dart" when | |
| 230 // dart2js_mirrors_test.dart has been removed. | |
| 231 (Uri uri) => uri.path.endsWith('mirrors_test.dart')); | |
| 232 }); | |
| 233 test("Test dart library uri", () { | |
| 234 testLibraryUri("test", (Uri uri) { | |
| 235 if (uri == Uri.parse('dart:core')) return true; | |
| 236 // TODO(floitsch): do we want to fake the interceptors to | |
| 237 // be in dart:core? | |
| 238 return (uri == Uri.parse('dart:_interceptors')); | |
| 239 }); | |
| 240 }); | |
| 241 test("Test simple and qualifiedName", () { | |
| 242 testNames(mirrors); | |
| 243 }); | |
| 244 test("Test reflect type", () { | |
| 245 testReflectClass(mirrors); | |
| 246 }); | |
| 247 } | |
| OLD | NEW |