// 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

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

  const v5 = C.constr2;
  const v6 = (C.constr2);
  Expect.equals(v5, v6);
  const CheckIdentical(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);
}
