blob: 548fefb58737d6285b0a44478ddc9ccf876b53cb [file] [log] [blame]
// 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 cancelled. Using Completer to
* control generator execution before yield* statement.
*
* @author a.semenov@unipro.ru
*/
import 'dart:async';
import '../../../../Utils/expect.dart';
Stream<int> generator(Stream<int> input, Future startTrigger) async* {
await startTrigger;
yield* input;
}
Future test() async {
List log = [];
Completer c = new Completer();
Stream<int> s = generator(new Stream.fromIterable([1, 2, 3]), c.future);
StreamSubscription<int> ss = s.listen(
(int i) {
log.add(i);
}
);
ss.pause();
c.complete(); // pass control to yield*
log.add('a');
await new Future.delayed(new Duration(milliseconds: 100));
log.add('b');
await new Future.delayed(new Duration(milliseconds: 100));
log.add('c');
await ss.cancel();
Expect.listEquals(['a','b','c'], log);
}
main() {
asyncStart();
test().then((_) => asyncEnd());
}