// 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 The static type of the named constructor tear-off expression is
/// the same as the static type of the corresponding constructor function
/// tear-off.
///
/// @description Checks that the static types of the constructor tear off
/// expressions are the same - test generic class with default type arguments
/// @author iarkh@unipro.ru

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

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

class C<T> {
  T? i;
  T? j;

  C();
  C.constr1(T i) {}
  C.constr2(int i, String s, x) {}
  C.constr3({int i = 1, required T j}) {}
  C.constr4(this.i, this.j);
}

main() {
  var v1 = C.new;
  var v2 = (C.new);
  Expect.equals(v1, v2);
  Expect.identical(v1, v2);

  var v3 = C.constr1;
  var v4 = (C.constr1);
  Expect.equals(v3, v4);
  Expect.identical(v3, v4);

  var v5 = C.constr2;
  var v6 = (C.constr2);
  Expect.equals(v5, v6);
  Expect.identical(v5, v6);

  var v7 = C.constr3;
  var v8 = (C.constr3);
  Expect.equals(v7, v8);
  Expect.identical(v7, v8);

  var v9 = C.constr4;
  var v10 = (C.constr4);
  Expect.equals(v9, v10);
  Expect.identical(v9, v10);
}
