// 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 {
  var stack = StackTrace.fromString("some stack trace");
  var error = MyError();

  asyncStart();

  {
    // There is an error before any element.
    var stream = Stream<int>.error(error, stack);
    try {
      await stream.first;
      Expect.fail("didn't throw");
    } on MyError catch (e, s) {
      Expect.identical(error, e);
      Expect.identical(stack, s);
    }
  }

  {
    // There is an error before any element.
    var stream = Stream<int>.error(error, stack);
    try {
      await for (var _ in stream) {}
      Expect.fail("didn't throw");
    } on MyError catch (e, s) {
      Expect.identical(error, e);
      Expect.identical(stack, s);
    }
  }

  {
    // There is no second element or error.
    var stream = Stream<int>.error(error, stack);
    int errorCount = 0;
    var noErrorStream = stream.handleError((e, s) {
      Expect.identical(error, e);
      Expect.identical(stack, s);
      errorCount++;
    }, test: (o) => o is MyError);
    Expect.isTrue(await noErrorStream.isEmpty);
    Expect.equals(1, errorCount);
  }

  {
    // Works with subscriptions and pause-resume.
    var stream = Stream<int>.error(error, stack);
    int errorCount = 0;
    var onDone = Completer();
    var sub = stream.listen((v) {
      Expect.fail("Value event");
    }, onError: (e, s) {
      Expect.identical(error, e);
      Expect.identical(stack, s);
      errorCount++;
    }, onDone: () {
      Expect.equals(1, errorCount);
      onDone.complete();
    });
    sub.pause();
    await Future.delayed(Duration(milliseconds: 10));
    Expect.equals(0, errorCount);
    Expect.isFalse(onDone.isCompleted);
    sub.resume();
    await onDone.future;
  }

  asyncEnd();
}

class MyError {}
