// 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.

import 'package:unittest/unittest.dart';

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*.
  try {
    await foo();
    fail("Did not throw");
  } catch (e, st) {
    expect(st.toString(), stringContainsInOrder([
        'thrower', '.dart:8',
        '<asynchronous suspension>',
        'generator', '.dart:17',
        '<asynchronous suspension>',
        'foo', '.dart:21',
        '<asynchronous suspension>',
        'main',
        ]));
  }

  inner() async {
    deep() async {
      await thrower();
    }
    await deep();
  }

  // Test inner functions.
  try {
    await inner();
  } catch (e, st) {
    expect(st.toString(), stringContainsInOrder([
          'thrower',
          '<asynchronous suspension>',
          'main.inner.deep',
          '<asynchronous suspension>',
          'main.inner',
          '<asynchronous suspension>',
          'main',
          '<asynchronous suspension>',
          ]));
  }

  // Test for correct linkage.
  try {
    await thrower();
  } catch(e, st) {
    expect(st.toString(), stringContainsInOrder([
           'thrower', '.dart:8',
           '<asynchronous suspension>',
           'main', '.dart:68',
           ]));
  }
}
