// Copyright (c) 2013, 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 classes can have subclasses that are not declared to the program. The // subclasses are indistinguishable from the base class. This means that // abstract native classes can appear to have instances. @Native("A") abstract class A {} @Native("B") abstract class B { foo() native; } class C {} makeA() native; makeB() native; void setup() { JS('', r""" (function(){ function A(){} function B(){} B.prototype.foo = function() { return 'B.foo'; }; self.makeA = function(){return new A()}; self.makeB = function(){return new B()}; self.nativeConstructor(A); self.nativeConstructor(B); })()"""); applyTestExtensions(['A', 'B']); } main() { nativeTesting(); setup(); var a = makeA(); var b = makeB(); var c = confuse(new C()); Expect.isTrue(a is A); Expect.isFalse(b is A); Expect.isFalse(c is A); Expect.isFalse(a is B); Expect.isTrue(b is B); Expect.isFalse(c is B); Expect.isFalse(a is C); Expect.isFalse(b is C); Expect.isTrue(c is C); Expect.equals('B.foo', b.foo()); }