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