// 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. import "native_testing.dart"; // Test that native classes can use ordinary Dart classes as mixins. @Native("A") class A { foo() => "A-foo"; baz() => "A-baz"; } @Native("B") class B extends A with M1, M2 { bar() => baz(); } class M1 { foo() => "M1-foo"; baz() => "M1-baz"; } class M2 { foo() => "M2-foo"; } A makeA() native; B makeB() native; void setup() { JS('', r""" (function(){ function A() {} function B() {} self.makeA = function(){return new A()}; self.makeB = function(){return new B()}; self.nativeConstructor(A); self.nativeConstructor(B); })()"""); applyTestExtensions(['A', 'B']); } main() { nativeTesting(); setup(); A a = makeA(); Expect.equals("A-foo", a.foo()); Expect.throws( () => (a as dynamic).bar(), (error) => error is NoSuchMethodError); Expect.equals("A-baz", a.baz()); Expect.isTrue(a is A); Expect.isFalse(a is B); Expect.isFalse(a is M1); Expect.isFalse(a is M2); B b = makeB(); Expect.equals("M2-foo", b.foo()); Expect.equals("M1-baz", b.bar()); Expect.equals("M1-baz", b.baz()); Expect.isTrue(b is A); Expect.isTrue(b is B); Expect.isTrue(b is M1); Expect.isTrue(b is M2); M1 m1 = new M1(); Expect.equals("M1-foo", m1.foo()); Expect.throws( () => (m1 as dynamic).bar(), (error) => error is NoSuchMethodError); Expect.equals("M1-baz", m1.baz()); Expect.isFalse(m1 is A); Expect.isFalse(m1 is B); Expect.isTrue(m1 is M1); Expect.isFalse(m1 is M2); M2 m2 = new M2(); Expect.equals("M2-foo", m2.foo()); Expect.throws( () => (m2 as dynamic).bar(), (error) => error is NoSuchMethodError); Expect.throws( () => (m2 as dynamic).baz(), (error) => error is NoSuchMethodError); Expect.isFalse(m2 is A); Expect.isFalse(m2 is B); Expect.isFalse(m2 is M1); Expect.isTrue(m2 is M2); }