// 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());
  Expect.runtimeIsType<C Function()>(v1);

  var v2 = C<dynamic, num, String>.constr1;
  Expect.isTrue(v2 is C Function(dynamic, num));
  Expect.runtimeIsType<C Function(dynamic, num)>(v2);

  var v3 = C<List<int>, int, String>.constr;
  Expect.isTrue(v3 is C Function());
  Expect.runtimeIsType<C Function()>(v3);

  var v4 = C<List<int>, int, String>.constr1;
  Expect.isTrue(v4 is C Function(List<int>, int));
  Expect.runtimeIsType<C Function(List<int>, int)>(v4);
}
