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

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.
  self.BB = null;
  self.CC = null;
})()""");
}

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);
})()""");
  applyTestExtensions(['BB', '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);
}
