// Copyright (c) 2011, 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 to see if resolving a hidden native class's method interferes with
// subsequent resolving the subclass's method.  This might happen if the
// superclass caches the method in the prototype, so shadowing the dispatcher
// stored on Object.prototype.

@Native("A")
class A {
  foo() => 'A.foo ${bar()}';
  bar() => 'A.bar';
}

@Native("B")
class B extends A {
  bar() => 'B.bar';
}

@Native("C")
class C extends B {
  foo() => 'C.foo; super.foo = ${super.foo()}';
  bar() => 'C.bar';
}

@Native("D")
class D extends C {
  bar() => 'D.bar';
}

makeA() native;
makeB() native;
makeC() native;
makeD() native;

void setup() {
  JS('', r"""
(function(){
  // This code is inside 'setup' and so not accessible from the global scope.
  function inherits(child, parent) {
    if (child.prototype.__proto__) {
      child.prototype.__proto__ = parent.prototype;
    } else {
      function tmp() {};
      tmp.prototype = parent.prototype;
      child.prototype = new tmp();
      child.prototype.constructor = child;
    }
  }

  function A(){}
  function B(){}
  inherits(B, A);
  function C(){}
  inherits(C, B);
  function D(){}
  inherits(D, C);

  self.makeA = function(){return new A()};
  self.makeB = function(){return new B()};
  self.makeC = function(){return new C()};
  self.makeD = function(){return new D()};

  self.nativeConstructor(A);
  self.nativeConstructor(B);
  self.nativeConstructor(C);
  self.nativeConstructor(D);
})()""");
  applyTestExtensions(['A', 'B', 'C', 'D']);
}

main() {
  nativeTesting();
  setup();

  var a = makeA();
  var b = makeB();
  var c = makeC();
  var d = makeD();

  Expect.equals('A.foo A.bar', a.foo());
  Expect.equals('A.foo B.bar', b.foo());
  Expect.equals('C.foo; super.foo = A.foo C.bar', c.foo());
  Expect.equals('C.foo; super.foo = A.foo D.bar', d.foo());
}
