// Copyright (c) 2012, 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";

@Native("A")
class A {}

@Native("B")
class B implements Comparable {
  noSuchMethod(m) => super.noSuchMethod(m);
}

@Native("C")
class C implements Pattern {
  noSuchMethod(m) => super.noSuchMethod(m);
}

@Native("D")
class D implements Pattern, Comparable {
  noSuchMethod(m) => super.noSuchMethod(m);
}

makeA() native;
makeB() native;
makeC() native;
makeD() native;

void setup() {
  JS('', r"""
(function(){
  function A() {};
  self.makeA = function() { return new A(); };
  function B() {};
  self.makeB = function() { return new B(); };
  function C() {};
  self.makeC = function() { return new C(); };
  function D() {};
  self.makeD = function() { return new D(); };

  self.nativeConstructor(A);
  self.nativeConstructor(B);
  self.nativeConstructor(C);
  self.nativeConstructor(D);
})()""");
  applyTestExtensions(['A', 'B', 'C', 'D']);
}

checkTest(value, expectComparable, expectPattern) {
  Expect.equals(expectComparable, value is Comparable);
  Expect.equals(expectPattern, value is Pattern);
}

checkCast(value, expectComparable, expectPattern) {
  if (expectComparable) {
    Expect.identical(value, value as Comparable);
  } else {
    Expect.throws(() => value as Comparable);
  }
  if (expectPattern) {
    Expect.identical(value, value as Pattern);
  } else {
    Expect.throws(() => value as Pattern);
  }
}

checkAll(check) {
  var things = [
    [],
    4,
    4.2,
    'foo',
    new Object(),
    makeA(),
    makeB(),
    makeC(),
    makeD()
  ];
  value(i) => confuse(things[i]);

  check(value(0), false, false); // List
  check(value(1), true, false); // int
  check(value(2), true, false); // num
  check(value(3), true, true); // String
  check(value(4), false, false); // Object
  check(value(5), false, false); // A
  check(value(6), true, false); // B
  check(value(7), false, true); // C
  check(value(8), true, true); // D
}

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

  checkAll(checkTest);
  checkAll(checkCast);
}
