// 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";
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() native r"""
function B() { }
makeB = function(){return new B;};

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