// 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 has no typeArgument, then one is inferred in exactly the same
/// way as for list literals. (Either infer it from the context type, or if there
/// is no context type, or the context type does not constrain the element type,
/// then do upwards inference based on the static type of the element
/// expressions, if any, or otherwise fall back on dynamic).
///
/// @description Checks that if s has no typeArgument, then one is inferred in
/// exactly the same way as for list literals
/// @author sgrekhov@unipro.ru
/// @issue 43281

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

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

  const v2 = {1, 2, 3};
  Expect.isTrue(v2 is Set<int>);

  var v3 = {1, 2, 3};
  Expect.isTrue(v3 is Set<int>);

  var v4 = const {'1', '2', '3'};
  Expect.isTrue(v4 is Set<String>);

  const v5 = {'1', '2', '3'};
  Expect.isTrue(v5 is Set<String>);

  var v6 = {'1', '2', '3'};
  Expect.isTrue(v6 is Set<String>);

  var v7 = const {'1', 2, '3', null};
  Expect.isTrue(v7 is Set<Object?>);

  const v8 = {'1', 2, '3', null};
  Expect.isTrue(v8 is Set<Object?>);

  var v9 = {'1', 2, '3', null};
  Expect.isTrue(v9 is Set<Object?>);

  dynamic d;

  var v10 = {'1', 2, '3', null, d};
  Expect.isTrue(v10 is Set<dynamic>);

  var v11  = {1, 2, 3.14};
  Expect.isTrue(v11 is Set<num>);

  var v12  = {1, 1.0};
  Expect.isTrue(v12 is Set<num>);
}
