Index: test/codegen/lib/mirrors/mirrors_nsm_test.dart |
diff --git a/test/codegen/lib/mirrors/mirrors_nsm_test.dart b/test/codegen/lib/mirrors/mirrors_nsm_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2364f925b185781a6dc5434d51079984792ca2c5 |
--- /dev/null |
+++ b/test/codegen/lib/mirrors/mirrors_nsm_test.dart |
@@ -0,0 +1,120 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library MirrorsTest; |
+ |
+import 'dart:mirrors'; |
+import 'package:expect/expect.dart'; |
+ |
+bool isNSMContainingFieldName(e, String fieldName, bool isSetter) { |
+ print(e); |
+ if (e is! NoSuchMethodError) return false; |
+ String needle = fieldName; |
+ if (isSetter) needle += "="; |
+ return "$e".contains(needle) && ! "$e".contains(needle + "="); |
+} |
+ |
+final finalTopLevel = 0; |
+class A { |
+ final finalInstance = 0; |
+ static final finalStatic = 0; |
+} |
+class B { |
+ B(a, b); |
+ factory B.fac(a, b) => new B(a, b); |
+} |
+ |
+testMessageContents() { |
+ var mirrors = currentMirrorSystem(); |
+ var libMirror = mirrors.findLibrary(#MirrorsTest); |
+ Expect.throws(() => libMirror.invoke(#foo, []), |
+ (e) => isNSMContainingFieldName(e, "foo", false)); |
+ Expect.throws(() => libMirror.getField(#foo), |
+ (e) => isNSMContainingFieldName(e, "foo", false)); |
+ Expect.throws(() => libMirror.setField(#foo, null), |
+ (e) => isNSMContainingFieldName(e, "foo", true)); |
+ Expect.throws(() => libMirror.setField(#finalTopLevel, null), |
+ (e) => isNSMContainingFieldName(e, "finalTopLevel", true)); |
+ |
+ var classMirror = reflectClass(A); |
+ Expect.throws(() => classMirror.invoke(#foo, []), |
+ (e) => isNSMContainingFieldName(e, "foo", false)); |
+ Expect.throws(() => classMirror.getField(#foo), |
+ (e) => isNSMContainingFieldName(e, "foo", false)); |
+ Expect.throws(() => classMirror.setField(#foo, null), |
+ (e) => isNSMContainingFieldName(e, "foo", true)); |
+ Expect.throws(() => classMirror.setField(#finalStatic, null), |
+ (e) => isNSMContainingFieldName(e, "finalStatic", true)); |
+ |
+ var instanceMirror = reflect(new A()); |
+ Expect.throws(() => instanceMirror.invoke(#foo, []), |
+ (e) => isNSMContainingFieldName(e, "foo", false)); |
+ Expect.throws(() => instanceMirror.getField(#foo), |
+ (e) => isNSMContainingFieldName(e, "foo", false)); |
+ Expect.throws(() => instanceMirror.setField(#foo, null), |
+ (e) => isNSMContainingFieldName(e, "foo", true)); |
+ Expect.throws(() => instanceMirror.setField(#finalInstance, null), |
+ (e) => isNSMContainingFieldName(e, "finalInstance", true)); |
+} |
+ |
+expectMatchingErrors(reflectiveAction, baseAction) { |
+ var reflectiveError, baseError; |
+ try { |
+ reflectiveAction(); |
+ } catch(e) { |
+ reflectiveError = e; |
+ } |
+ |
+ try { |
+ baseAction(); |
+ } catch(e) { |
+ baseError = e; |
+ } |
+ |
+ if (baseError.toString() != reflectiveError.toString()) { |
+ print("\n==Base==\n $baseError"); |
+ print("\n==Reflective==\n $reflectiveError"); |
+ throw "Expected matching errors"; |
+ } |
+} |
+ |
+testMatchingMessages() { |
+ var mirrors = currentMirrorSystem(); |
+ var libMirror = mirrors.findLibrary(#MirrorsTest); |
+ expectMatchingErrors(() => libMirror.invoke(#foo, []), |
+ () => foo()); |
+ expectMatchingErrors(() => libMirror.getField(#foo), |
+ () => foo); |
+ expectMatchingErrors(() => libMirror.setField(#foo, null), |
+ () => foo= null); |
+ expectMatchingErrors(() => libMirror.setField(#finalTopLevel, null), |
+ () => finalTopLevel= null); |
+ |
+ var classMirror = reflectClass(A); |
+ expectMatchingErrors(() => classMirror.invoke(#foo, []), |
+ () => A.foo()); |
+ expectMatchingErrors(() => classMirror.getField(#foo), |
+ () => A.foo); |
+ expectMatchingErrors(() => classMirror.setField(#foo, null), |
+ () => A.foo= null); |
+ expectMatchingErrors(() => classMirror.setField(#finalStatic, null), |
+ () => A.finalStatic= null); |
+ expectMatchingErrors(() => classMirror.newInstance(#constructor, [1, 2, 3]), |
+ () => new A.constructor(1, 2, 3)); |
+ |
+ var instanceMirror = reflect(new A()); |
+ expectMatchingErrors(() => instanceMirror.invoke(#foo, []), |
+ () => new A().foo()); |
+ expectMatchingErrors(() => instanceMirror.getField(#foo), |
+ () => new A().foo); |
+ expectMatchingErrors(() => instanceMirror.setField(#foo, null), |
+ () => new A().foo= null); |
+ expectMatchingErrors(() => instanceMirror.setField(#finalInstance, null), |
+ () => new A().finalInstance= null); |
+} |
+ |
+main() { |
+ testMessageContents(); |
+ testMatchingMessages(); /// dart2js: ok |
+} |