// 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=set-literals,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 dyn = map;
  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, int>({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 ...dyn});
  // expect___Of<...>({if (true) ...map else ...iterable});
  // expect___Of<...>({if (true) ...map else ...customSet});
  expectMapOf<int, int>({if (true) ...map else ...customMap});

  expectSetOf<int>({if (true) ...set else ...set});
  expectSetOf<dynamic>({if (true) ...set else ...dyn});
  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) ...dyn else ...iterable});
  expectSetOf<dynamic>({if (true) ...dyn else ...customSet});
  expectMapOf<dynamic, dynamic>({if (true) ...dyn 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, int>({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, int>({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;) ...dyn});
  // expect___Of<...>({for (; false;) ...map, for (; false;) ...iterable});
  // expect___Of<...>({for (; false;) ...map, for (; false;) ...customSet});
  expectMapOf<int, int>(
      {for (; false;) ...map, for (; false;) ...customMap});

  expectSetOf<int>({for (; false;) ...set, for (; false;) ...set});
  expectSetOf<dynamic>({for (; false;) ...set, for (; false;) ...dyn});
  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;) ...dyn, for (; false;) ...iterable});
  expectSetOf<dynamic>(
      {for (; false;) ...dyn, for (; false;) ...customSet});
  expectMapOf<dynamic, dynamic>(
      {for (; false;) ...dyn, 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, int>(
      {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);
}
