OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // Dart test program for checking implemention of MirrorSystem when | 5 // Dart test program for checking implemention of MirrorSystem when |
6 // inspecting the current isolate. | 6 // inspecting the current isolate. |
7 // | 7 // |
8 // VMOptions=--enable_type_checks | 8 // VMOptions=--enable_type_checks |
9 | 9 |
10 library isolate_mirror_local_test; | 10 library isolate_mirror_local_test; |
11 | 11 |
| 12 import 'dart:async'; |
12 import 'dart:isolate'; | 13 import 'dart:isolate'; |
13 import 'dart:mirrors'; | 14 import 'dart:mirrors'; |
14 | 15 |
15 ReceivePort exit_port; | 16 ReceivePort exit_port; |
16 Set expectedTests; | 17 Set expectedTests; |
17 | 18 |
18 void testDone(String test) { | 19 void testDone(String test) { |
19 if (!expectedTests.contains(test)) { | 20 if (!expectedTests.contains(test)) { |
20 throw "Unexpected test name '$test'"; | 21 throw "Unexpected test name '$test'"; |
21 } | 22 } |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 lib_mirror.invoke('function', [ 123 ]).then( | 119 lib_mirror.invoke('function', [ 123 ]).then( |
119 (InstanceMirror retval) { | 120 (InstanceMirror retval) { |
120 Expect.equals(123, global_var); | 121 Expect.equals(123, global_var); |
121 Expect.equals('int', retval.type.simpleName); | 122 Expect.equals('int', retval.type.simpleName); |
122 Expect.isTrue(retval.hasReflectee); | 123 Expect.isTrue(retval.hasReflectee); |
123 Expect.equals(124, retval.reflectee); | 124 Expect.equals(124, retval.reflectee); |
124 testDone('testRootLibraryMirror'); | 125 testDone('testRootLibraryMirror'); |
125 }); | 126 }); |
126 | 127 |
127 // Check that the members map is complete. | 128 // Check that the members map is complete. |
128 List keys = lib_mirror.members.keys; | 129 List keys = lib_mirror.members.keys.toList(); |
129 sort(keys); | 130 sort(keys); |
130 Expect.equals('[' | 131 Expect.equals('[' |
131 'FuncType, ' | 132 'FuncType, ' |
132 'GenericClass, ' | 133 'GenericClass, ' |
133 'MyClass, ' | 134 'MyClass, ' |
134 'MyException, ' | 135 'MyException, ' |
135 'MyInterface, ' | 136 'MyInterface, ' |
136 'MySuperClass, ' | 137 'MySuperClass, ' |
137 '_stringCompare, ' | 138 '_stringCompare, ' |
138 'buildMethodString, ' | 139 'buildMethodString, ' |
(...skipping 16 matching lines...) Expand all Loading... |
155 'testIntegerInstanceMirror, ' | 156 'testIntegerInstanceMirror, ' |
156 'testLibrariesMap, ' | 157 'testLibrariesMap, ' |
157 'testMirrorErrors, ' | 158 'testMirrorErrors, ' |
158 'testMirrorSystem, ' | 159 'testMirrorSystem, ' |
159 'testNullInstanceMirror, ' | 160 'testNullInstanceMirror, ' |
160 'testRootLibraryMirror, ' | 161 'testRootLibraryMirror, ' |
161 'testStringInstanceMirror]', | 162 'testStringInstanceMirror]', |
162 '$keys'); | 163 '$keys'); |
163 | 164 |
164 // Check that the classes map is complete. | 165 // Check that the classes map is complete. |
165 keys = lib_mirror.classes.keys; | 166 keys = lib_mirror.classes.keys.toList(); |
166 sort(keys); | 167 sort(keys); |
167 Expect.equals('[' | 168 Expect.equals('[' |
168 'FuncType, ' | 169 'FuncType, ' |
169 'GenericClass, ' | 170 'GenericClass, ' |
170 'MyClass, ' | 171 'MyClass, ' |
171 'MyException, ' | 172 'MyException, ' |
172 'MyInterface, ' | 173 'MyInterface, ' |
173 'MySuperClass]', | 174 'MySuperClass]', |
174 '$keys'); | 175 '$keys'); |
175 | 176 |
176 // Check that the functions map is complete. | 177 // Check that the functions map is complete. |
177 keys = lib_mirror.functions.keys; | 178 keys = lib_mirror.functions.keys.toList(); |
178 sort(keys); | 179 sort(keys); |
179 Expect.equals('[' | 180 Expect.equals('[' |
180 '_stringCompare, ' | 181 '_stringCompare, ' |
181 'buildMethodString, ' | 182 'buildMethodString, ' |
182 'buildVariableString, ' | 183 'buildVariableString, ' |
183 'function, ' | 184 'function, ' |
184 'main, ' | 185 'main, ' |
185 'methodWithError, ' | 186 'methodWithError, ' |
186 'methodWithException, ' | 187 'methodWithException, ' |
187 'myVar, ' | 188 'myVar, ' |
188 'myVar=, ' | 189 'myVar=, ' |
189 'sort, ' | 190 'sort, ' |
190 'testBoolInstanceMirror, ' | 191 'testBoolInstanceMirror, ' |
191 'testCustomInstanceMirror, ' | 192 'testCustomInstanceMirror, ' |
192 'testDone, ' | 193 'testDone, ' |
193 'testIntegerInstanceMirror, ' | 194 'testIntegerInstanceMirror, ' |
194 'testLibrariesMap, ' | 195 'testLibrariesMap, ' |
195 'testMirrorErrors, ' | 196 'testMirrorErrors, ' |
196 'testMirrorSystem, ' | 197 'testMirrorSystem, ' |
197 'testNullInstanceMirror, ' | 198 'testNullInstanceMirror, ' |
198 'testRootLibraryMirror, ' | 199 'testRootLibraryMirror, ' |
199 'testStringInstanceMirror]', | 200 'testStringInstanceMirror]', |
200 '$keys'); | 201 '$keys'); |
201 | 202 |
202 // Check that the getters map is complete. | 203 // Check that the getters map is complete. |
203 keys = lib_mirror.getters.keys; | 204 keys = lib_mirror.getters.keys.toList(); |
204 sort(keys); | 205 sort(keys); |
205 Expect.equals('[myVar]', '$keys'); | 206 Expect.equals('[myVar]', '$keys'); |
206 | 207 |
207 // Check that the setters map is complete. | 208 // Check that the setters map is complete. |
208 keys = lib_mirror.setters.keys; | 209 keys = lib_mirror.setters.keys.toList(); |
209 sort(keys); | 210 sort(keys); |
210 Expect.equals('[myVar=]', '$keys'); | 211 Expect.equals('[myVar=]', '$keys'); |
211 | 212 |
212 // Check that the variables map is complete. | 213 // Check that the variables map is complete. |
213 keys = lib_mirror.variables.keys; | 214 keys = lib_mirror.variables.keys.toList(); |
214 sort(keys); | 215 sort(keys); |
215 Expect.equals('[' | 216 Expect.equals('[' |
216 'exit_port, ' | 217 'exit_port, ' |
217 'expectedTests, ' | 218 'expectedTests, ' |
218 'final_global_var, ' | 219 'final_global_var, ' |
219 'global_var, ' | 220 'global_var, ' |
220 'myFunc]', | 221 'myFunc]', |
221 '$keys'); | 222 '$keys'); |
222 | 223 |
223 ClassMirror cls_mirror = lib_mirror.members['MyClass']; | 224 ClassMirror cls_mirror = lib_mirror.members['MyClass']; |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 } | 452 } |
452 | 453 |
453 void methodWithError() { | 454 void methodWithError() { |
454 // We get a parse error when we try to run this function. | 455 // We get a parse error when we try to run this function. |
455 +++; | 456 +++; |
456 } | 457 } |
457 | 458 |
458 void testMirrorErrors(MirrorSystem mirrors) { | 459 void testMirrorErrors(MirrorSystem mirrors) { |
459 LibraryMirror lib_mirror = mirrors.isolate.rootLibrary; | 460 LibraryMirror lib_mirror = mirrors.isolate.rootLibrary; |
460 | 461 |
461 Future<InstanceMirror> future = | 462 lib_mirror.invoke('methodWithException', []) |
462 lib_mirror.invoke('methodWithException', []); | 463 .then((InstanceMirror retval) { |
463 future.handleException( | 464 // Should not reach here. |
464 (MirroredError exc) { | 465 Expect.isTrue(false); |
465 Expect.isTrue(exc is MirroredUncaughtExceptionError); | 466 }) |
| 467 .catchError((exc) { |
| 468 Expect.isTrue(exc.error is MirroredUncaughtExceptionError); |
466 Expect.equals('MyException', | 469 Expect.equals('MyException', |
467 exc.exception_mirror.type.simpleName); | 470 exc.error.exception_mirror.type.simpleName); |
468 Expect.equals('MyException: from methodWithException', | 471 Expect.equals('MyException: from methodWithException', |
469 exc.exception_string); | 472 exc.error.exception_string); |
470 Expect.isTrue(exc.stacktrace.toString().contains( | 473 Expect.isTrue(exc.error.stacktrace.toString().contains( |
471 'isolate_mirror_local_test.dart')); | 474 'isolate_mirror_local_test.dart')); |
472 testDone('testMirrorErrors1'); | 475 testDone('testMirrorErrors1'); |
473 return true; | |
474 }); | |
475 future.then( | |
476 (InstanceMirror retval) { | |
477 // Should not reach here. | |
478 Expect.isTrue(false); | |
479 }); | 476 }); |
480 | 477 |
481 Future<InstanceMirror> future2 = | 478 lib_mirror.invoke('methodWithError', []) |
482 lib_mirror.invoke('methodWithError', []); | 479 .then((InstanceMirror retval) { |
483 future2.handleException( | 480 // Should not reach here. |
484 (MirroredError exc) { | 481 Expect.isTrue(false); |
485 Expect.isTrue(exc is MirroredCompilationError); | 482 }) |
486 Expect.isTrue(exc.message.contains('unexpected token')); | 483 .catchError((exc) { |
487 testDone('testMirrorErrors2'); | 484 Expect.isTrue(exc.error is MirroredCompilationError); |
488 return true; | 485 Expect.isTrue(exc.error.message.contains('unexpected token')); |
489 }); | 486 testDone('testMirrorErrors2'); |
490 future2.then( | 487 }); |
491 (InstanceMirror retval) { | |
492 // Should not reach here. | |
493 Expect.isTrue(false); | |
494 }); | |
495 | 488 |
496 // TODO(turnidge): When we call a method that doesn't exist, we | 489 // TODO(turnidge): When we call a method that doesn't exist, we |
497 // should probably call noSuchMethod(). I'm adding this test to | 490 // should probably call noSuchMethod(). I'm adding this test to |
498 // document the current behavior in the meantime. | 491 // document the current behavior in the meantime. |
499 Future<InstanceMirror> future3 = | 492 lib_mirror.invoke('methodNotFound', []) |
500 lib_mirror.invoke('methodNotFound', []); | 493 .then((InstanceMirror retval) { |
501 future3.handleException( | 494 // Should not reach here. |
502 (MirroredError exc) { | 495 Expect.isTrue(false); |
503 Expect.isTrue(exc is MirroredCompilationError); | 496 }) |
504 Expect.isTrue(exc.message.contains( | 497 .catchError((exc) { |
505 "did not find top-level function 'methodNotFound'")); | 498 Expect.isTrue(exc.error is MirroredCompilationError); |
506 testDone('testMirrorErrors3'); | 499 Expect.isTrue(exc.error.message.contains( |
507 return true; | 500 "did not find top-level function 'methodNotFound'")); |
508 }); | 501 testDone('testMirrorErrors3'); |
509 future3.then( | 502 }); |
510 (InstanceMirror retval) { | |
511 // Should not reach here. | |
512 Expect.isTrue(false); | |
513 }); | |
514 } | 503 } |
515 | 504 |
516 void main() { | 505 void main() { |
517 // When all of the expected tests complete, the exit_port is closed, | 506 // When all of the expected tests complete, the exit_port is closed, |
518 // allowing the program to terminate. | 507 // allowing the program to terminate. |
519 exit_port = new ReceivePort(); | 508 exit_port = new ReceivePort(); |
520 expectedTests = new Set<String>.from(['testRootLibraryMirror', | 509 expectedTests = new Set<String>.from(['testRootLibraryMirror', |
521 'testLibrariesMap', | 510 'testLibrariesMap', |
522 'testMirrorSystem', | 511 'testMirrorSystem', |
523 'testIntegerInstanceMirror', | 512 'testIntegerInstanceMirror', |
524 'testStringInstanceMirror', | 513 'testStringInstanceMirror', |
525 'testBoolInstanceMirror', | 514 'testBoolInstanceMirror', |
526 'testNullInstanceMirror', | 515 'testNullInstanceMirror', |
527 'testCustomInstanceMirror', | 516 'testCustomInstanceMirror', |
528 'testMirrorErrors1', | 517 'testMirrorErrors1', |
529 'testMirrorErrors2', | 518 'testMirrorErrors2', |
530 'testMirrorErrors3']); | 519 'testMirrorErrors3']); |
531 | 520 |
532 // Test that an isolate can reflect on itself. | 521 // Test that an isolate can reflect on itself. |
533 mirrorSystemOf(exit_port.toSendPort()).then(testMirrorSystem); | 522 mirrorSystemOf(exit_port.toSendPort()).then(testMirrorSystem); |
534 | 523 |
535 testIntegerInstanceMirror(reflect(1001)); | 524 testIntegerInstanceMirror(reflect(1001)); |
536 testStringInstanceMirror(reflect('This\nis\na\nString')); | 525 testStringInstanceMirror(reflect('This\nis\na\nString')); |
537 testBoolInstanceMirror(reflect(true)); | 526 testBoolInstanceMirror(reflect(true)); |
538 testNullInstanceMirror(reflect(null)); | 527 testNullInstanceMirror(reflect(null)); |
539 testCustomInstanceMirror(reflect(new MyClass(17))); | 528 testCustomInstanceMirror(reflect(new MyClass(17))); |
540 testMirrorErrors(currentMirrorSystem()); | 529 testMirrorErrors(currentMirrorSystem()); |
541 } | 530 } |
OLD | NEW |