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

void setup2() {
  JS('', r"""
(function(){
  // This code is inside 'setup' and so not accessible from the global scope.
  function BB(){}
  function CC(){}
  makeA = function(){return new BB()};  // AA is native "BB"
  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);
}
