// 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 'dart:_js_helper';
import 'dart:_foreign_helper' show JS;

import 'native_testing.dart';

// 'I' is the name of an abstract class and the name of the native class.

abstract class I {
  I read();
  write(I x);
}

// Native impl has same name as abstract class.
@Native("I")
class Impl implements I {
  Impl read() native;
  write(I x) native;
}

makeI() => JS('creates:Impl; returns:I;', 'makeI()');

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; };
  self.makeI = function(){return new I()};
  self.nativeConstructor(I);
})()""");
  applyTestExtensions(['I']);
}

// A pure Dart implementation of I.

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

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

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');
}
