// 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. // Test for downcasts on native classes. import "native_testing.dart"; 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(){ 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 {} bool _check(a, b) => identical(a, b); main() { nativeTesting(); setup(); var a1 = makeA(); var b1 = makeB(); var ob = new Object(); Expect.throws(() => ob as J); Expect.throws(() => ob as I); Expect.throws(() => ob as A); Expect.throws(() => ob as B); Expect.throws(() => ob as C); // Use b1 first to prevent a1 is checks patching the A prototype. Expect.equals(b1, b1 as J); Expect.equals(b1, b1 as I); Expect.equals(b1, b1 as A); Expect.equals(b1, b1 as B); Expect.equals(a1, a1 as J); Expect.equals(a1, a1 as I); Expect.equals(a1, a1 as A); Expect.throws(() => a1 as B); Expect.throws(() => a1 as C); }