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

// dart2jsOptions=--strong

@JS()
library foo;

/*class: global#JavaScriptObject:checks=[$asA,$isA]*/

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

/*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
@JS()
@anonymous
class A<T> {
  external factory A();
}

/*class: Class1:checks=[],instance*/
class Class1<T> {
  method() {
    // This caused and assertion failure in codegen.
    test1(new List<A<T>>.from([]));
  }
}

/*class: Class2:checks=[],instance*/
class Class2<T> {
  method() {
    // This caused and assertion failure in codegen.
    test2(new List<A<T> Function()>.from([]));
  }
}

main() {
  new Class1<int>().method();
  new Class1<String>().method();
  new Class2<int>().method();
  new Class2<String>().method();
}

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

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