// 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 that hidden native class names are not used by generated code.

@Native("BB")
class AA {
  get name => 'AA';
  static AA create() => makeA();
}

@Native("CC")
class BB {
  get name => 'BB';
  static BB create() => makeB();
}

class CC {
  // Ordinary class with name clashing with native class.
  get name => 'CC';
  static CC create() => new CC();
}

makeA() native;
makeB() native;

void setup1() {
  JS('', r"""
(function(){
  // Poison hidden native names 'BB' and 'CC' to prove the compiler didn't place
  // anything on the hidden native class.
  BB = null;
  CC = null;
})()""");
  applyTestExtensions(['BB', 'CC']);
}

void setup2() {
  JS('', r"""
(function(){
  // This code is inside 'setup' and so not accessible from the global scope.
  function BB(){}
  function CC(){}
  self.makeA = function(){return new BB()};  // AA is native "BB"
  self.makeB = function(){return new CC()};  // BB is native "CC"
  self.nativeConstructor(BB);
  self.nativeConstructor(CC);
})()""");
}

main() {
  nativeTesting();
  setup1();
  setup2();

  var a = confuse(AA.create());
  var b = confuse(BB.create());
  var c = confuse(CC.create());

  Expect.equals('AA', a.name);
  Expect.equals('BB', b.name);
  Expect.equals('CC', c.name);
}
