// 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.

// @dart = 2.9

import "dart:async";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

// Regression test for http://dartbug.com/27205
// If a yield-star completes while the stream is paused, it didn't resume.

main() {
  asyncTest(() {
    var c = new Completer();
    var s = yieldStream(mkStream());
    var sub;
    sub = s.listen((v) {
      sub.pause();
      print(v);
      Timer.run(sub.resume);
    }, onDone: () {
      print("DONE");
      c.complete(null);
    });
    return c.future;
  });
}

Stream yieldStream(Stream s) async* {
  yield* s;
}

Stream mkStream() {
  var s = new StreamController(sync: true);
  // The close event has to be sent and received between
  // the pause and resume above.
  // Using a sync controller and a Timer.run(sub.resume) ensures this.
  Timer.run(() {
    s.add("event");
    s.close();
  });
  return s.stream;
}
