// 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);
}

