/*
 * 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 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);
}
