/*
 * 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 To infer the type of element:
 * ...
 * If element is a spreadElement with expression e1:
 *
 * If P is ? then let S be the inferred type of e1 in context ?:
 * ...
 * If S is dynamic, then the inferred set element type of element is dynamic,
 * the inferred key type of element is dynamic, and the inferred value type of
 * element is dynamic. (We produce both a set element type here, and a key/value
 * pair here and rely on other elements to disambiguate.)
 *
 * @description Checks that if S is dynamic, then the inferred set element type
 * of element is dynamic, the inferred key type of element is dynamic, and the
 * inferred value type of element is dynamic
 * @author sgrekhov@unipro.ru
 */
import "../../Utils/expect.dart";

void listTest<T>(T t) {
  Set s1 = {...(t as dynamic)};
  Set s2 = {...?(t as dynamic)};
  Expect.isTrue(s1 is Set<dynamic>);
  Expect.isTrue(s2 is Set<dynamic>);
}

void mapTest<T>(T t) {
  Map m1 = {...(t as dynamic)};
  Map m2 = {...?(t as dynamic)};
  Expect.isTrue(m1 is Map<dynamic, dynamic>);
  Expect.isTrue(m2 is Map<dynamic, dynamic>);
}

main() {
  listTest([]);
  listTest([1, 2, 3]);
  mapTest({});
  mapTest({1: 1, 2: 2, 3: 3 });
}
