Index: tests/corelib_strong/dynamic_nosuchmethod_test.dart |
diff --git a/tests/corelib_strong/dynamic_nosuchmethod_test.dart b/tests/corelib_strong/dynamic_nosuchmethod_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5873e854a526faab21a9fb28759fe9d535b73fcb |
--- /dev/null |
+++ b/tests/corelib_strong/dynamic_nosuchmethod_test.dart |
@@ -0,0 +1,77 @@ |
+// Copyright (c) 2012, 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. |
+ |
+import "package:expect/expect.dart"; |
+import 'dart:mirrors'; |
+ |
+// Test that noSuchMethod calls behave as expected for dynamic object invocations. |
+class BaseClass { |
+ final dynamic finalField = "final!"; |
+ |
+ baz() => "baz!!"; |
+ get bla => (() => "bla!!"); |
+} |
+ |
+class ReturnInvocationName extends BaseClass { |
+ var _bar; |
+ |
+ ReturnInvocationName(this._bar); |
+ |
+ noSuchMethod(Invocation invocation) { |
+ return MirrorSystem.getName(invocation.memberName); |
+ } |
+ |
+ bar() { |
+ return _bar; |
+ } |
+} |
+ |
+class Foo {} |
+ |
+main() { |
Jacob
2017/01/21 01:11:30
existing tests weren't designed to poke holes in t
|
+ dynamic x = new ReturnInvocationName(42); |
+ Expect.equals('final!', x.finalField); |
+ |
+ // https://github.com/dart-lang/sdk/issues/28363 |
+ // Expect.throws(() => x.finalField = "foo", |
+ // (e) => e is NoSuchMethodError); |
+ Expect.equals('final!', x.finalField); |
+ |
+ Expect.equals('_prototype', x._prototype); |
+ Expect.equals('_prototype', x._prototype()); |
+ |
+ Expect.equals('prototype', x.prototype); |
+ Expect.equals('prototype', x.prototype()); |
+ |
+ Expect.equals('constructor', x.constructor); |
+ Expect.equals('constructor', x.constructor()); |
+ |
+ Expect.equals('__proto__', x.__proto__); |
+ Expect.equals('__proto__', x.__proto__); |
+ |
+ Expect.equals(42, x.bar()); |
+ Expect.equals(42, (x.bar)()); |
+ |
+ Expect.equals('unary-', -x); |
+ Expect.equals('+', x + 42); |
+ Expect.equals('[]', x[4]); |
+ |
+ // Verify that noSuchMethod errors are triggered even when the JS object |
+ // happens to have a matching member name. |
+ dynamic f = new Foo(); |
+ Expect.throws(() => f.prototype, (e) => e is NoSuchMethodError); |
+ Expect.throws(() => f.prototype(), (e) => e is NoSuchMethodError); |
+ Expect.throws(() => f.prototype = 42, (e) => e is NoSuchMethodError); |
+ |
+ Expect.throws(() => f.constructor, (e) => e is NoSuchMethodError); |
+ Expect.throws(() => f.constructor(), (e) => e is NoSuchMethodError); |
+ Expect.throws(() => f.constructor = 42, (e) => e is NoSuchMethodError); |
+ |
+ Expect.throws(() => f.__proto__, (e) => e is NoSuchMethodError); |
+ |
+ // These are valid JS properties but not Dart methods. |
+ Expect.throws(() => f.toLocaleString, (e) => e is NoSuchMethodError); |
+ |
+ Expect.throws(() => f.hasOwnProperty, (e) => e is NoSuchMethodError); |
+} |