// 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 how spread interacts with inference.
import 'package:expect/expect.dart';

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

void testBottomUpInference() {
  // Lists.
  Expect.type<List<dynamic>>([...[]]);
  Expect.type<List<int>>([...<int>[]]);
  Expect.type<List<int>>([...[1]]);
  Expect.type<List<int>>([1, ...[2]]);
  Expect.type<List<num>>([1, ...[0.2]]);
  Expect.type<List<int>>([...[1, 2]]);
  Expect.type<List<num>>([...[1, 0.2]]);
  Expect.type<List<int>>([...[1], ...[2]]);
  Expect.type<List<num>>([...[1], ...[0.2]]);

  // Maps.
  Expect.type<Map<dynamic, dynamic>>({...{}});
  Expect.type<Map<int, int>>({...<int, int>{}});
  Expect.type<Map<int, int>>({...{1: 1}});
  Expect.type<Map<int, int>>({1: 1, ...{2: 2}});
  Expect.type<Map<num, num>>({1: 1, ...{0.2: 0.2}});
  Expect.type<Map<int, int>>({...{1: 1, 2: 2}});
  Expect.type<Map<num, num>>({...{1: 1, 0.2: 0.2}});
  Expect.type<Map<int, int>>({...{1: 1}, ...{2: 2}});
  Expect.type<Map<num, num>>({...{1: 1}, ...{0.2: 0.2}});

  // Sets.
  Expect.type<Set<dynamic>>({...[]});
  Expect.type<Set<int>>({...<int>[]});
  Expect.type<Set<int>>({...[1]});
  Expect.type<Set<int>>({1, ...[2]});
  Expect.type<Set<num>>({1, ...[0.2]});
  Expect.type<Set<int>>({...[1, 2]});
  Expect.type<Set<num>>({...[1, 0.2]});
  Expect.type<Set<int>>({...[1], ...[2]});
  Expect.type<Set<num>>({...[1], ...[0.2]});
  Expect.type<Set<num>>({...{1}, ...[0.2]});
  Expect.type<Set<num>>({...{1}, ...{0.2}});

  // If the iterable's type is dynamic, the element type is inferred as dynamic.
  Expect.type<List<dynamic>>([...([] as dynamic)]);
  Expect.type<Set<dynamic>>({1, ...([] as dynamic)});

  // If the iterable's type is dynamic, the key and value types are inferred as
  // dynamic.
  Expect.type<Map<dynamic, dynamic>>({1: 1, ...({} as dynamic)});
}

void testTopDownInference() {
  // Lists.
  Iterable<T> expectIntIterable<T>() {
    Expect.equals(int, T);
    return [];
  }

  Iterable<T> expectDynamicIterable<T>() {
    Expect.equals(dynamic, T);
    return [];
  }

  // The context element type is pushed into the spread expression if it is
  // Iterable<T>.
  Expect.listEquals(<int>[], <int>[...expectIntIterable()]);

  // Bottom up-inference from elements is not pushed back down into spread.
  Expect.listEquals(<int>[1], [1, ...expectDynamicIterable()]);

  // Maps.
  Map<K, V> expectIntStringMap<K, V>() {
    Expect.equals(int, K);
    Expect.equals(String, V);
    return {};
  }

  Map<K, V> expectDynamicDynamicMap<K, V>() {
    Expect.equals(dynamic, K);
    Expect.equals(dynamic, V);
    return {};
  }

  // The context element type is pushed into the spread expression if it is
  // Map<K, V>.
  Expect.mapEquals(<int, String>{}, <int, String>{...expectIntStringMap()});

  // Bottom up-inference from elements is not pushed back down into spread.
  Expect.mapEquals(<int, String>{1: "s"},
      {1: "s", ...expectDynamicDynamicMap()});

  // Sets.
  Set<T> expectIntSet<T>() {
    Expect.equals(int, T);
    return Set();
  }

  Set<T> expectDynamicSet<T>() {
    Expect.equals(dynamic, T);
    return Set();
  }

  // The context element type is pushed into the spread expression if it is
  // Iterable<T>.
  Expect.setEquals(<int>{}, <int>{...expectIntSet()});

  // Bottom up-inference from elements is not pushed back down into spread.
  Expect.setEquals(<int>{1}, {1, ...expectDynamicSet()});
}
