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

/// @assertion A type T is more specific than a type S, written T << S, if one
/// of the following conditions is met:
///  • T is S.
///  • T is ⊥
///  • S is dynamic.
///  • S is a direct supertype of T.
///  • T is a type parameter and S is the upper bound of T.
///  • T is a type parameter and S is Object.
///  • T is of the form I<T1, ..., Tn > and S is of the form I <S1, ..., Sn>
///    and Ti << Si 1 <= i <= n.
///  • T and S are both function types, and T << S under the rules of section
///    (Types/Function Types).
///  • T is a function type and S is Function.
///  • T << U and U << S.
/// << is a partial order on types. T is a subtype of S, written T <: S, iff
/// [⊥/Dynamic]T << S.
/// . . .
/// An interface type T may be assigned to a type S, written T <=> S, if either
/// T <: S or S <: T.
/// @description Checks that function type T is a subtype of itself and
/// T is assignable to itself.
/// @author iefremov

import "../../../Utils/expect.dart";

typedef void t1();
typedef num t2();
typedef t3();
typedef t4(var x);
typedef int t5(var x);
typedef String t6(var x, int y);
typedef t1? t7(t2 x, t3 y);
typedef t7? t8(t7 x, [t7? y]);
typedef void t9([var x]);
typedef int t10([int? x]);
typedef List t11(int x, int y, List z, Map<String, Object> m);
typedef List t12(int x, [int? y, List? z, Map<String, Object>? m]);
typedef List<Map<int, List<List<int>>>>
        t13(int x, var v, [int? y, List? z, Map<String, List<int>>? m]);
typedef t13? t14(t13 a, [t13? b]);

void f1() {}
num f2() => 42;
f3() {}
f4(var x) {}
int f5(var x) => 42;
String f6(var x, int y) => "Lily was here";
t1? f7(t2 x, t3 y) {}
t7? f8(t7 x, [t7? y]) {}
void f9([var x]) {}
int f10([int? x]) => 0;
List f11(int x, int y, List z, Map<String, Object> m) => [];
List f12(int x, [int? y, List? z, Map<String, Object>? m]) => [];
List<Map<int, List<List<int>>>> f13(int x, var v, [int? y, List? z, Map<String, List<int>>? m]) => [];
t13? f14(t13 a, [t13? b]) {}

class Checker<T> {
  Checker() {}

  check(T x) {
    Expect.isTrue(x is T);
    Expect.runtimeIsType<T>(x);
    T t = x;
    check2(x);
  }

  check2(dynamic x) {
    T t = x;
  }
}

main() {
  new Checker<t1>().check(f1);
  new Checker<t2>().check(f2);
  new Checker<t3>().check(f3);
  new Checker<t4>().check(f4);
  new Checker<t5>().check(f5);
  new Checker<t6>().check(f6);
  new Checker<t7>().check(f7);
  new Checker<t8>().check(f8);
  new Checker<t9>().check(f9);
  new Checker<t10>().check(f10);
  new Checker<t11>().check(f11);
  new Checker<t12>().check(f12);
  new Checker<t13>().check(f13);
  new Checker<t14>().check(f14);
}
