/*
 * 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, dynamic);
  (new C<FutureOr, dynamic, dynamic>()).check(dynamic, dynamic, dynamic);
}

