// Copyright (c) 2019, 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"; void main() async { asyncStart(); { // There is a first element. var stream = Stream.value(42); var first = await stream.first; Expect.equals(42, first); // Is single-subscription. Expect.throws(() => stream.first); } { // There is no second element. var stream = Stream.value(42); try { await stream.skip(1).first; Expect.fail("didn't throw"); } on Error { // Success. } } { // There is still no second element. var stream = Stream.value(42); try { await stream.elementAt(1); Expect.fail("didn't throw"); } on Error { // Success. } } { // Works with await for. var stream = Stream.value(42); var value = null; await for (value in stream) {} Expect.equals(42, value); } { // Works with subscriptions and pause-resume. var stream = Stream.value(42); var value; var onDone = Completer(); var sub = stream.listen((v) { value = v; }, onDone: () { Expect.equals(42, value); onDone.complete(); }); sub.pause(); await Future.delayed(Duration(milliseconds: 10)); Expect.isNull(value); Expect.isFalse(onDone.isCompleted); sub.resume(); await onDone.future; } asyncEnd(); }