|  | // 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 { | 
|  | 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; | 
|  | } | 
|  |  | 
|  | // A null error argument is a synchronous error. | 
|  | Expect.throwsTypeError(() { | 
|  | Stream.error(null); | 
|  | }); | 
|  |  | 
|  | asyncEnd(); | 
|  | } | 
|  |  | 
|  | class MyError {} |