// Copyright (c) 2016, 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 If m is marked async*, then:
 *    • It is a dynamic error if the class of o does not implement Stream.
 *  Otherwise
 *    • For each element x of o:
 *    – If the stream u associated with m has been paused, then execution
 * of m is suspended until u is resumed or canceled.
 *    – If the stream u associated with m has been canceled, then let c be
 * the finally clause of the innermost enclosing try-finally statement, if any.
 * If c is defined, let h be the handler induced by c. If h is defined,
 * control is transferred to h. If h is undefined, the immediately enclosing
 * function terminates.
 *    – Otherwise, x is added to the stream associated with m in the order
 * it appears in o. The function m may suspend.
 *    • If the stream o is done, execution of s is complete.
 *
 * @description Check that if the stream u associated with m has been paused,
 * then execution of m is suspended until u is resumed. Using
 * StreamController as input data supplier.
 *
 * @author a.semenov@unipro.ru
 * @issue 42584
 */
import 'dart:async';
import '../../../../Utils/expect.dart';

Stream<int> generator(Stream<int> input) async* {
  yield* input;
}

Future test() async {
  List log = [];
  StreamController<int> sc = new StreamController<int>();
  Stream<int> s = generator(sc.stream);
  StreamSubscription<int> ss = s.listen(
      (int i) {
        log.add(i);
      },
      onDone: () {
        Expect.listEquals(['a','b','c', 1, 2, 3], log);
        asyncEnd();
      }
  );
  ss.pause();
  sc.add(1);
  await new Future.delayed(new Duration(milliseconds: 100));
  log.add('a');
  sc.add(2);
  await new Future.delayed(new Duration(milliseconds: 100));
  log.add('b');
  sc.add(3);
  await new Future.delayed(new Duration(milliseconds: 100));
  log.add('c');
  ss.resume();
  sc.close();
}

main() {
  asyncStart();
  test();
}
