/*
 * 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.
 */
/**
 * @assertion A generic class declaration introduces a generic class into the 
 * enclosing library scope. A generic class is a mapping that accepts a list of
 * actual type arguments and maps them to a class. Consider a generic class
 * declaration [G] named [C] with formal type parameter declarations [X1 extends
 * B1,..., Xm extends Bm], and a parameterized type [T] of the form
 * [C<T1,..., Tl>].
 * Otherwise, said parameterized type [C<T1,..., Tm>] denotes an application of
 * the generic class declared by [G] to the type arguments [T1],...,[Tm]. This
 * yields a class [C0] whose members are equivalent to those of a class
 * declaration which is obtained from the declaration [G] by replacing each
 * occurrence of [Xj] by [Tj].
 * @description Checks that each occurrence of [Xj] is replaced by [Tj] for
 * generic class [C0] with several parameters.
 * @author iarkh@unipro.ru
 */
import "dart:async";
import "../../Utils/expect.dart";

class A<X extends A<X>> {}

class C<T1, T2, T3> {
  check(exp1, exp2, exp3) {
    Expect.equals(exp1, T1);
    Expect.equals(exp2, T2);
    Expect.equals(exp3, T3);
  }
}

main() {
  (new C<int, int, int>()).check(int, int, int);
  (new C<List, dynamic, String>()).check(List, dynamic, String);
  (new C<String, Null, Null>()).check(String, Null, Null);
  (new C<C, C, C>()).check(C, C, C);
  (new C<A, C, C>()).check(A, C, C);
  (new C<dynamic, dynamic, dynamic>()).check(dynamic, dynamic, dynamic);
  (new C<Null, Null, Null>()).check(Null, Null, Null);
  (new C<Object, List, FutureOr>()).check(Object, List, FutureOr);
  (new C<FutureOr, dynamic, dynamic>()).check(FutureOr, dynamic, dynamic);
}

