// Copyright (c) 2021, 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 When tearing off a constructor of a generic class using
/// [C<typeArgs>.name, the torn off method is always instantiated to the
/// provided type arguments (which must be valid type arguments for the
/// class/corresponding function). It otherwise behaves as an implicitly
/// instantiated function tear-off.
///
/// @description Checks that type arguments correctly instantiated for
/// [C<typeArgs>.name.
/// @author iarkh@unipro.ru

// SharedOptions=--enable-experiment=constructor-tearoffs

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

class C<T1, T2 extends num, T3 extends String> {
  C.constr() {}
  C.constr1(T1 t, T2 t2) {}
}

main() {
  var v1 = C<dynamic, num, String>.constr;
  Expect.isTrue(v1 is
    C Function<T1 extends dynamic, T2 extends num, T3 extends String>());

  var v2 = C<dynamic, num, String>.constr1;
  Expect.isTrue(v2 is C Function<T1 extends dynamic,
      T2 extends num,
      T3 extends String>(dynamic, num));

  var v3 = C<List<int>, int, String>.constr;
  Expect.isTrue(v3 is
    C Function<T1 extends List<int>, T2 extends int, T3 extends String>());

  var v4 = C<List<int>, int, String>.constr1;
  Expect.isTrue(v3 is C Function<T1 extends List<int>,
      T2 extends int,
      T3 extends String>(List<int>, int));
}
