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