// 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 plain classes can access methods defined only by // the same mixin. class D extends Object with M1, M2, M3 {} class E extends D { foo() => 'E.foo'; } class M1 {} class M2 { foo() => 'M2.foo'; } class M3 {} @Native("A") class A { foo() => 'A.foo'; } @Native("B") class B extends A with M1, M2, M3 {} @Native("C") class C extends B { foo() => 'C.foo'; } makeA() native; makeB() native; makeC() native; void setup() { JS('', r""" (function(){ function A() {} function B() {} function C() {} self.makeA = function(){return new A()}; self.makeB = function(){return new B()}; self.makeC = function(){return new C()}; self.nativeConstructor(A); self.nativeConstructor(B); self.nativeConstructor(C); })()"""); applyTestExtensions(['A', 'B', 'C']); } var g; callFoo(x) { // Dominating getInterceptor call should be shared. g = x.toString(); // These call sites are partitioned into pure-dart and native subsets, // allowing differences in getInterceptors. if (x is D) return x.foo(); if (x is A) return x.foo(); } makeAll() => [makeA(), makeB(), makeC(), new D(), new E()]; main() { nativeTesting(); setup(); /* var a = makeA(); var b = makeB(); var c = makeC(); var d = new D(); var e = new E(); */ var x = makeAll(); var a = x[0]; var b = x[1]; var c = x[2]; var d = x[3]; var e = x[4]; var f = callFoo; Expect.equals('A.foo', f(a)); Expect.equals('M2.foo', f(b)); Expect.equals('C.foo', f(c)); Expect.equals('M2.foo', f(d)); Expect.equals('E.foo', f(e)); }