// Copyright (c) 2018, 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.

// @dart = 2.9

import "package:expect/expect.dart";

// Test that an omitted `new` is allowed for a generic constructor invocation.

class C<T> {
  final T x;
  C(this.x); // Not const constructor.
  const C.c(this.x); // Const constructor.

  operator <(other) => this;
  operator >(other) => other;
  operator -() => this;

  C<T> get self => this;
  C<T> method() => self;
}

T id<T>(T x) => x;

main() {
  const cc = const C<int>.c(42); // Canonicalized.

  var c0 = new C<int>(42); // Original syntax.

  // Uses of `C<int>(42)` in various contexts.
  var c1 = C<int>(42);
  var c2 = [C<int>(42)][0];
  var c3 = {C<int>(42): 0}.keys.first;
  var c4 = {0: C<int>(42)}.values.first;
  var c5 = id(C<int>(42));
  var c6 = C<int>(42).self;
  var c7 = C<int>(42).method();
  var c8 = C(C<int>(42)).x;
  var c9 = -C<int>(42);
  var c10 = C<int>(42) < 9;
  var c11 = C(null) > C<int>(42);
  var c12 = (c10 == c11) ? null : C<int>(42);
  var c13 = C<int>(42)..method();
  var c14;
  try {
    throw C<int>(42);
  } catch (e) {
    c14 = e;
  }

  switch (C<int>(42)) {
    case cc:
      Expect.fail("Should not be const");
      break;
    default:
    // Success.
  }

  for (C<int>(42); false; C<int>(42), C<int>(42)) {
    Expect.fail("Unreachable");
  }

  var values = [
    cc,
    c0,
    c1,
    c2,
    c3,
    c4,
    c5,
    c6,
    c7,
    c8,
    c9,
    c10,
    c11,
    c12,
    c13,
    c14
  ];
  Expect.allDistinct(values); // Non of them create constants.
  for (var value in values) {
    Expect.isTrue(value is C<int>);
    Expect.equals(42, (value as C<int>).x);
  }
}
