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

// @dart = 2.9

// Test cases where the syntax is ambiguous between maps and sets.
import 'dart:collection';

import 'package:expect/expect.dart';

import 'helper_classes.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.
  Expect.type<Map<int, int>>({...map});
  Expect.type<Set<int>>({...set});
  // Expect.type<...>({...dyn});
  Expect.type<Set<int>>({...iterable});
  Expect.type<Set<int>>({...customSet});
  Expect.type<Map<int, String>>({...customMap});

  Expect.type<Map<int, int>>({...map, ...map});
  // Expect.type<...>({...map, ...set});
  Expect.type<Map<dynamic, dynamic>>({...map, ...dynMap});
  // Expect.type<...>({...map, ...iterable});
  // Expect.type<...>({...map, ...customSet});
  Expect.type<Map<int, Object>>({...map, ...customMap});

  Expect.type<Set<int>>({...set, ...set});
  Expect.type<Set<dynamic>>({...set, ...dynSet});
  Expect.type<Set<int>>({...set, ...iterable});
  Expect.type<Set<int>>({...set, ...customSet});
  // Expect.type<...>({...set, ...customMap});

  // Expect.type<...>({...dyn, ...dyn});
  Expect.type<Set<dynamic>>({...dynSet, ...iterable});
  Expect.type<Set<dynamic>>({...dynSet, ...customSet});
  Expect.type<Map<dynamic, dynamic>>({...dynMap, ...customMap});

  Expect.type<Set<int>>({...iterable, ...iterable});
  Expect.type<Set<int>>({...iterable, ...customSet});
  // Expect.type<...>({...iterable, ...customMap});

  Expect.type<Set<int>>({...customSet, ...customSet});
  // Expect.type<...>({...customSet, ...customMap});

  Expect.type<Map<int, String>>({...customMap, ...customMap});
}

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

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

  Expect.type<Map<int, int>>(map);
  Expect.type<Set<int>>(set);
  Expect.type<Set<int>>(iterable);
}
