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

import 'dart:async';
import 'package:expect/async_helper.dart';
import 'package:expect/expect.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<void>.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();
  });
}
