/*
 * 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 a constant set literals is created which has the same type
 * argument and contains the same values in the same order, as the value of a
 * previously evaluated constant set literal, then the constant set literal
 * expression instead evaluates to the previously created constant set. That is,
 * constant set literals are canonicalized.
 *
 * @description Check that if a constant set literals is created which has the
 * same type argument and contains the same values in the same order, as the
 * value of a previously evaluated constant set literal, then the constant set
 * literal expression instead evaluates to the previously created constant set
 * @author sgrekhov@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018
import "../../Utils/expect.dart";

main() {
  Expect.isTrue(identical(const <int>{}, const <int>{}));
  Expect.isFalse(identical(<int>{}, <int>{}));
  Expect.isFalse(identical(const <int>{}, <int>{}));

  Expect.isTrue(identical(const <int>{1, 2, 3}, const <int>{1, 2, 3}));
  Expect.isTrue(identical(const <int>{1, 2, 3}, const <int>{1, 2, 2 + 1,}));
  Expect.isTrue(identical(const <int>{1, 2, 3}, const <int>{1, 2, 3, }));
  Expect.isFalse(identical(const <int>{1, 2, 3}, const <int>{2, 3, 1}));

  const s1 = {'1', '2' + '1', "3 - 1", null, !true};
  var s2 = const {'1', '21', "3 - 1", null, false};
  Expect.isTrue(identical(s1, s2));
}
