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