// 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 {
  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 {}
