| // Copyright (c) 2017, 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. |
| // |
| // VMOptions=--lazy-async-stacks |
| |
| // @dart = 2.9 |
| |
| import 'package:async_helper/async_minitest.dart'; |
| |
| import 'lazy_async_exception_stack_helper.dart' as h; |
| |
| thrower() async { |
| throw 'oops'; |
| } |
| |
| number() async { |
| return 4; |
| } |
| |
| generator() async* { |
| yield await number(); |
| yield await thrower(); |
| } |
| |
| foo() async { |
| await for (var i in generator()) { |
| print(i); |
| } |
| } |
| |
| main() async { |
| // Test async and async*. |
| test('lazy async exception stack', () async { |
| try { |
| await foo(); |
| fail("Did not throw"); |
| } catch (e, st) { |
| expect( |
| h.stringContainsInOrder(st.toString(), [ |
| 'thrower', '.dart:14', // no auto-format. |
| 'generator', '.dart:23', // no auto-format. |
| '<asynchronous suspension>', // no auto-format. |
| 'foo', '.dart', // no auto-format. |
| 'main', |
| ]), |
| isTrue); |
| } |
| |
| inner() async { |
| deep() async { |
| await thrower(); |
| } |
| |
| await deep(); |
| } |
| |
| // Test inner functions. |
| try { |
| await inner(); |
| } catch (e, st) { |
| expect( |
| h.stringContainsInOrder(st.toString(), [ |
| 'thrower', |
| 'main.<anonymous closure>.inner.deep', |
| 'main.<anonymous closure>.inner', |
| 'main', |
| '<asynchronous suspension>', |
| ]), |
| isTrue); |
| } |
| |
| // Test for correct linkage. |
| try { |
| await thrower(); |
| } catch (e, st) { |
| expect( |
| h.stringContainsInOrder(st.toString(), [ |
| 'thrower', '.dart:14', // no auto-format. |
| 'main.<anonymous closure>', '.dart:75', // no auto-format. |
| ]), |
| isTrue); |
| } |
| }); |
| } |