// 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 evaluation of non-constant element expression is
/// performed as expected
/// @author sgrekhov@unipro.ru

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

dynamic getDynamic(dynamic d) => d;

main() {
  var s0 = <int> {};
  Expect.isTrue(s0 is LinkedHashSet<int>);
  LinkedHashSet<int> o0 = new LinkedHashSet<int>();
  Expect.iterableEquals(o0, s0);

  var s1 = <int> {3, 1, 4, null, 1, 4};
  LinkedHashSet<int> o1 = new LinkedHashSet<int>();
  o1.add(3);
  o1.add(1);
  o1.add(4);
  o1.add(null);
  o1.add(1);
  o1.add(4);
  Expect.iterableEquals(o1, s1);

  var s2 = <Object> {'3', 1, 4, null, 1, null,};
  LinkedHashSet<Object> o2 = new LinkedHashSet<Object>();
  o2.add('3');
  o2.add(1);
  o2.add(4);
  o2.add(null);
  o2.add(1);
  o2.add(null);
  Expect.iterableEquals(o2, s2);

  var s3 = {3, 1, 4, null, 1, null, getDynamic(5),};
  LinkedHashSet<dynamic> o3 = new LinkedHashSet<dynamic>();
  o3.add(3);
  o3.add(1);
  o3.add(4);
  o3.add(null);
  o3.add(1);
  o3.add(null);
  o3.add(getDynamic(5));
  Expect.iterableEquals(o3, s3);

  var s4 = {1, 1.0};
  LinkedHashSet<dynamic> o4 = new LinkedHashSet<dynamic>();
  o4.add(1);
  o4.add(1.0);
  Expect.iterableEquals(o4, s4);

  var s5 = {1.0, 1};
  Expect.iterableEquals([1.0], s5);
}
