| // 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 '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 occurrences 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(); | |
| } |