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

// @dart = 2.7

import "native_testing.dart";
import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
import 'dart:_interceptors'
    show findInterceptorForType, findConstructorForNativeSubclassType;

// Test for shadowed fields in classes that extend native classes.

@Native("N")
class N {
  N.init();
}

class A extends N {
  var foo = 111;
  A.init() : super.init();
}

class B extends A {
  var foo = 222;
  B.init() : super.init();

  Afoo() => super.foo;
  Bfoo() => foo;
}

B makeB() native;

@Creates('=Object')
getBPrototype() native;

void setup() {
  JS('', r"""
(function(){
function B() { }
self.makeB = function(){return new B()};

self.getBPrototype = function(){return B.prototype;};
})()""");
}

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

  setNativeSubclassDispatchRecord(getBPrototype(), findInterceptorForType(B));

  B b = makeB();

  var constructor = findConstructorForNativeSubclassType(B, 'init');
  Expect.isNotNull(constructor);
  JS('', '#(#)', constructor, b);

  print(b);

  Expect.equals(222, confuse(b).Bfoo());
  Expect.equals(111, confuse(b).Afoo());

  Expect.equals(222, b.Bfoo());
  Expect.equals(111, b.Afoo());
}
