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