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

/// @assertion If s does not start with const and it does not occur in a constant
/// context, then it evaluates to a mutable set object as follows:
///
/// Let e1 … en be the constant element expressions of s in source order.
/// Evaluation of s proceeds as follows:
///
/// First evaluate e1 … en, in source order, to values v1 … vn.
/// Create a new LinkedHashSet<T> instance, o.
/// For each i in 1 … n in numeric order, invoke the add method on o with vi as
/// argument. Then s evaluates to an object implementing LinkedHashSet which has
/// the same elements as o, and in the same iteration order. (Iteration order is
/// insertion order, where adding an element equal to one already in the set does
/// not change the set in any way).
///
/// @description Check that if set literal is not constant then it is mutable
/// @author sgrekhov@unipro.ru

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

main() {
  var s1 = <int> {};
  s1.add(1);
  Expect.iterableEquals({1}, s1);
  s1.clear();
  Expect.iterableEquals(<int>{}, s1);

  var s2 = <int> {3, 1, 4};
  s2.add(5);
  Expect.iterableEquals({3, 1, 4, 5}, s2);
  s2.clear();
  Expect.iterableEquals(<int>{}, s2);

  var s3 = {1, 2, 3.14, null, true, 1};
  s3.add("x");
  Expect.iterableEquals({1, 2, 3.14, null, true, "x"}, s3);
  s3.clear();
  Expect.iterableEquals(<Object>{}, s3);
}
