// Copyright (c) 2011, 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"; // Test to see if resolving a hidden native class's method to noSuchMethod // interferes with subsequent resolving of the method. This might happen if the // noSuchMethod is cached on Object.prototype. @Native("A1") class A1 {} @Native("B1") class B1 extends A1 {} makeA1() native; makeB1() native; @Native("A2") class A2 { foo([a = 99]) native; } @Native("B2") class B2 extends A2 {} makeA2() native; makeB2() native; makeObject() native; void setup() { JS('', r""" (function(){ // This code is inside 'setup' and so not accessible from the global scope. function inherits(child, parent) { if (child.prototype.__proto__) { child.prototype.__proto__ = parent.prototype; } else { function tmp() {}; tmp.prototype = parent.prototype; child.prototype = new tmp(); child.prototype.constructor = child; } } function A1(){} function B1(){} inherits(B1, A1); self.makeA1 = function(){return new A1()}; self.makeB1 = function(){return new B1()}; function A2(){} function B2(){} inherits(B2, A2); A2.prototype.foo = function(a){return 'A2.foo(' + a + ')';}; self.makeA2 = function(){return new A2()}; self.makeB2 = function(){return new B2()}; self.makeObject = function(){return new Object()}; self.nativeConstructor(A1); self.nativeConstructor(A2); self.nativeConstructor(B1); self.nativeConstructor(B2); })()"""); applyTestExtensions(['A1', 'A2', 'B1', 'B2']); } main() { nativeTesting(); setup(); var a1 = makeA1(); var b1 = makeB1(); var ob = makeObject(); // Does calling missing methods in one tree of inheritance forest affect other // trees? expectNoSuchMethod(() => b1.foo(), 'b1.foo()'); expectNoSuchMethod(() => a1.foo(), 'a1.foo()'); expectNoSuchMethod(() => ob.foo(), 'ob.foo()'); var a2 = makeA2(); var b2 = makeB2(); Expect.equals('A2.foo(99)', a2.foo()); Expect.equals('A2.foo(99)', b2.foo()); Expect.equals('A2.foo(1)', a2.foo(1)); Expect.equals('A2.foo(2)', b2.foo(2)); expectNoSuchMethod(() => b1.foo(3), 'b1.foo(3)'); expectNoSuchMethod(() => a1.foo(4), 'a1.foo(4)'); } expectNoSuchMethod(action, note) { bool caught = false; try { action(); } catch (ex) { caught = true; Expect.isTrue(ex is NoSuchMethodError, note); } Expect.isTrue(caught, note); }