// 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';

// Test to see runtimeType works on native classes and does not use the native
// constructor name.

@Native("TAGX")
class A {}

@Native("TAGY")
class B extends A {}

makeA() native;
makeB() native;

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

  function TAGX(){}
  function TAGY(){}
  inherits(TAGY, TAGX);

  self.makeA = function(){return new TAGX()};
  self.makeB = function(){return new TAGY()};

  self.nativeConstructor(TAGX);
  self.nativeConstructor(TAGY);
})()""");
  applyTestExtensions(['TAGX', 'TAGY']);
}

testDynamicContext() {
  var a = makeA();
  var b = makeB();

  var aT = a.runtimeType;
  var bT = b.runtimeType;

  Expect.notEquals('TAGX', '$aT');
  Expect.notEquals('TAGY', '$bT');
}

testStaticContext() {
  var a = JS('A', '#', makeA()); // Force compiler to know type.
  var b = JS('B', '#', makeB());

  var aT = a.runtimeType;
  var bT = b.runtimeType;

  Expect.notEquals('TAGX', '$aT');
  Expect.notEquals('TAGY', '$bT');
}

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

  testDynamicContext();
  testStaticContext();
}
