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

/// @assertion Execution of a for-in statement of the form await for
/// (finalConstVarOrType? id in e) s proceeds as follows:
///    The expression e is evaluated to an object o. It is a dynamic error if o
///  is not an instance of a class that implements Stream. Otherwise,
///  the expression await vf is evaluated, where vf is a fresh variable
///  whose value is a fresh instance f implementing the built-in class Future.
///    The stream o is listened to, and on each data event in o
///  the statement s is executed with id bound to the value of the current
///  element of the stream. If s raises an exception, or if o raises
///  an exception, then f is completed with that exception. Otherwise, when
///  all events in the stream o have been processed, f is completed with null.
///
/// @description Check that if s raises an exception, then asynchronous for-in
/// statement is completed with that exception.
/// @author a.semenov@unipro.ru

import 'dart:async';
import '../../../../Utils/expect.dart';

final ERROR = new Exception();

Future test1() async {
  var processedValues = [];
  try {
    await for (var i in new Stream.fromIterable([1, 2])) {
      processedValues.add(i);
      throw ERROR;
    }
    Expect.fail("Asynchronous for-in statement should throw $ERROR");
  } catch (e) {
    Expect.identical(ERROR, e);
  }
  Expect.listEquals([1], processedValues);
}

Future test2() async {
  var processedValues = [];
  try {
    await for (int i in new Stream.empty()) {
      processedValues.add(i);
      throw ERROR;
    }
    Expect.listEquals([], processedValues);
  } catch (e) {
    Expect.fail("Asynchronous for-in statement should not throw $e " +
      "for empty stream");
  }
}

main() {
  asyncStart();
  Future.wait([test1(), test2()]).then((v) => asyncEnd());
}
