// 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() {}
