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

import 'package:expect/expect.dart';

main() {
  test1();
  test2();
  test3();
  test4();
  test5();
  test6();
  test7();
}

/*class: A1:checkedTypeArgument,checks=[],typeArgument*/
class A1<T> {}

/*class: B1:checkedTypeArgument,checks=[$asA1],typeArgument*/
class B1 extends A1<int> {}

@pragma('dart2js:noInline')
test1() {
  Expect.isTrue(_test1(method1a));
  Expect.isTrue(_test1(method1b));
  Expect.isFalse(_test1(method1c));
}

B1 method1a() => null;
A1<int> method1b() => null;
A1<String> method1c() => null;

@pragma('dart2js:noInline')
bool _test1(f) => f is A1<int> Function();

/*strong.class: A2:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A2:checkedTypeArgument,checks=[],typeArgument*/
class A2<T> {}

/*strong.class: B2:checkedInstance,checkedTypeArgument,checks=[$asA2],typeArgument*/
/*omit.class: B2:checkedTypeArgument,checks=[$asA2],typeArgument*/
class B2 extends A2<int> {}

@pragma('dart2js:noInline')
test2() {
  Expect.isFalse(_test2(method2a));
  Expect.isTrue(_test2(method2b));
  Expect.isFalse(_test2(method2c));
}

void method2a(B2 b) {}
void method2b(A2<int> a) {}
void method2c(A2<String> a) {}

@pragma('dart2js:noInline')
bool _test2(f) => f is void Function(A2<int>);

/*strong.class: A3:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A3:checkedTypeArgument,checks=[],typeArgument*/
class A3<T> {}

/*strong.class: B3:checkedInstance,checkedTypeArgument,checks=[$asA3],typeArgument*/
/*omit.class: B3:checkedTypeArgument,checks=[$asA3],typeArgument*/
class B3 extends A3<int> {}

@pragma('dart3js:noInline')
test3() {
  Expect.isTrue(_test3(method3a));
  Expect.isTrue(_test3(method3b));
  Expect.isFalse(_test3(method3c));
}

void method3a(B3 b) {}
void method3b(A3<int> a) {}
void method3c(A3<String> a) {}

@pragma('dart3js:noInline')
_test3(f) => f is void Function(B3);

/*class: A4:checkedTypeArgument,checks=[],typeArgument*/
class A4<T> {}

/*class: B4:checkedTypeArgument,checks=[$asA4],typeArgument*/
class B4 extends A4<int> {}

@pragma('dart4js:noInline')
test4() {
  Expect.isTrue(_test4(method4a));
  Expect.isFalse(_test4(method4b));
  Expect.isFalse(_test4(method4c));
}

B4 method4a() => null;
A4<int> method4b() => null;
A4<String> method4c() => null;

@pragma('dart4js:noInline')
_test4(f) => f is B4 Function();

/*class: A5:checkedTypeArgument,checks=[],typeArgument*/
class A5<T> {}

/*strong.class: B5:checkedTypeArgument,checks=[$asA5],typeArgument*/
/*omit.class: B5:checkedTypeArgument,checks=[$asA5],typeArgument*/
class B5 extends A5<int> {}

@pragma('dart2js:noInline')
test5() {
  Expect.isTrue(_test5(method5a));
  Expect.isTrue(_test5(method5b));
  Expect.isFalse(_test5(method5c));
}

void method5a(void Function(B5) f) => null;
void method5b(void Function(A5<int>) f) => null;
void method5c(void Function(A5<String>) f) => null;

@pragma('dart2js:noInline')
bool _test5(f) => f is void Function(void Function(A5<int>));

/*strong.class: A6:checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A6:checkedTypeArgument,checks=[],typeArgument*/
class A6<T> {}

/*strong.class: B6:checkedTypeArgument,checks=[$asA6],typeArgument*/
/*omit.class: B6:checkedTypeArgument,checks=[$asA6],typeArgument*/
class B6 extends A6<int> {}

@pragma('dart6js:noInline')
test6() {
  Expect.isTrue(_test6(method6a));
  Expect.isTrue(_test6(method6b));
  Expect.isFalse(_test6(method6c));
}

void Function(B6) method6a() => null;
void Function(A6<int>) method6b() => null;
void Function(A6<String>) method6c() => null;

@pragma('dart6js:noInline')
_test6(f) => f is void Function(B6) Function();

/*strong.class: A7:checkedTypeArgument,checks=[],typeArgument*/
/*omit.class: A7:checkedTypeArgument,checks=[],typeArgument*/
class A7<T> {}

/*strong.class: B7:checkedTypeArgument,checks=[$asA7],typeArgument*/
/*omit.class: B7:checkedTypeArgument,checks=[$asA7],typeArgument*/
class B7 extends A7<int> {}

@pragma('dart7js:noInline')
test7() {
  Expect.isTrue(_test7(method7a));
  Expect.isFalse(_test7(method7b));
  Expect.isFalse(_test7(method7c));
}

void method7a(void Function(B7) f) => null;
void method7b(void Function(A7<int>) f) => null;
void method7c(void Function(A7<String>) f) => null;

@pragma('dart7js:noInline')
_test7(f) => f is void Function(void Function(B7));
