// 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.

// @dart = 2.9

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<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();
}
