// Copyright (c) 2018, 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

// dart2jsOptions=--strong

@JS()
library foo;

import 'package:expect/expect.dart';
import 'package:js/js.dart';

@JS()
@anonymous
class A<T> {
  external factory A();
}

class B<T> {}

@JS()
@anonymous
class C implements B<int> {
  external factory C();
}

class D<T> {}

@JS()
@anonymous
class E implements B<String> {
  external factory E();
}

main() {
  test(new A<int>());
  test(new A<String>());
  test(new C());
  test(new E());
}

test(o) {
  Expect.isTrue(o is A<int>, "Expected $o to be A<int>");
  Expect.isTrue(o is A<String>, "Expected $o to be A<String>");

  Expect.isTrue(o is B<int>, "Expected $o to be B<int>");
  Expect.isTrue(o is B<String>, "Expected $o to be B<String>");

  Expect.isFalse(o is D<int>, "Expected $o not to be D<int>");
}
