// Copyright (c) 2019, 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 From the Unified collections Spec:
/// We require that at least one component unambiguously determine the literal
/// form, otherwise it is a compile-time error. So, given:
///    dynamic x = <int, int>{};
///    Iterable l = [];
///    Map m = {};
///    Then:
///    {...x}       // Static error, because it is ambiguous.
///    {...x, ...l} // Statically a set, runtime error when spreading x.
///    {...x, ...m} // Statically a map, no runtime error.
///    {...l, ...m} // Static error, because it must be both a set and a map.
/// @description Checks some dynamic cases of the type inference
/// @author iarkh@unipro.ru


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

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

main() {
  dynamic set1 = <int>{};
  dynamic set2 = <int>{};
  dynamic map1 = <int, int>{};
  dynamic map2 = <int, int>{};

  Map res;
  Expect.throws(() =>  res = {...?map1, ...set1});
  Expect.throws(() =>  res = {...set1, ...?map1});

  Expect.throws(() =>  res = {...map1, ...?set1});
  Expect.throws(() =>  res = {...?set1, ...map1});

  Expect.throws(() =>  res = {...?map1, ...?set1});
  Expect.throws(() =>  res = {...?set1, ...?map1});

  Expect.throws(() =>  res = {...?set1, ...set2});
  Expect.throws(() =>  res = {...set1, ...?set2});
  Expect.throws(() =>  res = {...?set1, ...?set2});

  Map res1 = {...?map1, ...map2};
  Map res2 = {...map1, ...?map2};
  Map res3 = {...?map1, ...?map2};
}
