// Copyright (c) 2017, 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.

/*@testedFeatures=inference*/
library test;

import 'dart:async';

Future<int> make(int x) => (new /*@typeArgs=int*/ Future(
    /*@returnType=int*/ () => x));

test() {
  Iterable<Future<int>> list = <int>[1, 2, 3]
      . /*@typeArgs=Future<int>*/ /*@target=Iterable.map*/ map(make);
  Future<List<int>> results = Future. /*@typeArgs=int*/ wait(list);
  Future<String> results2 =
      results. /*@typeArgs=String*/ /*@target=Future.then*/ then(
          /*@returnType=FutureOr<String>*/ (List<int> list) => list
              . /*@typeArgs=FutureOr<String>*/ /*@target=Iterable.fold*/ fold(
                  '',
                  /*@returnType=FutureOr<String>*/ (/*@type=FutureOr<String>*/ x,
                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                      y. /*@target=int.toString*/ toString()));

  Future<String> results3 =
      results. /*@typeArgs=String*/ /*@target=Future.then*/ then(
          /*@returnType=FutureOr<String>*/ (List<int> list) => list
              . /*@typeArgs=FutureOr<String>*/ /*@target=Iterable.fold*/ fold(
                  '',
                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                              x,
                          /*@type=int*/ y) =>
                      x /*@target=String.+*/ +
                      y. /*@target=int.toString*/ toString()));

  Future<String> results4 =
      results. /*@typeArgs=String*/ /*@target=Future.then*/ then(
          /*@returnType=String*/ (List<int> list) =>
              list. /*@target=Iterable.fold*/ fold<String>(
                  '',
                  /*@returnType=String*/ (/*@type=String*/ x,
                          /*@type=int*/ y) =>
                      x /*@target=String.+*/ +
                      y. /*@target=int.toString*/ toString()));
}

main() {}
