|  | // Copyright (c) 2015, 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.7 | 
|  |  | 
|  | import "dart:async"; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  | import "package:async_helper/async_helper.dart"; | 
|  |  | 
|  | class Tracer { | 
|  | final String expected; | 
|  | final String name; | 
|  | String _trace = ""; | 
|  |  | 
|  | Tracer(this.expected, [this.name]); | 
|  |  | 
|  | void trace(msg) { | 
|  | if (name != null) { | 
|  | print("Tracing $name: $msg"); | 
|  | } | 
|  | _trace += msg; | 
|  | } | 
|  |  | 
|  | void done() { | 
|  | Expect.equals(expected, _trace); | 
|  | } | 
|  | } | 
|  |  | 
|  | Future test1(Tracer tracer) { | 
|  | foo() async | 
|  | * //# asyncStar: ok | 
|  | { | 
|  | var savedStackTrace; | 
|  | try { | 
|  | try { | 
|  | tracer.trace("a"); | 
|  | throw "Error"; | 
|  | } catch (e, st) { | 
|  | tracer.trace("b"); | 
|  | savedStackTrace = st; | 
|  | } | 
|  | tracer.trace("c"); | 
|  | await new Future.error("Error 2", savedStackTrace); | 
|  | tracer.trace("d"); | 
|  | } catch (e, st) { | 
|  | tracer.trace("e"); | 
|  | Expect.equals(savedStackTrace.toString(), st.toString()); | 
|  | } | 
|  | tracer.trace("f"); | 
|  | } | 
|  |  | 
|  | return foo() | 
|  | .toList() //# asyncStar: continued | 
|  | ; | 
|  | } | 
|  |  | 
|  | Future test2(Tracer tracer) { | 
|  | var savedStackTrace; | 
|  | foo() async | 
|  | * //# asyncStar: continued | 
|  | { | 
|  | try { | 
|  | tracer.trace("a"); | 
|  | throw "Error"; | 
|  | } catch (e, st) { | 
|  | tracer.trace("b"); | 
|  | savedStackTrace = st; | 
|  | } | 
|  | tracer.trace("c"); | 
|  | await new Future.error("Error 2", savedStackTrace); | 
|  | tracer.trace("d"); | 
|  | } | 
|  |  | 
|  | return foo() | 
|  | .toList() //# asyncStar: continued | 
|  | .catchError((e, st) { | 
|  | tracer.trace("e"); | 
|  | Expect.equals(savedStackTrace.toString(), st.toString()); | 
|  | }); | 
|  | } | 
|  |  | 
|  | Future test3(Tracer tracer) { | 
|  | var savedStackTrace; | 
|  | foo() async | 
|  | * //# asyncStar: continued | 
|  | { | 
|  | try { | 
|  | tracer.trace("a"); | 
|  | throw "Error"; | 
|  | } catch (e, st) { | 
|  | tracer.trace("b"); | 
|  | savedStackTrace = st; | 
|  | rethrow; | 
|  | } | 
|  | } | 
|  |  | 
|  | return foo() | 
|  | .toList() //# asyncStar: continued | 
|  | .catchError((e, st) { | 
|  | tracer.trace("c"); | 
|  | Expect.equals(savedStackTrace.toString(), st.toString()); | 
|  | }); | 
|  | } | 
|  |  | 
|  | runTest(String expectedTrace, Future test(Tracer tracer)) async { | 
|  | Tracer tracer = new Tracer(expectedTrace); | 
|  | await test(tracer); | 
|  | tracer.done(); | 
|  | } | 
|  |  | 
|  | runTests() async { | 
|  | await runTest("abcef", test1); | 
|  | await runTest("abce", test2); | 
|  | await runTest("abc", test3); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | asyncTest(runTests); | 
|  | } |