| // Copyright (c) 2017, 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"; | |
| // 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 invocation.memberName; | |
| } | |
| bar() { | |
| return _bar; | |
| } | |
| } | |
| class Foo {} | |
| main() { | |
| dynamic x = new ReturnInvocationName(42); | |
| Expect.equals('final!', x.finalField); | |
| Expect.equals('final!', x.finalField, 'field was not set'); | |
| 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(Symbol.unaryMinus, -x); | |
| Expect.equals(#+, x + 42); | |
| Expect.equals(#[], x[4]); | |
| dynamic b = new BaseClass(); | |
| Expect.equals('final!', b.finalField); | |
| Expect.throwsNoSuchMethodError(() => b.finalField = "foo"); | |
| Expect.equals('final!', b.finalField, 'field was not set'); | |
| // Verify that noSuchMethod errors are triggered even when the JS object | |
| // happens to have a matching member name. | |
| dynamic f = new Foo(); | |
| Expect.throwsNoSuchMethodError(() => f.prototype); | |
| Expect.throwsNoSuchMethodError(() => f.prototype()); | |
| Expect.throwsNoSuchMethodError(() => f.prototype = 42); | |
| Expect.throwsNoSuchMethodError(() => f.constructor); | |
| Expect.throwsNoSuchMethodError(() => f.constructor()); | |
| Expect.throwsNoSuchMethodError(() => f.constructor = 42); | |
| Expect.throwsNoSuchMethodError(() => f.__proto__); | |
| // These are valid JS properties but not Dart methods. | |
| Expect.throwsNoSuchMethodError(() => f.toLocaleString); | |
| Expect.throwsNoSuchMethodError(() => f.hasOwnProperty); | |
| f = (int x) {}; | |
| // Calls with the wrong number of arguments should be NoSuchMethodErrors. | |
| Expect.throwsNoSuchMethodError(() => f()); | |
| Expect.throwsNoSuchMethodError(() => f('hi', '!')); | |
| Expect.throwsNoSuchMethodError(() => f(x: 42)); | |
| } |