// 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 and ordinary Dart classes can both use the same // ordinary Dart classes as a mixin. @Native("A") class A { String get aa native; foo() => "A-foo $aa"; baz() => "A-baz $aa"; } @Native("B") class B extends A with M { bar() => 'B-bar -> ${baz()}'; get mm => 'B.mm($aa)'; } class M { foo() => "M-foo ${this.mm}"; bar() => "M-bar ${this.mm}"; get mm => 'M.mm'; } class C { final String cc = 'cc'; foo() => 'C-foo $cc'; baz() => 'C-baz $cc'; } class D extends C with M { bar() => 'D-bar -> ${baz()}'; get mm => 'D.mm($cc)'; } makeA() native; makeB() native; void setup() { JS('', r""" (function(){ function A() {this.aa = 'aa'} function B() {this.aa = 'bb'} 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 things = [makeA, makeB, () => new C(), () => new D(), () => new M()] .map((f) => f()) .toList(); var a = things[0]; var b = things[1]; var c = things[2]; var d = things[3]; var m = things[4]; Expect.equals("M-foo M.mm", m.foo()); Expect.equals("M-bar M.mm", m.bar()); Expect.throws(() => m.baz(), (error) => error is NoSuchMethodError); Expect.isFalse(m is A); Expect.isFalse(m is B); Expect.isFalse(m is C); Expect.isFalse(m is D); Expect.isTrue(m is M); Expect.equals("A-foo aa", a.foo()); Expect.throws(() => a.bar(), (error) => error is NoSuchMethodError); Expect.equals("A-baz aa", a.baz()); Expect.isTrue(a is A); Expect.isFalse(a is B); Expect.isFalse(a is C); Expect.isFalse(a is D); Expect.isFalse(a is M); Expect.equals("M-foo B.mm(bb)", b.foo()); Expect.equals("B-bar -> A-baz bb", b.bar()); Expect.equals("A-baz bb", b.baz()); Expect.isTrue(b is A); Expect.isTrue(b is B); Expect.isFalse(b is C); Expect.isFalse(b is D); Expect.isTrue(b is M); Expect.equals("C-foo cc", c.foo()); Expect.throws(() => c.bar(), (error) => error is NoSuchMethodError); Expect.equals("C-baz cc", c.baz()); Expect.isFalse(c is A); Expect.isFalse(c is B); Expect.isTrue(c is C); Expect.isFalse(c is D); Expect.isFalse(c is M); Expect.equals("M-foo D.mm(cc)", d.foo()); Expect.equals("D-bar -> C-baz cc", d.bar()); Expect.equals("C-baz cc", d.baz()); Expect.isFalse(d is A); Expect.isFalse(d is B); Expect.isTrue(d is C); Expect.isTrue(d is D); Expect.isTrue(d is M); }