// 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.

// @dart = 2.7

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());
}
