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

import "implicit_new_prefix_constructor_named_test.dart" as prefix;

// Test that an omitted `new` is allowed for a non-generic class.

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

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

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

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

main() {
  const cc = const C.c(42); // Canonicalized.
  var x = 42; // Avoid constant parameter.
  var c0 = new prefix.C.c(x); // Original syntax.

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

  switch (prefix.C.c(x)) {
    case cc:
      Expect.fail("Should not be const");
      break;
    default:
    // Success.
  }

  for (prefix.C.c(x); false; prefix.C.c(x), prefix.C.c(x)) {
    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);
    Expect.equals(42, (value as C).x);
  }
}
