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

/// @assertion It is a compile-time error if any of the values of the constant
/// element expressions override Object.operator== unless they are instances of
/// int or String, objects implementing Symbol originally created by a symbol
/// literal or a constant invocation of the Symbol constructor, or objects
/// implementing Type originally created by a constant type literal expression.
/// It is a compile-time error if any two of the values are equal according to ==
///
/// @description Checks that it is no compile-time error if all values of the
/// constant element expressions are instances of int or String, objects
/// implementing Symbol originally created by a symbol literal or a constant
/// invocation of the Symbol constructor, or objects implementing Type originally
/// created by a constant type literal expression
/// @author sgrekhov@unipro.ru
/// @issue 43281

import "../../Utils/expect.dart";

class C {}

main() {
  var v1 = const {1, 2, 3, null};
  Expect.iterableEquals({1, 2, 3, null}, v1);

  var v2 = const <int> {1, 2, 3};
  Expect.iterableEquals({1, 2, 3}, v2);

  var v3 = const <int> {};
  Expect.iterableEquals({}, v3);

  const v4 = <int> {1, 2, 3, };
  Expect.iterableEquals({1, 2, 3}, v4);

  var v5 = const {'1', '2', '3', '4', null};
  Expect.iterableEquals({'1', '2', '3', '4', null}, v5);

  var v6 = const <String> {'1', '2', '3', '4'};
  Expect.iterableEquals({'1', '2', '3', '4'}, v6);

  var v7 = const <String> {};
  Expect.iterableEquals({}, v7);

  const v8 = <String> {'1', '2', '3', '4',};
  Expect.iterableEquals({'1', '2', '3', '4'}, v8);

  var v9 = const {const Symbol('foo'), const Symbol('bar'), null};
  Expect.iterableEquals({const Symbol('foo'), const Symbol('bar'), null}, v9);

  var v10 = const <Symbol>{const Symbol('foo'), const Symbol('bar')};
  Expect.iterableEquals({const Symbol('foo'), const Symbol('bar')}, v10);

  var v11 = const <Symbol> {};
  Expect.iterableEquals({}, v11);

  const v12 =  <Symbol>{const Symbol('foo'), const Symbol('bar'), };
  Expect.iterableEquals({const Symbol('foo'), const Symbol('bar')}, v12);

  var v13 = const {#==, #foo, #C};
  Expect.iterableEquals({#==, #foo, #C}, v13);

  var v14 = const <Symbol>{#==, #foo, #C};
  Expect.iterableEquals({#==, #foo, #C}, v14);

  const v15 = <Symbol>{#==, #foo, #C,};
  Expect.iterableEquals({#==, #foo, #C}, v15);

  var v16 = const {int, num, String,};
  Expect.iterableEquals({int, num, String}, v16);

  var v17 = const <Type?>{int, num, String, null};
  Expect.iterableEquals({int, num, String, null}, v17);

  const v18 = {int, num, String};
  Expect.iterableEquals({int, num, String}, v18);
}
