Index: tests/language/async_await_test.dart |
diff --git a/tests/language/async_await_test.dart b/tests/language/async_await_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..950d8310296233c58f68ae02db3397c0605b4b3b |
--- /dev/null |
+++ b/tests/language/async_await_test.dart |
@@ -0,0 +1,988 @@ |
+// 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 "package:unittest/unittest.dart"; |
+import "dart:async"; |
+ |
+mkStream() { |
+ var c; |
+ int i = 0; |
+ next() { |
+ c.add(i++); |
+ if (i == 10) { |
+ c.close(); |
+ } else { |
+ scheduleMicrotask(next); |
+ } |
+ } |
+ c = new StreamController(onListen: () { |
+ scheduleMicrotask(next); |
+ }); |
+ return c.stream; |
+} |
+ |
+main() { |
+ group("basic", () { |
+ test("async works", () { |
+ f() async { return id(42); } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("async waits", () { |
+ // Calling an "async" function won't do anything immediately. |
+ var result = []; |
+ f() async { |
+ result.add(1); |
+ return id(42); |
+ }; |
+ var future = f(); |
+ result.add(0); |
+ return future.whenComplete(() { |
+ expect(result, equals([0, 1])); |
+ }); |
+ }); |
+ |
+ test("async throws", () { |
+ f() async { |
+ throw "err"; |
+ return id(42); |
+ } |
+ return f().then((_) { fail("Didn't throw"); }, |
+ onError: (e, s) { expect(e, equals("err")); }); |
Søren Gjesse
2015/03/03 08:08:41
Indentation.
Lasse Reichstein Nielsen
2015/03/03 11:22:42
I made an abstraction for "throwsErr".
|
+ }); |
+ |
+ test("await future", () { |
+ f() async { |
+ var v = await new Future.value(42); |
+ expect(v, equals(42)); |
+ }; |
+ return f(); |
+ }); |
+ |
+ test("await value", () { |
+ f() async { |
+ var v = await id(42); |
+ expect(v, equals(42)); |
+ }; |
+ return f(); |
+ }); |
+ |
+ test("await null", () { |
+ f() async { |
+ var v = await null; |
+ expect(v, equals(null)); |
+ }; |
+ return f(); |
+ }); |
+ |
+ // test("await throw", () { |
+ // f() async { |
+ // await (throw "err"); // Check grammar: Are parentheses necessary? |
+ // return id(42); |
+ // } |
+ // return f().then((_) { fail("Didn't throw"); }, |
+ // onError: (e, s) { expect(e, equals("err")); }); |
+ // }); |
+ |
+ test("throw before await", () { |
+ f() async { |
+ var x = throw "err"; |
+ await x; // Check grammar: Are parentheses necessary? |
Søren Gjesse
2015/03/03 08:08:41
Add test for await local without a throw.
Add tes
Lasse Reichstein Nielsen
2015/03/03 11:22:42
Ah, await of different expression types! Good idea
|
+ return id(42); |
+ } |
+ return f().then((_) { fail("Didn't throw"); }, |
+ onError: (e, s) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("async await error", () { |
+ f() async { |
+ await new Future.error("err"); |
+ return id(42); |
+ } |
+ return f().then((_) { fail("Didn't throw"); }, |
+ onError: (e, s) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("async flattens futures", () { |
+ f() async { |
+ return new Future.value(42); // Not awaited. |
+ }; |
+ return f().then((v) { |
+ expect(v, equals(42)); // And not a Future with value id(42). |
Søren Gjesse
2015/03/03 08:08:41
id(42) -> 42.
Did you intend to use id(42) above?
Lasse Reichstein Nielsen
2015/03/03 11:22:42
Nope.
Søren Gjesse
2015/03/03 11:39:56
What I ment was that the comment should not have i
|
+ }); |
+ }); |
+ |
+ test("async flattens futures, error", () { |
+ f() async { |
+ return new Future.error("err"); // Not awaited. |
+ }; |
+ return f().then((_) { fail("Didn't throw"); }, |
+ onError: (e, s) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await for", () { |
+ f(s) async { |
+ int i = 0; |
+ await for (int v in s) { |
+ i += v; |
+ } |
+ return i; |
+ } |
+ return f(mkStream()).then((v) { |
+ expect(v, equals(45)); // 0 + 1 + ... + 9 |
+ }); |
+ }); |
+ |
+ test("await for empty", () { |
+ f(s) async { |
+ int v = 0; |
+ await for (int i in s) { |
+ v += i; |
+ } |
+ return v; |
+ } |
+ var s = (new StreamController()..close()).stream; |
+ return f(s).then((v) { |
+ expect(v, equals(0)); // 0 + 1 + ... + 9 |
Søren Gjesse
2015/03/03 08:08:41
Remove comment.
Lasse Reichstein Nielsen
2015/03/03 11:22:42
Done.
|
+ }); |
+ }); |
+ }); |
+ |
+ group("for", () { |
+ test("await in for-loop", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < 10; i++) { |
+ v += await new Future.value(42); |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * id(42))); |
+ }); |
+ }); |
+ |
+ test("await in for-init", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = await new Future.value(42); i >= 0; i -= 10) { |
+ v += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * 5)); |
+ }); |
+ }); |
+ |
+ test("await in for-test", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < await new Future.value(42); i += 10) { |
+ v += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * 5)); |
+ }); |
+ }); |
+ |
+ test("await in for-incr", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < 100; i += await new Future.value(42)) { |
+ v += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * 3)); |
+ }); |
+ }); |
+ |
+ test("await err in for-loop", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < 10; i++) { |
+ v += await new Future.error("err"); |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in for-init", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = await new Future.error("err"); i >= 0; i -= 10) { |
+ v += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in for-test", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < await new Future.error("err"); i += 10) { |
+ v += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in for-incr", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < 100; i += await new Future.error("err")) { |
+ v += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await in empty for-loop", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i > 0; i += 1) { |
+ v += await new Future.value(42); |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(0)); |
+ }); |
+ }); |
+ |
+ test("await in empty for-loop 2", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i > 0; i += await new Future.value(1)) { |
+ v += 1; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(0)); |
+ }); |
+ }); |
+ |
+ test("break before await in for-loop", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < 10; i += 1) { |
+ if (i == 2) break; |
+ v += await new Future.value(42); |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42 * 2)); |
+ }); |
+ }); |
+ |
+ test("break before await in for-loop 2", () { |
+ f() async { |
+ int v = 0; |
+ for (int i = 0; i < 10; i += await new Future.value(1)) { |
+ if (i == 2) break; |
+ v += id(42); |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42 * 2)); |
+ }); |
+ }); |
Søren Gjesse
2015/03/03 08:08:41
How about for tests with continue (same for while)
Lasse Reichstein Nielsen
2015/03/03 11:22:42
Sure, why not!
|
+ }); |
+ |
+ group("while", () { |
+ test("await in while-loop", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ while (i < 10) { |
+ v += await new Future.value(42); |
+ i++; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * id(42))); |
+ }); |
+ }); |
+ |
+ test("await in while-test", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ while (i < await new Future.value(42)) { |
+ v += 10; |
+ i += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * 5)); |
+ }); |
+ }); |
+ |
+ test("await err in while-loop", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ while (i < 10) { |
+ v += await new Future.error("err"); |
+ i++; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in while-test", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ while (i < await new Future.error("err")) { |
+ v += 10; |
+ i += 10; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("break before await in while", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ while (i < 10) { |
+ if (i == 2) break; |
+ v += await new Future.value(42); |
+ i += 1; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42 * 2)); |
+ }); |
+ }); |
+ }); |
+ |
+ group("do-while", () { |
+ test("await in do-while-loop", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ do { |
+ v += await new Future.value(42); |
+ i++; |
+ } while (i < 10); |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * id(42))); |
+ }); |
+ }); |
+ |
+ test("await in do-while-test", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ do { |
+ v += 10; |
+ i += 10; |
+ } while (i < await new Future.value(42)); |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10 * 5)); |
+ }); |
+ }); |
+ |
+ test("await err in do-while-loop", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ do { |
+ v += await new Future.error("err"); |
+ i++; |
+ } while (i < 10); |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in do-while-test", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ do { |
+ v += 10; |
+ i += 10; |
+ } while (i < await new Future.error("err")); |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("break before await in do-while", () { |
+ f() async { |
+ int v = 0; |
+ int i = 0; |
+ do { |
+ if (i == 2) break; |
+ v += await new Future.value(42); |
+ i += 1; |
+ } while (i < 10); |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42 * 2)); |
+ }); |
+ }); |
+ }); |
+ |
+ group("for-in", () { |
+ test("await in for-in", () { |
+ f() async { |
+ var v = 0; |
+ for (var fut in [1, 2, 3].map((v) => new Future.value(v))) { |
+ v += await fut; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(6)); |
+ }); |
+ }); |
+ |
+ test("await in for-in iterable", () { |
+ f() async { |
+ var v = 0; |
+ for (var i in await new Future.value([1, 2, 3])) { |
+ v += i; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(6)); |
+ }); |
+ }); |
+ |
+ test("await err in for-in", () { |
+ f() async { |
+ var v = 0; |
+ for (var fut in [1, 2, 3].map((v) => (v != 1) |
+ ? new Future.value(v) |
+ : new Future.error("err"))) { |
+ v += await fut; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in for-in iterable", () { |
+ f() async { |
+ var v = 0; |
+ for (var i in await new Future.error("err")) { |
+ v += i; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("break before await in for-in", () { |
+ f() async { |
+ var v = 0; |
+ for (var fut in [1, 2, 3].map((v) => new Future.value(v))) { |
+ if (v == 3) break; |
+ v += await fut; |
+ } |
+ return v; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(3)); |
+ }); |
+ }); |
+ }); |
+ |
+ group("try-catch", () { |
+ test("try-no-catch", () { |
+ f() async { |
+ try { |
+ return await id(42); |
+ } catch(e) { |
+ return 37; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in body", () { |
+ f() async { |
+ try { |
+ await new Future.error(42); |
+ } catch(e) { |
+ return e; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("throw before await in body", () { |
+ int i = id(0); |
+ f() async { |
+ try { |
+ if (i >= 0) throw id(42); |
+ return await new Future.value(10); |
+ } catch(e) { |
+ return e; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("try-catch await in catch", () { |
+ f() async { |
+ try { |
+ throw id(42); |
+ } catch(e) { |
+ return await new Future.value(e); |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("try-catch await error in catch", () { |
+ f() async { |
+ try { |
+ throw id(42); |
+ } catch(e) { |
+ await new Future.error("err"); |
+ } |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("try-catch-rethrow", () { |
+ f() async { |
+ try { |
+ await new Future.error("err"); |
+ } catch(e) { |
+ if (e == id(42)) return; |
+ rethrow; |
+ } |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ }); |
+ |
+ group("try-finally", () { |
+ test("await in body", () { |
+ f() async { |
+ try { |
+ return await new Future.value(42); |
+ } finally { |
+ // Don't do anything. |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in finally", () { |
+ var x = 0; |
+ f() async { |
+ try { |
+ return id(42); |
+ } finally { |
+ x = await new Future.value(37); |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ expect(x, equals(37)); |
+ }); |
+ }); |
+ |
+ test("await err in body", () { |
+ f() async { |
+ try { |
+ return await new Future.error("err"); |
+ } finally { |
+ // Don't do anything. |
+ } |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in finally", () { |
+ f() async { |
+ try { |
+ return id(42); |
+ } finally { |
+ await new Future.error("err"); |
+ } |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in both", () { |
+ f() async { |
+ try { |
+ await new Future.error("not err"); |
+ } finally { |
+ await new Future.error("err"); |
+ } |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
+ }); |
+ |
+ test("await err in body, override in finally", () { |
+ f() async { |
+ try { |
+ return await new Future.error("err"); |
+ } finally { |
+ return id(42); |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in body, override in finally", () { |
+ f() async { |
+ label: try { |
+ return await new Future.value(37); |
+ } finally { |
+ break label; |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await, override in finally", () { |
+ var x = 0; |
+ f() async { |
+ label: try { |
+ return 87; |
+ } finally { |
+ x = await new Future.value(37); |
+ break label; |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ expect(x, equals(37)); |
+ }); |
+ }); |
+ |
+ test("throw in body, await, override in finally 3", () { |
+ var x = 0; |
+ f() async { |
+ label: try { |
+ throw "err"; |
+ } finally { |
+ x = await new Future.value(37); |
+ break label; |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ expect(x, equals(37)); |
+ }); |
+ }); |
+ |
+ test("await err in body, override in finally 2", () { |
+ f() async { |
+ label: try { |
+ return await new Future.error("err"); |
+ } finally { |
+ break label; |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in body, no-exit in finally", () { |
+ f() async { |
+ for (int i = 0; i < 10; i++) { |
+ try { |
+ return await i; |
+ } finally { |
+ continue; |
+ } |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("no-exit after await in finally", () { |
+ f() async { |
+ int i = 0; |
+ for (; i < 10; i++) { |
+ try { |
+ break; |
+ } finally { |
+ await new Future.value(42); |
+ continue; |
+ } |
+ } |
+ return id(i); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(10)); |
+ }); |
+ }); |
+ |
+ test("exit after continue, await in finally", () { |
+ f() async { |
+ int i = 0; |
+ for (; i < 10; i++) { |
+ try { |
+ continue; |
+ } finally { |
+ await new Future.value(42); |
+ break; |
+ } |
+ } |
+ return id(i); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(0)); |
+ }); |
+ }); |
+ |
+ test("no-exit before await in finally 2", () { |
+ f() async { |
+ for (int i = 0; i < 10; i++) { |
+ try { |
+ return i; |
+ } finally { |
+ if (i >= 0) continue; |
+ await new Future.value(42); |
+ } |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("no-exit after await in finally", () { |
+ f() async { |
+ for (int i = 0; i < 10; i++) { |
+ try { |
+ return i; |
+ } finally { |
+ await new Future.value(42); |
+ continue; |
+ } |
+ } |
+ return id(42); |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("nested finallies", () { |
+ var x = 0; |
+ f() async { |
+ try { |
+ try { |
+ return 42; |
+ } finally { |
+ x = await new Future.value(37); |
+ } |
+ } finally { |
+ x += await new Future.value(37); |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ expect(x, equals(74)); |
+ }); |
+ }); |
+ |
+ test("nested finallies 2", () { |
+ var x = 0; |
+ f() async { |
+ label: try { |
+ try { |
+ break label; |
+ } finally { |
+ x = await new Future.value(37); |
+ } |
+ } finally { |
+ x += await new Future.value(37); |
+ } |
+ return 42; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ expect(x, equals(74)); |
+ }); |
+ }); |
+ |
+ test("nested finallies 3", () { |
+ var x = 0; |
+ f() async { |
+ label: try { |
+ try { |
+ break label; |
+ } finally { |
+ return await new Future.value(42); |
+ } |
+ } finally { |
+ break label; |
+ } |
+ return 42; |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("nested finallies, throw", () { |
+ var x = 0; |
+ f() async { |
+ try { |
+ try { |
+ throw "err"; |
+ } finally { |
+ x = await new Future.value(37); |
+ } |
+ } finally { |
+ x += await new Future.value(37); |
+ } |
+ } |
+ return f().then((v) { fail("didn't throw"); }, |
+ onError: (e) { expect(e, equals("err")); }); |
Søren Gjesse
2015/03/03 08:08:41
Also checck x is 74.
Lasse Reichstein Nielsen
2015/03/03 11:22:42
Done.
|
+ }); |
+ }); |
+ |
+ group("try-catch-finally", () { |
+ test("await in body", () { |
+ f() async { |
+ try { |
+ return await new Future.value(42); |
+ } catch (e) { |
+ throw null; |
+ } finally { |
+ if (id(42) == id(10)) return 10; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in catch, not hit", () { |
+ f() async { |
+ try { |
+ return id(42); |
+ } catch (e) { |
+ await new Future.error("err"); |
+ } finally { |
+ if (id(42) == id(10)) return 10; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in catch, hit", () { |
+ f() async { |
+ try { |
+ return throw id(42); |
+ } catch (e) { |
+ return await new Future.value(e); |
+ } finally { |
+ if (id(42) == id(10)) return 10; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ }); |
+ }); |
+ |
+ test("await in finally", () { |
+ var x = 0; |
+ f() async { |
+ try { |
+ return id(42); |
+ } catch (e) { |
+ throw null; |
+ } finally { |
+ x = await new Future.value(37); |
+ if (id(42) == id(10)) return 10; |
+ } |
+ } |
+ return f().then((v) { |
+ expect(v, equals(42)); |
+ expect(x, equals(37)); |
+ }); |
+ }); |
+ }); |
+} |
+ |
+ |
+// Attempt to obfuscates value to avoid too much constant folding. |
+id(v) { |
Søren Gjesse
2015/03/03 08:08:41
Maybe move this up to mkStream (or move mkStream d
Lasse Reichstein Nielsen
2015/03/03 11:22:42
Moving mkStream down. I have added many more helpe
|
+ try { |
+ throw v; |
+ } catch (e) { |
+ return e; |
+ } |
+ return null; |
+} |