/*
 * 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 Let e1 … en be the constant element expressions of s in source
 * order, and let v1 … vn be their respective constant values. Evaluation of s
 * creates an unmodifiable object implementing Set<T> with v1 … vn as elements.
 * When iterated, the set provides the values in the source order of the
 * original expressions
 *
 * @description Checks that evaluation of s creates an unmodifiable object
 * implementing Set<T> with v1 … vn as elements
 * @author sgrekhov@unipro.ru
 * @issue 43281
 */
import "../../Utils/expect.dart";

test(expected, actual) {
  Expect.iterableEquals(expected, actual);
  Expect.throws(() {
    (actual as Set).clear();
  });
}

main() {
  var v1 = const {1, 2 + 1, 3 - 1, };
  test({1, 3, 2}, v1);

  const v2 = {1, 2 + 1, 3 - 1, };
  test({1, 3, 2}, v2);

  const v3 = {'1', '2' + '1', "3 - 1", null,};
  test({'1', '21', '3 - 1', null}, v3);

  var v4 = const {'1', '2' + '1', "3 - 1", null};
  test({'1', '21', '3 - 1', null}, v4);
}
