// 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/async_helper.dart";
import "package:expect/expect.dart";

void main() async {
  asyncStart();

  {
    // There is a first element.
    var stream = Stream<int>.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<int>.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<int>.value(42);
    try {
      await stream.elementAt(1);
      Expect.fail("didn't throw");
    } on Error {
      // Success.
    }
  }

  {
    // Works with await for.
    var stream = Stream<int>.value(42);
    var value = null;
    await for (value in stream) {}
    Expect.equals(42, value);
  }

  {
    // Works with subscriptions and pause-resume.
    var stream = Stream<int>.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();
}
