// 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. import "native_testing.dart"; // Test for correct simple is-checks on hidden native classes. abstract class J {} abstract class I extends J { I read(); write(covariant I x); } // Native implementation. @Native("A") class A implements I { // The native class accepts only other native instances. A read() native; write(A x) native; } @Native("B") class B extends A {} makeA() native; makeB() 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 A(){} function B(){} inherits(B, A); A.prototype.read = function() { return this._x; }; A.prototype.write = function(x) { this._x = x; }; self.makeA = function(){return new A()}; self.makeB = function(){return new B()}; self.nativeConstructor(A); self.nativeConstructor(B); })()"""); applyTestExtensions(['A', 'B']); } class C {} main() { nativeTesting(); setup(); var a1 = makeA(); var b1 = makeB(); var ob = new Object(); Expect.isFalse(ob is J); Expect.isFalse(ob is I); Expect.isFalse(ob is A); Expect.isFalse(ob is B); Expect.isFalse(ob is C); // Use b1 first to prevent a1 is checks patching the A prototype. Expect.isTrue(b1 is J); Expect.isTrue(b1 is I); Expect.isTrue(b1 is A); Expect.isTrue(b1 is B); Expect.isTrue(b1 is! C); Expect.isTrue(a1 is J); Expect.isTrue(a1 is I); Expect.isTrue(a1 is A); Expect.isTrue(a1 is! B); Expect.isTrue(a1 is! C); }