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

import "package:expect/expect.dart";

import "implicit_const_context_prefix_constructor_test.dart" as prefix;

// Test that constructor invocations are constant
// when evaluated in a const context.

class C {
  final Object x;
  const C(this.x);

  // Static const.
  static const staticConst = prefix.C(42);
}

// Top-level const.
const topConst = prefix.C(42);

main() {
  const c0 = const prefix.C(42); // Explicit const.

  // RHS of const local variable.
  const c1 = prefix.C(42);

  // Inside const expression.
  var c2 = (const [prefix.C(42)])[0]; // List element.
  var c3 = (const {prefix.C(42): 0}).keys.first; // Map key.
  var c4 = (const {0: prefix.C(42)}).values.first; // Map value.
  var c5 = (const C(prefix.C(42))).x; // Constructor argument.

  Expect.identical(c0, c1);
  Expect.identical(c0, c2);
  Expect.identical(c0, c3);
  Expect.identical(c0, c4);
  Expect.identical(c0, c5);
  Expect.identical(c0, C.staticConst);
  Expect.identical(c0, topConst);

  // Switch case expression.
  switch (c0) {
    case prefix.C(42):
      break;
    default:
      Expect.fail("Didn't match constant");
  }

  // Annotation argument.
  // (Cannot check that it's const, just that it's accepted).
  @C(prefix.C(42))
  var foo = null;
  foo; // avoid "unused" hints.
}
