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

// Test for correct hidden native class when abstract class has same name.

library main;

import 'native_testing.dart';
import 'native_library_same_name_used_lib1.dart';

void setup() {
  JS('', r"""
(function(){
  // This code is all inside 'setup' and so not accessible from the global
  // scope.
  function I(){}
  I.prototype.read = function() { return this._x; };
  I.prototype.write = function(x) { this._x = x; };
  makeI = function(){return new I()};
  self.nativeConstructor(I);
})()""");
}

// A pure Dart implementation of I.

class ProxyI implements I {
  ProxyI b;
  ProxyI read() {
    return b;
  }

  write(ProxyI x) {
    b = x;
  }
}

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

  var a1 = makeI();
  var a2 = makeI();
  var b1 = new ProxyI();
  var b2 = new ProxyI();
  var ob = new Object();

  Expect.isFalse(ob is I, 'ob is I');
  Expect.isFalse(ob is ProxyI, 'ob is ProxyI');

  Expect.isTrue(b1 is I, 'b1 is I');
  Expect.isTrue(b1 is ProxyI, 'b1 is ProxyI');

  Expect.isTrue(a1 is I, 'a1 is I');
  Expect.isFalse(a1 is ProxyI, 'a1 is ProxyI');

  Expect.isTrue(confuse(a1) is I, 'a1 is I');
  Expect.isFalse(confuse(a1) is ProxyI, 'a1 is ProxyI');
}
