// 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.

// SharedOptions=--enable-experiment=control-flow-collections,spread-collections

// Test cases where the syntax is ambiguous between maps and sets because of
// spreads inside control flow.
import 'dart:collection';

import 'utils.dart';

void main() {
  testBottomUpInference();
  testTopDownInference();
}

void testBottomUpInference() {
  Map<int, int> map = {};
  Set<int> set = Set();
  dynamic dynMap = map;
  dynamic dynSet = set;
  Iterable<int> iterable = [];
  CustomSet customSet = CustomSet();
  CustomMap customMap = CustomMap();

  // Note: The commented out cases are the error cases. They are shown here for
  // completeness and tested in map_set_ambiguity_error_test.dart.
  expectMapOf<int, int>({if (true) ...map});
  expectSetOf<int>({if (true) ...set});
  // expect___Of<...>({if (true) ...dyn});
  expectSetOf<int>({if (true) ...iterable});
  expectSetOf<int>({if (true) ...customSet});
  expectMapOf<int, String>({if (true) ...customMap});

  expectMapOf<int, int>({if (true) ...map else ...map});
  // expect___Of<...>({if (true) ...map else ...set});
  expectMapOf<dynamic, dynamic>({if (true) ...map else ...dynMap});
  // expect___Of<...>({if (true) ...map else ...iterable});
  // expect___Of<...>({if (true) ...map else ...customSet});
  expectMapOf<int, Object>({if (true) ...map else ...customMap});

  expectSetOf<int>({if (true) ...set else ...set});
  expectSetOf<dynamic>({if (true) ...set else ...dynSet});
  expectSetOf<int>({if (true) ...set else ...iterable});
  expectSetOf<int>({if (true) ...set else ...customSet});
  // expect___Of<...>({if (true) ...set else ...customMap});

  // expect___Of<...>({if (true) ...dyn else ...dyn});
  expectSetOf<dynamic>({if (true) ...dynSet else ...iterable});
  expectSetOf<dynamic>({if (true) ...dynSet else ...customSet});
  expectMapOf<dynamic, dynamic>({if (true) ...dynMap else ...customMap});

  expectSetOf<int>({if (true) ...iterable else ...iterable});
  expectSetOf<int>({if (true) ...iterable else ...customSet});
  // expect___Of<...>({if (true) ...iterable else ...customMap});

  expectSetOf<int>({if (true) ...customSet else ...customSet});
  // expect___Of<...>({if (true) ...customSet else ...customMap});

  expectMapOf<int, String>({if (true) ...customMap else ...customMap});

  // Note: The commented out cases are the error cases. They are shown here for
  // completeness and tested in map_set_ambiguity_error_test.dart.
  expectMapOf<int, int>({for (; false;) ...map});
  expectSetOf<int>({for (; false;) ...set});
  // expect___Of<...>({for (; false;) ...dyn});
  expectSetOf<int>({for (; false;) ...iterable});
  expectSetOf<int>({for (; false;) ...customSet});
  expectMapOf<int, String>({for (; false;) ...customMap});

  expectMapOf<int, int>({for (; false;) ...map, for (; false;) ...map});
  // expect___Of<...>({for (; false;) ...map, for (; false;) ...set});
  expectMapOf<dynamic, dynamic>(
      {for (; false;) ...map, for (; false;) ...dynMap});
  // expect___Of<...>({for (; false;) ...map, for (; false;) ...iterable});
  // expect___Of<...>({for (; false;) ...map, for (; false;) ...customSet});
  expectMapOf<int, Object>(
      {for (; false;) ...map, for (; false;) ...customMap});

  expectSetOf<int>({for (; false;) ...set, for (; false;) ...set});
  expectSetOf<dynamic>({for (; false;) ...set, for (; false;) ...dynSet});
  expectSetOf<int>({for (; false;) ...set, for (; false;) ...iterable});
  expectSetOf<int>({for (; false;) ...set, for (; false;) ...customSet});
  // expect___Of<...>({for (; false;) ...set, for (; false;) ...customMap});

  // expect___Of<...>({for (; false;) ...dyn, for (; false;) ...dyn});
  expectSetOf<dynamic>(
      {for (; false;) ...dynSet, for (; false;) ...iterable});
  expectSetOf<dynamic>(
      {for (; false;) ...dynSet, for (; false;) ...customSet});
  expectMapOf<dynamic, dynamic>(
      {for (; false;) ...dynMap, for (; false;) ...customMap});

  expectSetOf<int>(
      {for (; false;) ...iterable, for (; false;) ...iterable});
  expectSetOf<int>(
      {for (; false;) ...iterable, for (; false;) ...customSet});
  // expect___Of<...>(
  //     {for (; false;) ...iterable, for (; false;) ...customMap});

  expectSetOf<int>(
      {for (; false;) ...customSet, for (; false;) ...customSet});
  // expect___Of<...>(
  //     {for (; false;) ...customSet, for (; false;) ...customMap});

  expectMapOf<int, String>(
      {for (; false;) ...customMap, for (; false;) ...customMap});
}

void testTopDownInference() {
  dynamic untypedMap = <int, int>{};
  dynamic untypedIterable = <int>[];

  Map<int, int> map = {if (true) ...untypedMap};
  Set<int> set = {if (true) ...untypedIterable};
  Iterable<int> iterable = {if (true) ...untypedIterable};

  expectMapOf<int, int>(map);
  expectSetOf<int>(set);
  expectSetOf<int>(iterable);

  map = {for (; false;) ...untypedMap};
  set = {for (; false;) ...untypedIterable};
  iterable = {for (; false;) ...untypedIterable};

  expectMapOf<int, int>(map);
  expectSetOf<int>(set);
  expectSetOf<int>(iterable);
}
