blob: c64a32f5311714460da84059f1e51ac563d89165 [file] [log] [blame]
// Copyright (c) 2013, 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:async_helper/async_minitest.dart';
main() {
test("stream iterator basic", () async {
var stream = createStream();
StreamIterator iterator = new StreamIterator(stream);
expect(iterator.current, isNull);
expect(await iterator.moveNext(), isTrue);
expect(iterator.current, 42);
expect(await iterator.moveNext(), isTrue);
expect(iterator.current, 37);
expect(await iterator.moveNext(), isFalse);
expect(iterator.current, isNull);
expect(await iterator.moveNext(), isFalse);
});
test("stream iterator prefilled", () async {
Stream stream = createStream();
StreamIterator iterator = new StreamIterator(stream);
await new Future.delayed(Duration.zero);
expect(iterator.current, isNull);
expect(await iterator.moveNext(), isTrue);
expect(iterator.current, 42);
expect(await iterator.moveNext(), isTrue);
expect(iterator.current, 37);
expect(await iterator.moveNext(), isFalse);
expect(iterator.current, isNull);
expect(await iterator.moveNext(), isFalse);
});
test("stream iterator error", () async {
Stream stream = createErrorStream();
StreamIterator iterator = new StreamIterator(stream);
expect(await iterator.moveNext(), isTrue);
expect(iterator.current, 42);
var hasNext = iterator.moveNext();
expect(hasNext, throwsA("BAD")); // This is an async expectation,
await hasNext.catchError((_) {}); // so we have to wait for the future too.
expect(iterator.current, isNull);
expect(await iterator.moveNext(), isFalse);
expect(iterator.current, isNull);
});
test("stream iterator current/moveNext during move", () async {
Stream stream = createStream();
StreamIterator iterator = new StreamIterator(stream);
var hasNext = iterator.moveNext();
expect(iterator.moveNext, throwsStateError);
expect(await hasNext, isTrue);
expect(iterator.current, 42);
iterator.cancel();
});
test("stream iterator error during cancel", () async {
Stream stream = createCancelErrorStream();
StreamIterator iterator = new StreamIterator(stream);
for (int i = 0; i < 10; i++) {
expect(await iterator.moveNext(), isTrue);
expect(iterator.current, i);
}
var hasNext = iterator.moveNext(); // active moveNext will be completed.
var cancel = iterator.cancel();
expect(cancel, throwsA("BAD"));
expect(await hasNext, isFalse);
expect(await iterator.moveNext(), isFalse);
});
}
Stream createStream() async* {
yield 42;
yield 37;
}
Stream createErrorStream() async* {
yield 42;
// Emit an error without stopping the generator.
yield* (new Future.error("BAD").asStream());
yield 37;
}
/// Create a stream that throws when cancelled.
Stream createCancelErrorStream() async* {
int i = 0;
try {
while (true) yield i++;
} finally {
throw "BAD";
}
}