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