// Copyright (c) 2014, 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=--optimization-counter-threshold=10 --no-background-compilation

import 'package:expect/expect.dart';

import 'dart:async';

expectThenValue(future, value) {
  Expect.isTrue(future is Future);
  future.then((result) {
    Expect.equals(value, result);
  });
}

asyncIf(condition) async {
  if(condition) {
    return 1;
  } else {
    return 2;
  }
  // This return is never reached as the finally block returns from the
  // function.
  return 3;
}

asyncFor(condition) async {
  for (int i = 0; i < 10; i++) {
    if (i == 5 && condition) {
      return 1;
    }
  }
  return 2;
}

asyncTryCatchFinally(overrideInFinally, doThrow) async {
  try {
    if (doThrow) throw 444;
    return 1;
  } catch (e) {
    return e;
  } finally {
    if (overrideInFinally) return 3;
  }
}

asyncTryCatchLoop() async {
  var i = 0;
  var throws = 13;
  while (true) {
    try {
      throw throws;
    } catch (e) {
      if (i == throws) { return e; }
    } finally {
      i++;
    }
  }
}

asyncImplicitReturn() async {
  try {}
  catch (e) {}
  finally {}
}

main() {
  var asyncReturn;

  for (int i = 0; i < 10; i++) {
    asyncReturn = asyncIf(true);
    expectThenValue(asyncReturn, 1);
    asyncReturn = asyncIf(false);
    expectThenValue(asyncReturn, 2);

    asyncReturn = asyncFor(true);
    expectThenValue(asyncReturn, 1);
    asyncReturn = asyncFor(false);
    expectThenValue(asyncReturn, 2);

    asyncReturn = asyncTryCatchFinally(true, false);
    expectThenValue(asyncReturn, 3);
    asyncReturn = asyncTryCatchFinally(false, false);
    expectThenValue(asyncReturn, 1);
    asyncReturn = asyncTryCatchFinally(true, true);
    expectThenValue(asyncReturn, 3);
    asyncReturn = asyncTryCatchFinally(false, true);
    expectThenValue(asyncReturn, 444);
    asyncReturn = asyncTryCatchLoop();
    expectThenValue(asyncReturn, 13);

    asyncReturn = asyncImplicitReturn();
    expectThenValue(asyncReturn, null);
  }
}
