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

import 'dart:async';
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';

import 'dart:async';

var events = [];
var delayedValue = new Completer();
var delayedError = new Completer();

foo() async {
  // Because of this `await null` the function returns and lets the caller
  // install handlers. When the function finishes, it can then synchronously
  // propagate the values.
  await null;
  new Future.microtask(() => 'in microtask')
      .then(events.add)
      .then(delayedValue.complete);
  return 'in async function';
}

bar() async {
  // Because of this `await null` the function returns and lets the caller
  // install handlers. When the function finishes, it can then synchronously
  // propagate the values.
  await null;
  new Future.microtask(() => throw 'in microtask error')
      .catchError(events.add)
      .then(delayedError.complete);
  throw 'in async function error';
}

void main() {
  asyncStart();
  var asyncValueFuture = foo().then(events.add);
  var asyncErrorFuture = bar().catchError(events.add);
  Future.wait(<Future>[
    asyncValueFuture,
    delayedValue.future,
    asyncErrorFuture,
    delayedError.future
  ]).then((_) {
    // The body completed before nested microtask. So they should appear
    // before the delayed functions. In other words, the async function should
    // not unnecessarily delay the propagation of errors and values.
    Expect.listEquals([
      "in async function",
      "in async function error",
      "in microtask",
      "in microtask error"
    ], events);
    asyncEnd();
  });
}
