| // 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. | 
 |  | 
 | // VMOptions=--lazy-dispatchers | 
 | // VMOptions=--no-lazy-dispatchers | 
 |  | 
 | 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) { | 
 |     var name = invocation.memberName.toString(); | 
 |     var match = new RegExp(r'Symbol\("([^"]+)"\)').matchAsPrefix(name); | 
 |     return match != null ? match.group(1) : name; | 
 |   } | 
 |  | 
 |   bar() { | 
 |     return _bar; | 
 |   } | 
 | } | 
 |  | 
 | class Foo {} | 
 |  | 
 | main() { | 
 |   dynamic x = new ReturnInvocationName(42); | 
 |   Expect.equals('final!', x.finalField); | 
 |   Expect.equals('foo', x.finalField = "foo", 'should call noSuchMethod'); | 
 |   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('unary-', -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)); | 
 | } |