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