| // 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:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use | |
| 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. | |
| return false; | |
| }); | |
| 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); | |
| }); | |
| test("regression 43799 (1)", () async { | |
| // See: https://github.com/dart-lang/sdk/issues/43799 | |
| var badStream = StreamController<int>.broadcast(sync: true); | |
| badStream.onListen = () { | |
| badStream.add(1); | |
| badStream.close(); | |
| }; | |
| var it = StreamIterator(badStream.stream); | |
| expect(await it.moveNext(), false); | |
| }); | |
| test("regression 43799 (2)", () async { | |
| // See: https://github.com/dart-lang/sdk/issues/43799 | |
| var badStream = StreamController<int>.broadcast(sync: true); | |
| badStream.onListen = () { | |
| badStream.addError("bad"); | |
| }; | |
| var it = StreamIterator(badStream.stream); | |
| expect(it.moveNext(), expectAsync(throwsA("bad"))); | |
| }); | |
| } | |
| 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"; | |
| } | |
| } |