Index: tests/language/yieldstar_pause_test.dart |
diff --git a/tests/language/yieldstar_pause_test.dart b/tests/language/yieldstar_pause_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fea834c261ea5a27fbc6d4de35357823d2d66341 |
--- /dev/null |
+++ b/tests/language/yieldstar_pause_test.dart |
@@ -0,0 +1,44 @@ |
+// 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. |
+ |
+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() async { |
+ asyncStart(); |
+ 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); |
+ }); |
+ |
+ await c.future; |
+ asyncEnd(); |
+} |
+ |
+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; |
+} |