// 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 "dart:collection" show HashSet, LinkedHashSet;

import "package:expect/expect.dart";

const Object d = 3.5;

void main() {
   var o //
      = <int>{1: 1} //# 01: compile-time error
      = <int, int, int>{} //# 02: compile-time error
      = <int, int, int>{1} //# 03: compile-time error
      = <int, int>{1} //# 04: compile-time error
      = const <int, int, int>{} //# 05: compile-time error
      = const <int, int, int>{1} //# 06: compile-time error
      = const <int, int>{1} //# 07: compile-time error
      = const {Duration(seconds: 0)} // Overrides ==. //# 08: compile-time error
      = const {4.2} // Overrides ==. //# 09: compile-time error
      = const {d} // Overrides ==. //# 10: compile-time error
      = {,} //# 11: syntax error
      = {1,,} //# 12: syntax error
      = {1,,1} //# 13: syntax error
      ;
  Expect.isNull(o); // Should be unreachable with a value.

  Set<int> s //
      = {"not int"} //# 14: compile-time error
      = {4.2} //# 15: compile-time error
      = {1: 1} //# 16: compile-time error
      = {{}} //# 17: compile-time error
      ;
  Expect.isNull(s);

  Set<Set<Object>> ss //
      = {{1: 1}} //# 19: compile-time error
      = {<int, int>{}} //# 20: compile-time error
      = {<int>{1: 1}} //# 21: compile-time error
      = const {ss} //# 22: compile-time error
      ;
  Expect.isNull(ss);

  HashSet<int> hs //
      = {} // Exact type is LinkedHashSet //# 23: compile-time error
      ;
  Expect.isNull(hs);

  <T>(x) {
    // Type constants are allowed, type variables are not.
    var o //
        = const {T} //# 26: compile-time error
        = const {x} //# 27: compile-time error
        ;
    Expect.isNull(o);
  }<int>(42);

  <T extends Set<num>>() {
    // Regression test for http://dartbug.com/35300.
    // The `Set<Null>` type is not assignable to `T extends Set<num>`,
    // so we don't make this a set. You can't assign a map to `T`.
    T o //
    = {}; //# 28: compile-time error
    ;
  }();

  // Constant sets must not contain equal elements.
  const cs = {
    1,
    "s",
    #foo,
    int,
    C(1),
    {1},
    1, //# 29: compile-time error
    "s", //# 30: compile-time error
    #foo, //# 31: compile-time error
    int, //# 32: compile-time error
    C(1), //# 33: compile-time error
    {1}, //# 34: compile-time error
  };
}

class C {
  final Object id;
  const C(this.id);
}
