| // 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() {} | 
 |   makeA = function(){return new A()}; | 
 |   makeB = function(){return new B()}; | 
 |   makeC = function(){return new C()}; | 
 |  | 
 |   self.nativeConstructor(A); | 
 |   self.nativeConstructor(B); | 
 |   self.nativeConstructor(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)); | 
 | } |