// 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  For set literals with element type T, the static type is always
/// Set<T>, but static analysis will reject an assignment of a non-constant set
/// literal to a type that is not a super-type of LinkedHashSet<T> (an implicit
/// down-cast below the type LinkedHashSet<T>), and of a constant set literal to
/// a type that is not a super-type of Set<T> (that is, any implicit down-cast).
///
/// @description Check runtime type of set literals expressions
/// @author sgrekhov@unipro.ru

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

// Class overriding `==`.
class C {
  final int id;
  final String name;
  C(this.id, this.name);
  int get hashCode => id;
  bool operator==(Object other) => other is C && id == other.id;
  String toString() => "C($id, $name)";
}

main() {
  Expect.isTrue({} is LinkedHashMap<dynamic, dynamic>);
  Expect.isTrue(<int, int>{} is LinkedHashMap<int, int>);
  Expect.isTrue(<int>{} is LinkedHashSet<int>);
  Expect.isTrue({1: 1} is LinkedHashMap<int, int>);
  Expect.isTrue({1} is LinkedHashSet<int>);

  Iterable<int> v6 = {};
  Expect.isTrue(v6 is LinkedHashSet<int>);
  Map<int, int> v7 = {};
  Expect.isTrue(v7 is LinkedHashMap<int, int>);
  Object v8 = {};
  Expect.isTrue(v8 is LinkedHashMap<dynamic, dynamic>);
  Iterable<num> v9 = {1};
  Expect.isTrue(v9 is LinkedHashSet<num>);
  Iterable<num> v10 = <int>{};
  Expect.isTrue(v10 is LinkedHashSet<int>);
  Set<int> v11 = {};
  Expect.isTrue(v11 is LinkedHashSet<int>);

  const v12 = {};
  Expect.isTrue(v12 is Map<dynamic, dynamic>);
  const v13 = {1};
  Expect.isTrue(v13 is Set<int>);
  const Set v14  = {} ;
  Expect.isTrue(v14 is Set<dynamic>);
  Set v15 = const {4};
  Expect.isTrue(v15 is Set<dynamic>);

  var v16 = {1, 2, 3, 2, 1};
  Expect.isTrue(v16 is LinkedHashSet<int>);
  var l18 = const {1, 2};
  Expect.isTrue(l18 is Set<int>);

  var v19 = {C(1, "a"), C(2, "a"), C(1, "b")};
  Expect.isTrue(v19 is LinkedHashSet<C>);

  var v23 = {1, 2.5};
  Expect.isTrue(v23 is LinkedHashSet<num>);
  var v24 = {1, false};
  Expect.isTrue(v24 is LinkedHashSet<Object>);
  const v26  = {1, false};
  Expect.isTrue(v26 is Set<Object>);
}
