| // 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. |
| |
| // @dart = 2.7 |
| |
| import 'native_testing.dart'; |
| |
| @Native("A") |
| class A {} |
| |
| A makeA() native; |
| |
| void setup() { |
| JS('', r""" |
| (function(){ |
| function A() {}; |
| A.prototype.foo = function() { return 99; }; |
| self.makeA = function() { return new A(); }; |
| self.nativeConstructor(A); |
| })()"""); |
| applyTestExtensions(['A']); |
| } |
| |
| class B { |
| // We need to define a foo method so that dart2js sees it. Because the |
| // only occurences of 'foo' is on B, a Dart class, no interceptor is used. It |
| // thinks all calls will either go to this method, or throw a |
| // NoSuchMethodError. It is possible that the native class will shadow a |
| // method, but it will not shadow 'foo' because the name is either 'mangled' |
| // with the arity, or minified. |
| foo() { |
| return 42; |
| } |
| } |
| |
| typedContext() { |
| confuse(new B()).foo(); |
| dynamic a = makeA(); |
| Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError); |
| Expect.throws(() => a.foo, (e) => e is NoSuchMethodError); |
| Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError); |
| } |
| |
| untypedContext() { |
| confuse(new B()).foo(); |
| var a = confuse(makeA()); |
| Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError); |
| Expect.throws(() => a.foo, (e) => e is NoSuchMethodError); |
| Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError); |
| } |
| |
| main() { |
| nativeTesting(); |
| setup(); |
| typedContext(); |
| untypedContext(); |
| } |