| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library async_await_test; | 5 library async_await_test; |
| 6 | 6 |
| 7 import "package:unittest/unittest.dart"; | 7 import "package:unittest/unittest.dart"; |
| 8 import "dart:async"; | 8 import "dart:async"; |
| 9 | 9 |
| 10 main() { | 10 main() { |
| 11 bool checkedMode = false; | 11 bool checkedMode = false; |
| 12 assert((checkedMode = true)); | 12 assert((checkedMode = true)); |
| 13 | 13 |
| 14 group("basic", () { | 14 group("basic", () { |
| 15 test("async w/o await", () { | 15 test("async w/o await", () { |
| 16 f() async { return id(42); } | 16 f() async { |
| 17 return id(42); |
| 18 } |
| 19 |
| 17 return expect42(f()); | 20 return expect42(f()); |
| 18 }); | 21 }); |
| 19 | 22 |
| 20 test("async waits", () { | 23 test("async waits", () { |
| 21 // Calling an "async" function won't do anything immediately. | 24 // Calling an "async" function won't do anything immediately. |
| 22 var result = []; | 25 var result = []; |
| 23 f() async { | 26 f() async { |
| 24 result.add(1); | 27 result.add(1); |
| 25 return id(42); | 28 return id(42); |
| 26 }; | 29 } |
| 30 |
| 31 ; |
| 27 var future = f(); | 32 var future = f(); |
| 28 result.add(0); | 33 result.add(0); |
| 29 return future.whenComplete(() { | 34 return future.whenComplete(() { |
| 30 expect(result, equals([0, 1])); | 35 expect(result, equals([0, 1])); |
| 31 }); | 36 }); |
| 32 }); | 37 }); |
| 33 | 38 |
| 34 test("async throws", () { | 39 test("async throws", () { |
| 35 f() async { | 40 f() async { |
| 36 throw "err"; | 41 throw "err"; |
| 37 return id(42); | 42 return id(42); |
| 38 } | 43 } |
| 44 |
| 39 return throwsErr(f()); | 45 return throwsErr(f()); |
| 40 }); | 46 }); |
| 41 | 47 |
| 42 test("await future", () { | 48 test("await future", () { |
| 43 f() async { | 49 f() async { |
| 44 var v = await new Future.value(42); | 50 var v = await new Future.value(42); |
| 45 return v; | 51 return v; |
| 46 }; | 52 } |
| 53 |
| 54 ; |
| 47 return expect42(f()); | 55 return expect42(f()); |
| 48 }); | 56 }); |
| 49 | 57 |
| 50 test("await value", () { | 58 test("await value", () { |
| 51 f() async { | 59 f() async { |
| 52 var v = await id(42); | 60 var v = await id(42); |
| 53 return v; | 61 return v; |
| 54 }; | 62 } |
| 63 |
| 64 ; |
| 55 return expect42(f()); | 65 return expect42(f()); |
| 56 }); | 66 }); |
| 57 | 67 |
| 58 test("await null", () { | 68 test("await null", () { |
| 59 f() async { | 69 f() async { |
| 60 var v = await null; | 70 var v = await null; |
| 61 expect(v, equals(null)); | 71 expect(v, equals(null)); |
| 62 }; | 72 } |
| 73 |
| 74 ; |
| 63 return f(); | 75 return f(); |
| 64 }); | 76 }); |
| 65 | 77 |
| 66 test("await await", () { | 78 test("await await", () { |
| 67 f() async { | 79 f() async { |
| 68 return await await new Future.value(42); | 80 return await await new Future.value(42); |
| 69 } | 81 } |
| 82 |
| 70 return expect42(f()); | 83 return expect42(f()); |
| 71 }); | 84 }); |
| 72 | 85 |
| 73 test("await fake value future", () { | 86 test("await fake value future", () { |
| 74 f() async { | 87 f() async { |
| 75 return await new FakeValueFuture(42); | 88 return await new FakeValueFuture(42); |
| 76 } | 89 } |
| 90 |
| 77 return expect42(f()); | 91 return expect42(f()); |
| 78 }); | 92 }); |
| 79 | 93 |
| 80 test("await fake error future", () { | 94 test("await fake error future", () { |
| 81 f() async { | 95 f() async { |
| 82 return await new FakeErrorFuture("err"); | 96 return await new FakeErrorFuture("err"); |
| 83 } | 97 } |
| 98 |
| 84 return throwsErr(f()); | 99 return throwsErr(f()); |
| 85 }); | 100 }); |
| 86 | 101 |
| 87 test("await value is delayed", () { | 102 test("await value is delayed", () { |
| 88 f() async { | 103 f() async { |
| 89 bool x = false; | 104 bool x = false; |
| 90 scheduleMicrotask(() { x = true; }); | 105 scheduleMicrotask(() { |
| 106 x = true; |
| 107 }); |
| 91 var y = await true; | 108 var y = await true; |
| 92 expect(x, equals(y)); | 109 expect(x, equals(y)); |
| 93 } | 110 } |
| 111 |
| 94 return f(); | 112 return f(); |
| 95 }); | 113 }); |
| 96 | 114 |
| 97 test("await throw", () { | 115 test("await throw", () { |
| 98 f() async { | 116 f() async { |
| 99 await (throw "err"); // Check grammar: Are parentheses necessary? | 117 await (throw "err"); // Check grammar: Are parentheses necessary? |
| 100 return id(42); | 118 return id(42); |
| 101 } | 119 } |
| 120 |
| 102 return throwsErr(f()); | 121 return throwsErr(f()); |
| 103 }); | 122 }); |
| 104 | 123 |
| 105 test("throw before await", () { | 124 test("throw before await", () { |
| 106 f() async { | 125 f() async { |
| 107 var x = throw "err"; | 126 var x = throw "err"; |
| 108 await x; // Check grammar: Are parentheses necessary? | 127 await x; // Check grammar: Are parentheses necessary? |
| 109 return id(42); | 128 return id(42); |
| 110 } | 129 } |
| 130 |
| 111 return throwsErr(f()); | 131 return throwsErr(f()); |
| 112 }); | 132 }); |
| 113 | 133 |
| 114 if (checkedMode) { | 134 if (checkedMode) { |
| 115 test("assert before await", () { | 135 test("assert before await", () { |
| 116 f(v) async { | 136 f(v) async { |
| 117 assert(v == 87); | 137 assert(v == 87); |
| 118 return await new Future.microtask(() => 42); | 138 return await new Future.microtask(() => 42); |
| 119 } | 139 } |
| 140 |
| 120 return f(42).then((_) { | 141 return f(42).then((_) { |
| 121 fail("assert didn't throw"); | 142 fail("assert didn't throw"); |
| 122 }, onError: (e, s) { | 143 }, onError: (e, s) { |
| 123 expect(e is AssertionError, isTrue); | 144 expect(e is AssertionError, isTrue); |
| 124 }); | 145 }); |
| 125 }); | 146 }); |
| 126 | 147 |
| 127 test("assert after await", () { | 148 test("assert after await", () { |
| 128 f(v) async { | 149 f(v) async { |
| 129 var x = await new Future.microtask(() => 42); | 150 var x = await new Future.microtask(() => 42); |
| 130 assert(v == 87); | 151 assert(v == 87); |
| 131 return x; | 152 return x; |
| 132 } | 153 } |
| 154 |
| 133 return f(42).then((_) { | 155 return f(42).then((_) { |
| 134 fail("assert didn't throw"); | 156 fail("assert didn't throw"); |
| 135 }, onError: (e, s) { | 157 }, onError: (e, s) { |
| 136 expect(e is AssertionError, isTrue); | 158 expect(e is AssertionError, isTrue); |
| 137 }); | 159 }); |
| 138 }); | 160 }); |
| 139 } | 161 } |
| 140 | 162 |
| 141 test("async await error", () { | 163 test("async await error", () { |
| 142 f() async { | 164 f() async { |
| 143 await new Future.error("err"); | 165 await new Future.error("err"); |
| 144 return id(42); | 166 return id(42); |
| 145 } | 167 } |
| 168 |
| 146 return throwsErr(f()); | 169 return throwsErr(f()); |
| 147 }); | 170 }); |
| 148 | 171 |
| 149 test("async flattens futures", () { | 172 test("async flattens futures", () { |
| 150 f() async { | 173 f() async { |
| 151 return new Future.value(42); // Not awaited. | 174 return new Future.value(42); // Not awaited. |
| 152 }; | 175 } |
| 176 |
| 177 ; |
| 153 return f().then((v) { | 178 return f().then((v) { |
| 154 expect(v, equals(42)); // And not a Future with value 42. | 179 expect(v, equals(42)); // And not a Future with value 42. |
| 155 }); | 180 }); |
| 156 }); | 181 }); |
| 157 | 182 |
| 158 test("async flattens futures, error", () { | 183 test("async flattens futures, error", () { |
| 159 f() async { | 184 f() async { |
| 160 return new Future.error("err"); // Not awaited. | 185 return new Future.error("err"); // Not awaited. |
| 161 }; | 186 } |
| 187 |
| 188 ; |
| 162 return throwsErr(f()); | 189 return throwsErr(f()); |
| 163 }); | 190 }); |
| 164 | 191 |
| 165 test("await for", () { | 192 test("await for", () { |
| 166 f(Stream<int> s) async { | 193 f(Stream<int> s) async { |
| 167 int i = 0; | 194 int i = 0; |
| 168 await for (int v in s) { | 195 await for (int v in s) { |
| 169 i += v; | 196 i += v; |
| 170 } | 197 } |
| 171 return i; | 198 return i; |
| 172 } | 199 } |
| 200 |
| 173 return f(mkStream()).then((v) { | 201 return f(mkStream()).then((v) { |
| 174 expect(v, equals(45)); // 0 + 1 + ... + 9 | 202 expect(v, equals(45)); // 0 + 1 + ... + 9 |
| 175 }); | 203 }); |
| 176 }); | 204 }); |
| 177 | 205 |
| 178 test("await for w/ await", () { | 206 test("await for w/ await", () { |
| 179 f(Stream<int> s) async { | 207 f(Stream<int> s) async { |
| 180 int i = 0; | 208 int i = 0; |
| 181 await for (int v in s) { | 209 await for (int v in s) { |
| 182 i += await new Future.value(v); | 210 i += await new Future.value(v); |
| 183 } | 211 } |
| 184 return i; | 212 return i; |
| 185 } | 213 } |
| 214 |
| 186 return f(mkStream()).then((v) { | 215 return f(mkStream()).then((v) { |
| 187 expect(v, equals(45)); // 0 + 1 + ... + 9 | 216 expect(v, equals(45)); // 0 + 1 + ... + 9 |
| 188 }); | 217 }); |
| 189 }); | 218 }); |
| 190 | 219 |
| 191 test("await for empty", () { | 220 test("await for empty", () { |
| 192 f(Stream<int> s) async { | 221 f(Stream<int> s) async { |
| 193 int v = 0; | 222 int v = 0; |
| 194 await for (int i in s) { | 223 await for (int i in s) { |
| 195 v += i; | 224 v += i; |
| 196 } | 225 } |
| 197 return v; | 226 return v; |
| 198 } | 227 } |
| 228 |
| 199 var s = (new StreamController<int>()..close()).stream; | 229 var s = (new StreamController<int>()..close()).stream; |
| 200 return f(s).then((v) { | 230 return f(s).then((v) { |
| 201 expect(v, equals(0)); | 231 expect(v, equals(0)); |
| 202 }); | 232 }); |
| 203 }); | 233 }); |
| 204 | 234 |
| 205 if (checkedMode) { | 235 if (checkedMode) { |
| 206 test("await for w/ await, asseert", () { | 236 test("await for w/ await, asseert", () { |
| 207 f(Stream<int> s) async { | 237 f(Stream<int> s) async { |
| 208 int i = 0; | 238 int i = 0; |
| 209 await for (int v in s) { | 239 await for (int v in s) { |
| 210 i += await new Future.microtask(() => v); | 240 i += await new Future.microtask(() => v); |
| 211 assert(v < 8); | 241 assert(v < 8); |
| 212 } | 242 } |
| 213 return i; | 243 return i; |
| 214 } | 244 } |
| 245 |
| 215 return f(mkStream()).then((v) { | 246 return f(mkStream()).then((v) { |
| 216 fail("assert didn't throw"); | 247 fail("assert didn't throw"); |
| 217 }, onError: (e, s) { | 248 }, onError: (e, s) { |
| 218 expect(e is AssertionError, isTrue); | 249 expect(e is AssertionError, isTrue); |
| 219 }); | 250 }); |
| 220 }); | 251 }); |
| 221 } | 252 } |
| 222 }); | 253 }); |
| 223 | 254 |
| 224 group("for", () { | 255 group("for", () { |
| 225 test("await in for-loop", () { | 256 test("await in for-loop", () { |
| 226 f() async { | 257 f() async { |
| 227 int v = 0; | 258 int v = 0; |
| 228 for (int i = 0; i < 10; i++) { | 259 for (int i = 0; i < 10; i++) { |
| 229 v += await new Future.value(42); | 260 v += await new Future.value(42); |
| 230 } | 261 } |
| 231 return v; | 262 return v; |
| 232 } | 263 } |
| 264 |
| 233 return f().then((v) { | 265 return f().then((v) { |
| 234 expect(v, equals(10 * id(42))); | 266 expect(v, equals(10 * id(42))); |
| 235 }); | 267 }); |
| 236 }); | 268 }); |
| 237 | 269 |
| 238 test("await in for-init", () { | 270 test("await in for-init", () { |
| 239 f() async { | 271 f() async { |
| 240 int v = 0; | 272 int v = 0; |
| 241 for (int i = await new Future.value(42); i >= 0; i -= 10) { | 273 for (int i = await new Future.value(42); i >= 0; i -= 10) { |
| 242 v += 10; | 274 v += 10; |
| 243 } | 275 } |
| 244 return v; | 276 return v; |
| 245 } | 277 } |
| 278 |
| 246 return f().then((v) { | 279 return f().then((v) { |
| 247 expect(v, equals(10 * 5)); | 280 expect(v, equals(10 * 5)); |
| 248 }); | 281 }); |
| 249 }); | 282 }); |
| 250 | 283 |
| 251 test("await in for-test", () { | 284 test("await in for-test", () { |
| 252 f() async { | 285 f() async { |
| 253 int v = 0; | 286 int v = 0; |
| 254 for (int i = 0; i < await new Future.value(42); i += 10) { | 287 for (int i = 0; i < await new Future.value(42); i += 10) { |
| 255 v += 10; | 288 v += 10; |
| 256 } | 289 } |
| 257 return v; | 290 return v; |
| 258 } | 291 } |
| 292 |
| 259 return f().then((v) { | 293 return f().then((v) { |
| 260 expect(v, equals(10 * 5)); | 294 expect(v, equals(10 * 5)); |
| 261 }); | 295 }); |
| 262 }); | 296 }); |
| 263 | 297 |
| 264 test("await in for-incr", () { | 298 test("await in for-incr", () { |
| 265 f() async { | 299 f() async { |
| 266 int v = 0; | 300 int v = 0; |
| 267 for (int i = 0; i < 100; i += await new Future.value(42)) { | 301 for (int i = 0; i < 100; i += await new Future.value(42)) { |
| 268 v += 10; | 302 v += 10; |
| 269 } | 303 } |
| 270 return v; | 304 return v; |
| 271 } | 305 } |
| 306 |
| 272 return f().then((v) { | 307 return f().then((v) { |
| 273 expect(v, equals(10 * 3)); | 308 expect(v, equals(10 * 3)); |
| 274 }); | 309 }); |
| 275 }); | 310 }); |
| 276 | 311 |
| 277 test("await err in for-loop", () { | 312 test("await err in for-loop", () { |
| 278 f() async { | 313 f() async { |
| 279 int v = 0; | 314 int v = 0; |
| 280 for (int i = 0; i < 10; i++) { | 315 for (int i = 0; i < 10; i++) { |
| 281 v += await new Future.error("err"); | 316 v += await new Future.error("err"); |
| 282 } | 317 } |
| 283 return v; | 318 return v; |
| 284 } | 319 } |
| 320 |
| 285 return throwsErr(f()); | 321 return throwsErr(f()); |
| 286 }); | 322 }); |
| 287 | 323 |
| 288 test("await err in for-init", () { | 324 test("await err in for-init", () { |
| 289 f() async { | 325 f() async { |
| 290 int v = 0; | 326 int v = 0; |
| 291 for (int i = await new Future.error("err"); i >= 0; i -= 10) { | 327 for (int i = await new Future.error("err"); i >= 0; i -= 10) { |
| 292 v += 10; | 328 v += 10; |
| 293 } | 329 } |
| 294 return v; | 330 return v; |
| 295 } | 331 } |
| 332 |
| 296 return throwsErr(f()); | 333 return throwsErr(f()); |
| 297 }); | 334 }); |
| 298 | 335 |
| 299 test("await err in for-test", () { | 336 test("await err in for-test", () { |
| 300 f() async { | 337 f() async { |
| 301 int v = 0; | 338 int v = 0; |
| 302 for (int i = 0; i < await new Future.error("err"); i += 10) { | 339 for (int i = 0; i < await new Future.error("err"); i += 10) { |
| 303 v += 10; | 340 v += 10; |
| 304 } | 341 } |
| 305 return v; | 342 return v; |
| 306 } | 343 } |
| 344 |
| 307 return throwsErr(f()); | 345 return throwsErr(f()); |
| 308 }); | 346 }); |
| 309 | 347 |
| 310 test("await err in for-incr", () { | 348 test("await err in for-incr", () { |
| 311 f() async { | 349 f() async { |
| 312 int v = 0; | 350 int v = 0; |
| 313 for (int i = 0; i < 100; i += await new Future.error("err")) { | 351 for (int i = 0; i < 100; i += await new Future.error("err")) { |
| 314 v += 10; | 352 v += 10; |
| 315 } | 353 } |
| 316 return v; | 354 return v; |
| 317 } | 355 } |
| 356 |
| 318 return throwsErr(f()); | 357 return throwsErr(f()); |
| 319 }); | 358 }); |
| 320 | 359 |
| 321 test("await in empty for-loop", () { | 360 test("await in empty for-loop", () { |
| 322 f() async { | 361 f() async { |
| 323 int v = 0; | 362 int v = 0; |
| 324 for (int i = 0; i > 0; i += 1) { | 363 for (int i = 0; i > 0; i += 1) { |
| 325 v += await new Future.value(42); | 364 v += await new Future.value(42); |
| 326 } | 365 } |
| 327 return v; | 366 return v; |
| 328 } | 367 } |
| 368 |
| 329 return f().then((v) { | 369 return f().then((v) { |
| 330 expect(v, equals(0)); | 370 expect(v, equals(0)); |
| 331 }); | 371 }); |
| 332 }); | 372 }); |
| 333 | 373 |
| 334 test("await in empty for-loop 2", () { | 374 test("await in empty for-loop 2", () { |
| 335 f() async { | 375 f() async { |
| 336 int v = 0; | 376 int v = 0; |
| 337 for (int i = 0; i > 0; i += await new Future.value(1)) { | 377 for (int i = 0; i > 0; i += await new Future.value(1)) { |
| 338 v += 1; | 378 v += 1; |
| 339 } | 379 } |
| 340 return v; | 380 return v; |
| 341 } | 381 } |
| 382 |
| 342 return f().then((v) { | 383 return f().then((v) { |
| 343 expect(v, equals(0)); | 384 expect(v, equals(0)); |
| 344 }); | 385 }); |
| 345 }); | 386 }); |
| 346 | 387 |
| 347 test("break before await in for-loop", () { | 388 test("break before await in for-loop", () { |
| 348 f() async { | 389 f() async { |
| 349 int v = 0; | 390 int v = 0; |
| 350 for (int i = 0; i < 10; i += 1) { | 391 for (int i = 0; i < 10; i += 1) { |
| 351 if (i == 2) break; | 392 if (i == 2) break; |
| 352 v += await new Future.value(42); | 393 v += await new Future.value(42); |
| 353 } | 394 } |
| 354 return v; | 395 return v; |
| 355 } | 396 } |
| 397 |
| 356 return f().then((v) { | 398 return f().then((v) { |
| 357 expect(v, equals(42 * 2)); | 399 expect(v, equals(42 * 2)); |
| 358 }); | 400 }); |
| 359 }); | 401 }); |
| 360 | 402 |
| 361 test("break before await in for-loop 2", () { | 403 test("break before await in for-loop 2", () { |
| 362 f() async { | 404 f() async { |
| 363 int v = 0; | 405 int v = 0; |
| 364 for (int i = 0; i < 10; i += await new Future.value(1)) { | 406 for (int i = 0; i < 10; i += await new Future.value(1)) { |
| 365 if (i == 2) break; | 407 if (i == 2) break; |
| 366 v += id(42); | 408 v += id(42); |
| 367 } | 409 } |
| 368 return v; | 410 return v; |
| 369 } | 411 } |
| 412 |
| 370 return f().then((v) { | 413 return f().then((v) { |
| 371 expect(v, equals(42 * 2)); | 414 expect(v, equals(42 * 2)); |
| 372 }); | 415 }); |
| 373 }); | 416 }); |
| 374 | 417 |
| 375 test("continue before await", () { | 418 test("continue before await", () { |
| 376 f() async { | 419 f() async { |
| 377 int v = 0; | 420 int v = 0; |
| 378 for (int i = 0; i < 10; i += 1) { | 421 for (int i = 0; i < 10; i += 1) { |
| 379 if (i == 2) continue; | 422 if (i == 2) continue; |
| 380 v += await new Future.value(42); | 423 v += await new Future.value(42); |
| 381 } | 424 } |
| 382 return v; | 425 return v; |
| 383 } | 426 } |
| 427 |
| 384 return f().then((v) { | 428 return f().then((v) { |
| 385 expect(v, equals(42 * 9)); | 429 expect(v, equals(42 * 9)); |
| 386 }); | 430 }); |
| 387 }); | 431 }); |
| 388 | 432 |
| 389 test("continue after await", () { | 433 test("continue after await", () { |
| 390 f() async { | 434 f() async { |
| 391 int v = 0; | 435 int v = 0; |
| 392 for (int i = 0; i < 10; i += 1) { | 436 for (int i = 0; i < 10; i += 1) { |
| 393 var j = await new Future.value(42); | 437 var j = await new Future.value(42); |
| 394 if (i == 2) continue; | 438 if (i == 2) continue; |
| 395 v += j; | 439 v += j; |
| 396 } | 440 } |
| 397 return v; | 441 return v; |
| 398 } | 442 } |
| 443 |
| 399 return f().then((v) { | 444 return f().then((v) { |
| 400 expect(v, equals(42 * 9)); | 445 expect(v, equals(42 * 9)); |
| 401 }); | 446 }); |
| 402 }); | 447 }); |
| 403 }); | 448 }); |
| 404 | 449 |
| 405 group("while", () { | 450 group("while", () { |
| 406 test("await in while-loop", () { | 451 test("await in while-loop", () { |
| 407 f() async { | 452 f() async { |
| 408 int v = 0; | 453 int v = 0; |
| 409 int i = 0; | 454 int i = 0; |
| 410 while (i < 10) { | 455 while (i < 10) { |
| 411 v += await new Future.value(42); | 456 v += await new Future.value(42); |
| 412 i++; | 457 i++; |
| 413 } | 458 } |
| 414 return v; | 459 return v; |
| 415 } | 460 } |
| 461 |
| 416 return f().then((v) { | 462 return f().then((v) { |
| 417 expect(v, equals(10 * id(42))); | 463 expect(v, equals(10 * id(42))); |
| 418 }); | 464 }); |
| 419 }); | 465 }); |
| 420 | 466 |
| 421 test("await in while-test", () { | 467 test("await in while-test", () { |
| 422 f() async { | 468 f() async { |
| 423 int v = 0; | 469 int v = 0; |
| 424 int i = 0; | 470 int i = 0; |
| 425 while (i < await new Future.value(42)) { | 471 while (i < await new Future.value(42)) { |
| 426 v += 10; | 472 v += 10; |
| 427 i += 10; | 473 i += 10; |
| 428 } | 474 } |
| 429 return v; | 475 return v; |
| 430 } | 476 } |
| 477 |
| 431 return f().then((v) { | 478 return f().then((v) { |
| 432 expect(v, equals(10 * 5)); | 479 expect(v, equals(10 * 5)); |
| 433 }); | 480 }); |
| 434 }); | 481 }); |
| 435 | 482 |
| 436 test("await err in loop", () { | 483 test("await err in loop", () { |
| 437 f() async { | 484 f() async { |
| 438 int v = 0; | 485 int v = 0; |
| 439 int i = 0; | 486 int i = 0; |
| 440 while (i < 10) { | 487 while (i < 10) { |
| 441 v += await new Future.error("err"); | 488 v += await new Future.error("err"); |
| 442 i++; | 489 i++; |
| 443 } | 490 } |
| 444 return v; | 491 return v; |
| 445 } | 492 } |
| 493 |
| 446 return throwsErr(f()); | 494 return throwsErr(f()); |
| 447 }); | 495 }); |
| 448 | 496 |
| 449 test("await err in test", () { | 497 test("await err in test", () { |
| 450 f() async { | 498 f() async { |
| 451 int v = 0; | 499 int v = 0; |
| 452 int i = 0; | 500 int i = 0; |
| 453 while (i < await new Future.error("err")) { | 501 while (i < await new Future.error("err")) { |
| 454 v += 10; | 502 v += 10; |
| 455 i += 10; | 503 i += 10; |
| 456 } | 504 } |
| 457 return v; | 505 return v; |
| 458 } | 506 } |
| 507 |
| 459 return throwsErr(f()); | 508 return throwsErr(f()); |
| 460 }); | 509 }); |
| 461 | 510 |
| 462 test("break before await", () { | 511 test("break before await", () { |
| 463 f() async { | 512 f() async { |
| 464 int v = 0; | 513 int v = 0; |
| 465 int i = 0; | 514 int i = 0; |
| 466 while (i < 10) { | 515 while (i < 10) { |
| 467 if (i == 2) break; | 516 if (i == 2) break; |
| 468 v += await new Future.value(42); | 517 v += await new Future.value(42); |
| 469 i += 1; | 518 i += 1; |
| 470 } | 519 } |
| 471 return v; | 520 return v; |
| 472 } | 521 } |
| 522 |
| 473 return f().then((v) { | 523 return f().then((v) { |
| 474 expect(v, equals(42 * 2)); | 524 expect(v, equals(42 * 2)); |
| 475 }); | 525 }); |
| 476 }); | 526 }); |
| 477 | 527 |
| 478 test("break after await", () { | 528 test("break after await", () { |
| 479 f() async { | 529 f() async { |
| 480 int v = 0; | 530 int v = 0; |
| 481 int i = 0; | 531 int i = 0; |
| 482 while (i < 10) { | 532 while (i < 10) { |
| 483 v += await new Future.value(42); | 533 v += await new Future.value(42); |
| 484 if (i == 2) break; | 534 if (i == 2) break; |
| 485 i += 1; | 535 i += 1; |
| 486 } | 536 } |
| 487 return v; | 537 return v; |
| 488 } | 538 } |
| 539 |
| 489 return f().then((v) { | 540 return f().then((v) { |
| 490 expect(v, equals(42 * 3)); | 541 expect(v, equals(42 * 3)); |
| 491 }); | 542 }); |
| 492 }); | 543 }); |
| 493 | 544 |
| 494 test("continue before await", () { | 545 test("continue before await", () { |
| 495 f() async { | 546 f() async { |
| 496 int v = 0; | 547 int v = 0; |
| 497 int i = 0; | 548 int i = 0; |
| 498 while (i < 10) { | 549 while (i < 10) { |
| 499 i += 1; | 550 i += 1; |
| 500 if (i == 2) continue; | 551 if (i == 2) continue; |
| 501 v += await new Future.value(42); | 552 v += await new Future.value(42); |
| 502 } | 553 } |
| 503 return v; | 554 return v; |
| 504 } | 555 } |
| 556 |
| 505 return f().then((v) { | 557 return f().then((v) { |
| 506 expect(v, equals(42 * 9)); | 558 expect(v, equals(42 * 9)); |
| 507 }); | 559 }); |
| 508 }); | 560 }); |
| 509 | 561 |
| 510 test("continue after await", () { | 562 test("continue after await", () { |
| 511 f() async { | 563 f() async { |
| 512 int v = 0; | 564 int v = 0; |
| 513 int i = 0; | 565 int i = 0; |
| 514 while (i < 10) { | 566 while (i < 10) { |
| 515 i += 1; | 567 i += 1; |
| 516 int j = await new Future.value(42); | 568 int j = await new Future.value(42); |
| 517 if (i == 2) continue; | 569 if (i == 2) continue; |
| 518 v += j; | 570 v += j; |
| 519 } | 571 } |
| 520 return v; | 572 return v; |
| 521 } | 573 } |
| 574 |
| 522 return f().then((v) { | 575 return f().then((v) { |
| 523 expect(v, equals(42 * 9)); | 576 expect(v, equals(42 * 9)); |
| 524 }); | 577 }); |
| 525 }); | 578 }); |
| 526 }); | 579 }); |
| 527 | 580 |
| 528 group("do-while", () { | 581 group("do-while", () { |
| 529 test("await in loop", () { | 582 test("await in loop", () { |
| 530 f() async { | 583 f() async { |
| 531 int v = 0; | 584 int v = 0; |
| 532 int i = 0; | 585 int i = 0; |
| 533 do { | 586 do { |
| 534 v += await new Future.value(42); | 587 v += await new Future.value(42); |
| 535 i++; | 588 i++; |
| 536 } while (i < 10); | 589 } while (i < 10); |
| 537 return v; | 590 return v; |
| 538 } | 591 } |
| 592 |
| 539 return f().then((v) { | 593 return f().then((v) { |
| 540 expect(v, equals(10 * id(42))); | 594 expect(v, equals(10 * id(42))); |
| 541 }); | 595 }); |
| 542 }); | 596 }); |
| 543 | 597 |
| 544 test("await in test", () { | 598 test("await in test", () { |
| 545 f() async { | 599 f() async { |
| 546 int v = 0; | 600 int v = 0; |
| 547 int i = 0; | 601 int i = 0; |
| 548 do { | 602 do { |
| 549 v += 10; | 603 v += 10; |
| 550 i += 10; | 604 i += 10; |
| 551 } while (i < await new Future.value(42)); | 605 } while (i < await new Future.value(42)); |
| 552 return v; | 606 return v; |
| 553 } | 607 } |
| 608 |
| 554 return f().then((v) { | 609 return f().then((v) { |
| 555 expect(v, equals(10 * 5)); | 610 expect(v, equals(10 * 5)); |
| 556 }); | 611 }); |
| 557 }); | 612 }); |
| 558 | 613 |
| 559 test("await err in loop", () { | 614 test("await err in loop", () { |
| 560 f() async { | 615 f() async { |
| 561 int v = 0; | 616 int v = 0; |
| 562 int i = 0; | 617 int i = 0; |
| 563 do { | 618 do { |
| 564 v += await new Future.error("err"); | 619 v += await new Future.error("err"); |
| 565 i++; | 620 i++; |
| 566 } while (i < 10); | 621 } while (i < 10); |
| 567 return v; | 622 return v; |
| 568 } | 623 } |
| 569 return f().then((v) { fail("didn't throw"); }, | 624 |
| 570 onError: (e) { expect(e, equals("err")); }); | 625 return f().then((v) { |
| 626 fail("didn't throw"); |
| 627 }, onError: (e) { |
| 628 expect(e, equals("err")); |
| 629 }); |
| 571 }); | 630 }); |
| 572 | 631 |
| 573 test("await err in test", () { | 632 test("await err in test", () { |
| 574 f() async { | 633 f() async { |
| 575 int v = 0; | 634 int v = 0; |
| 576 int i = 0; | 635 int i = 0; |
| 577 do { | 636 do { |
| 578 v += 10; | 637 v += 10; |
| 579 i += 10; | 638 i += 10; |
| 580 } while (i < await new Future.error("err")); | 639 } while (i < await new Future.error("err")); |
| 581 return v; | 640 return v; |
| 582 } | 641 } |
| 583 return f().then((v) { fail("didn't throw"); }, | 642 |
| 584 onError: (e) { expect(e, equals("err")); }); | 643 return f().then((v) { |
| 644 fail("didn't throw"); |
| 645 }, onError: (e) { |
| 646 expect(e, equals("err")); |
| 647 }); |
| 585 }); | 648 }); |
| 586 | 649 |
| 587 test("break before await", () { | 650 test("break before await", () { |
| 588 f() async { | 651 f() async { |
| 589 int v = 0; | 652 int v = 0; |
| 590 int i = 0; | 653 int i = 0; |
| 591 do { | 654 do { |
| 592 if (i == 2) break; | 655 if (i == 2) break; |
| 593 v += await new Future.value(42); | 656 v += await new Future.value(42); |
| 594 i += 1; | 657 i += 1; |
| 595 } while (i < 10); | 658 } while (i < 10); |
| 596 return v; | 659 return v; |
| 597 } | 660 } |
| 661 |
| 598 return f().then((v) { | 662 return f().then((v) { |
| 599 expect(v, equals(42 * 2)); | 663 expect(v, equals(42 * 2)); |
| 600 }); | 664 }); |
| 601 }); | 665 }); |
| 602 | 666 |
| 603 test("break after await", () { | 667 test("break after await", () { |
| 604 f() async { | 668 f() async { |
| 605 int v = 0; | 669 int v = 0; |
| 606 int i = 0; | 670 int i = 0; |
| 607 do { | 671 do { |
| 608 v += await new Future.value(42); | 672 v += await new Future.value(42); |
| 609 if (i == 2) break; | 673 if (i == 2) break; |
| 610 i += 1; | 674 i += 1; |
| 611 } while (i < 10); | 675 } while (i < 10); |
| 612 return v; | 676 return v; |
| 613 } | 677 } |
| 678 |
| 614 return f().then((v) { | 679 return f().then((v) { |
| 615 expect(v, equals(42 * 3)); | 680 expect(v, equals(42 * 3)); |
| 616 }); | 681 }); |
| 617 }); | 682 }); |
| 618 | 683 |
| 619 test("continue before await", () { | 684 test("continue before await", () { |
| 620 f() async { | 685 f() async { |
| 621 int v = 0; | 686 int v = 0; |
| 622 int i = 0; | 687 int i = 0; |
| 623 do { | 688 do { |
| 624 i += 1; | 689 i += 1; |
| 625 if (i == 2) continue; | 690 if (i == 2) continue; |
| 626 v += await new Future.value(42); | 691 v += await new Future.value(42); |
| 627 } while (i < 10); | 692 } while (i < 10); |
| 628 return v; | 693 return v; |
| 629 } | 694 } |
| 695 |
| 630 return f().then((v) { | 696 return f().then((v) { |
| 631 expect(v, equals(42 * 9)); | 697 expect(v, equals(42 * 9)); |
| 632 }); | 698 }); |
| 633 }); | 699 }); |
| 634 | 700 |
| 635 test("continue after await", () { | 701 test("continue after await", () { |
| 636 f() async { | 702 f() async { |
| 637 int v = 0; | 703 int v = 0; |
| 638 int i = 0; | 704 int i = 0; |
| 639 do { | 705 do { |
| 640 i += 1; | 706 i += 1; |
| 641 int j = await new Future.value(42); | 707 int j = await new Future.value(42); |
| 642 if (i == 2) continue; | 708 if (i == 2) continue; |
| 643 v += j; | 709 v += j; |
| 644 } while (i < 10); | 710 } while (i < 10); |
| 645 return v; | 711 return v; |
| 646 } | 712 } |
| 713 |
| 647 return f().then((v) { | 714 return f().then((v) { |
| 648 expect(v, equals(42 * 9)); | 715 expect(v, equals(42 * 9)); |
| 649 }); | 716 }); |
| 650 }); | 717 }); |
| 651 }); | 718 }); |
| 652 | 719 |
| 653 group("for-in", () { | 720 group("for-in", () { |
| 654 test("await in for-in", () { | 721 test("await in for-in", () { |
| 655 f() async { | 722 f() async { |
| 656 var v = 0; | 723 var v = 0; |
| 657 for (var fut in [1, 2, 3].map((v) => new Future.value(v))) { | 724 for (var fut in [1, 2, 3].map((v) => new Future.value(v))) { |
| 658 v += await fut; | 725 v += await fut; |
| 659 } | 726 } |
| 660 return v; | 727 return v; |
| 661 } | 728 } |
| 729 |
| 662 return f().then((v) { | 730 return f().then((v) { |
| 663 expect(v, equals(6)); | 731 expect(v, equals(6)); |
| 664 }); | 732 }); |
| 665 }); | 733 }); |
| 666 | 734 |
| 667 test("await in for-in iterable", () { | 735 test("await in for-in iterable", () { |
| 668 f() async { | 736 f() async { |
| 669 var v = 0; | 737 var v = 0; |
| 670 for (var i in await new Future.value([1, 2, 3])) { | 738 for (var i in await new Future.value([1, 2, 3])) { |
| 671 v += i; | 739 v += i; |
| 672 } | 740 } |
| 673 return v; | 741 return v; |
| 674 } | 742 } |
| 743 |
| 675 return f().then((v) { | 744 return f().then((v) { |
| 676 expect(v, equals(6)); | 745 expect(v, equals(6)); |
| 677 }); | 746 }); |
| 678 }); | 747 }); |
| 679 | 748 |
| 680 test("await err in for-in", () { | 749 test("await err in for-in", () { |
| 681 f() async { | 750 f() async { |
| 682 var v = 0; | 751 var v = 0; |
| 683 for (var fut in [1, 2, 3].map((v) => (v != 1) | 752 for (var fut in [1, 2, 3].map( |
| 684 ? new Future.value(v) | 753 (v) => (v != 1) ? new Future.value(v) : new Future.error("err"))) { |
| 685 : new Future.error("err"))) { | |
| 686 v += await fut; | 754 v += await fut; |
| 687 } | 755 } |
| 688 return v; | 756 return v; |
| 689 } | 757 } |
| 690 return f().then((v) { fail("didn't throw"); }, | 758 |
| 691 onError: (e) { expect(e, equals("err")); }); | 759 return f().then((v) { |
| 760 fail("didn't throw"); |
| 761 }, onError: (e) { |
| 762 expect(e, equals("err")); |
| 763 }); |
| 692 }); | 764 }); |
| 693 | 765 |
| 694 test("await err in for-in iterable", () { | 766 test("await err in for-in iterable", () { |
| 695 f() async { | 767 f() async { |
| 696 var v = 0; | 768 var v = 0; |
| 697 for (var i in await new Future.error("err")) { | 769 for (var i in await new Future.error("err")) { |
| 698 v += i; | 770 v += i; |
| 699 } | 771 } |
| 700 return v; | 772 return v; |
| 701 } | 773 } |
| 702 return f().then((v) { fail("didn't throw"); }, | 774 |
| 703 onError: (e) { expect(e, equals("err")); }); | 775 return f().then((v) { |
| 776 fail("didn't throw"); |
| 777 }, onError: (e) { |
| 778 expect(e, equals("err")); |
| 779 }); |
| 704 }); | 780 }); |
| 705 | 781 |
| 706 test("break before await in for-in", () { | 782 test("break before await in for-in", () { |
| 707 f() async { | 783 f() async { |
| 708 var v = 0; | 784 var v = 0; |
| 709 for (var fut in [1, 2, 3].map((v) => new Future.value(v))) { | 785 for (var fut in [1, 2, 3].map((v) => new Future.value(v))) { |
| 710 if (v == 3) break; | 786 if (v == 3) break; |
| 711 v += await fut; | 787 v += await fut; |
| 712 } | 788 } |
| 713 return v; | 789 return v; |
| 714 } | 790 } |
| 791 |
| 715 return f().then((v) { | 792 return f().then((v) { |
| 716 expect(v, equals(3)); | 793 expect(v, equals(3)); |
| 717 }); | 794 }); |
| 718 }); | 795 }); |
| 719 }); | 796 }); |
| 720 | 797 |
| 721 group("try-catch", () { | 798 group("try-catch", () { |
| 722 test("try-no-catch", () { | 799 test("try-no-catch", () { |
| 723 f() async { | 800 f() async { |
| 724 try { | 801 try { |
| 725 return await id(42); | 802 return await id(42); |
| 726 } catch(e) { | 803 } catch (e) { |
| 727 return 37; | 804 return 37; |
| 728 } | 805 } |
| 729 } | 806 } |
| 807 |
| 730 return expect42(f()); | 808 return expect42(f()); |
| 731 }); | 809 }); |
| 732 | 810 |
| 733 test("await in body", () { | 811 test("await in body", () { |
| 734 f() async { | 812 f() async { |
| 735 try { | 813 try { |
| 736 await new Future.error(42); | 814 await new Future.error(42); |
| 737 } catch(e) { | 815 } catch (e) { |
| 738 return e; | 816 return e; |
| 739 } | 817 } |
| 740 } | 818 } |
| 819 |
| 741 return expect42(f()); | 820 return expect42(f()); |
| 742 }); | 821 }); |
| 743 | 822 |
| 744 test("throw before await in body", () { | 823 test("throw before await in body", () { |
| 745 int i = id(0); | 824 int i = id(0); |
| 746 f() async { | 825 f() async { |
| 747 try { | 826 try { |
| 748 if (i >= 0) throw id(42); | 827 if (i >= 0) throw id(42); |
| 749 return await new Future.value(10); | 828 return await new Future.value(10); |
| 750 } catch(e) { | 829 } catch (e) { |
| 751 return e; | 830 return e; |
| 752 } | 831 } |
| 753 } | 832 } |
| 833 |
| 754 return expect42(f()); | 834 return expect42(f()); |
| 755 }); | 835 }); |
| 756 | 836 |
| 757 test("try-catch await in catch", () { | 837 test("try-catch await in catch", () { |
| 758 f() async { | 838 f() async { |
| 759 try { | 839 try { |
| 760 throw id(42); | 840 throw id(42); |
| 761 } catch(e) { | 841 } catch (e) { |
| 762 return await new Future.value(e); | 842 return await new Future.value(e); |
| 763 } | 843 } |
| 764 } | 844 } |
| 845 |
| 765 return expect42(f()); | 846 return expect42(f()); |
| 766 }); | 847 }); |
| 767 | 848 |
| 768 test("try-catch await error in catch", () { | 849 test("try-catch await error in catch", () { |
| 769 f() async { | 850 f() async { |
| 770 try { | 851 try { |
| 771 throw id(42); | 852 throw id(42); |
| 772 } catch(e) { | 853 } catch (e) { |
| 773 await new Future.error("err"); | 854 await new Future.error("err"); |
| 774 } | 855 } |
| 775 } | 856 } |
| 776 return f().then((v) { fail("didn't throw"); }, | 857 |
| 777 onError: (e) { expect(e, equals("err")); }); | 858 return f().then((v) { |
| 859 fail("didn't throw"); |
| 860 }, onError: (e) { |
| 861 expect(e, equals("err")); |
| 862 }); |
| 778 }); | 863 }); |
| 779 | 864 |
| 780 test("try-catch-rethrow", () { | 865 test("try-catch-rethrow", () { |
| 781 f() async { | 866 f() async { |
| 782 try { | 867 try { |
| 783 await new Future.error("err"); | 868 await new Future.error("err"); |
| 784 } catch(e) { | 869 } catch (e) { |
| 785 if (e == id(42)) return; | 870 if (e == id(42)) return; |
| 786 rethrow; | 871 rethrow; |
| 787 } | 872 } |
| 788 } | 873 } |
| 789 return f().then((v) { fail("didn't throw"); }, | 874 |
| 790 onError: (e) { expect(e, equals("err")); }); | 875 return f().then((v) { |
| 876 fail("didn't throw"); |
| 877 }, onError: (e) { |
| 878 expect(e, equals("err")); |
| 879 }); |
| 791 }); | 880 }); |
| 792 }); | 881 }); |
| 793 | 882 |
| 794 group("try-finally", () { | 883 group("try-finally", () { |
| 795 test("await in body", () { | 884 test("await in body", () { |
| 796 f() async { | 885 f() async { |
| 797 try { | 886 try { |
| 798 return await new Future.value(42); | 887 return await new Future.value(42); |
| 799 } finally { | 888 } finally { |
| 800 // Don't do anything. | 889 // Don't do anything. |
| 801 } | 890 } |
| 802 } | 891 } |
| 892 |
| 803 return expect42(f()); | 893 return expect42(f()); |
| 804 }); | 894 }); |
| 805 | 895 |
| 806 test("await in finally", () { | 896 test("await in finally", () { |
| 807 var x = 0; | 897 var x = 0; |
| 808 f() async { | 898 f() async { |
| 809 try { | 899 try { |
| 810 return id(42); | 900 return id(42); |
| 811 } finally { | 901 } finally { |
| 812 x = await new Future.value(37); | 902 x = await new Future.value(37); |
| 813 } | 903 } |
| 814 } | 904 } |
| 905 |
| 815 return f().then((v) { | 906 return f().then((v) { |
| 816 expect(v, equals(42)); | 907 expect(v, equals(42)); |
| 817 expect(x, equals(37)); | 908 expect(x, equals(37)); |
| 818 }); | 909 }); |
| 819 }); | 910 }); |
| 820 | 911 |
| 821 test("await err in body", () { | 912 test("await err in body", () { |
| 822 f() async { | 913 f() async { |
| 823 try { | 914 try { |
| 824 return await new Future.error("err"); | 915 return await new Future.error("err"); |
| 825 } finally { | 916 } finally { |
| 826 // Don't do anything. | 917 // Don't do anything. |
| 827 } | 918 } |
| 828 } | 919 } |
| 829 return f().then((v) { fail("didn't throw"); }, | 920 |
| 830 onError: (e) { expect(e, equals("err")); }); | 921 return f().then((v) { |
| 922 fail("didn't throw"); |
| 923 }, onError: (e) { |
| 924 expect(e, equals("err")); |
| 925 }); |
| 831 }); | 926 }); |
| 832 | 927 |
| 833 test("await err in finally", () { | 928 test("await err in finally", () { |
| 834 f() async { | 929 f() async { |
| 835 try { | 930 try { |
| 836 return id(42); | 931 return id(42); |
| 837 } finally { | 932 } finally { |
| 838 await new Future.error("err"); | 933 await new Future.error("err"); |
| 839 } | 934 } |
| 840 } | 935 } |
| 841 return f().then((v) { fail("didn't throw"); }, | 936 |
| 842 onError: (e) { expect(e, equals("err")); }); | 937 return f().then((v) { |
| 938 fail("didn't throw"); |
| 939 }, onError: (e) { |
| 940 expect(e, equals("err")); |
| 941 }); |
| 843 }); | 942 }); |
| 844 | 943 |
| 845 test("await err in both", () { | 944 test("await err in both", () { |
| 846 f() async { | 945 f() async { |
| 847 try { | 946 try { |
| 848 await new Future.error("not err"); | 947 await new Future.error("not err"); |
| 849 } finally { | 948 } finally { |
| 850 await new Future.error("err"); | 949 await new Future.error("err"); |
| 851 } | 950 } |
| 852 } | 951 } |
| 853 return f().then((v) { fail("didn't throw"); }, | 952 |
| 854 onError: (e) { expect(e, equals("err")); }); | 953 return f().then((v) { |
| 954 fail("didn't throw"); |
| 955 }, onError: (e) { |
| 956 expect(e, equals("err")); |
| 957 }); |
| 855 }); | 958 }); |
| 856 | 959 |
| 857 test("await err in body, override in finally", () { | 960 test("await err in body, override in finally", () { |
| 858 f() async { | 961 f() async { |
| 859 try { | 962 try { |
| 860 return await new Future.error("err"); | 963 return await new Future.error("err"); |
| 861 } finally { | 964 } finally { |
| 862 return id(42); | 965 return id(42); |
| 863 } | 966 } |
| 864 } | 967 } |
| 968 |
| 865 return expect42(f()); | 969 return expect42(f()); |
| 866 }); | 970 }); |
| 867 | 971 |
| 868 test("await in body, override in finally", () { | 972 test("await in body, override in finally", () { |
| 869 f() async { | 973 f() async { |
| 870 label: try { | 974 label: |
| 975 try { |
| 871 return await new Future.value(37); | 976 return await new Future.value(37); |
| 872 } finally { | 977 } finally { |
| 873 break label; | 978 break label; |
| 874 } | 979 } |
| 875 return id(42); | 980 return id(42); |
| 876 } | 981 } |
| 982 |
| 877 return expect42(f()); | 983 return expect42(f()); |
| 878 }); | 984 }); |
| 879 | 985 |
| 880 test("await, override in finally", () { | 986 test("await, override in finally", () { |
| 881 var x = 0; | 987 var x = 0; |
| 882 f() async { | 988 f() async { |
| 883 label: try { | 989 label: |
| 990 try { |
| 884 return 87; | 991 return 87; |
| 885 } finally { | 992 } finally { |
| 886 x = await new Future.value(37); | 993 x = await new Future.value(37); |
| 887 break label; | 994 break label; |
| 888 } | 995 } |
| 889 return id(42); | 996 return id(42); |
| 890 } | 997 } |
| 998 |
| 891 return f().then((v) { | 999 return f().then((v) { |
| 892 expect(v, equals(42)); | 1000 expect(v, equals(42)); |
| 893 expect(x, equals(37)); | 1001 expect(x, equals(37)); |
| 894 }); | 1002 }); |
| 895 }); | 1003 }); |
| 896 | 1004 |
| 897 test("throw in body, await, override in finally 3", () { | 1005 test("throw in body, await, override in finally 3", () { |
| 898 var x = 0; | 1006 var x = 0; |
| 899 f() async { | 1007 f() async { |
| 900 label: try { | 1008 label: |
| 1009 try { |
| 901 throw "err"; | 1010 throw "err"; |
| 902 } finally { | 1011 } finally { |
| 903 x = await new Future.value(37); | 1012 x = await new Future.value(37); |
| 904 break label; | 1013 break label; |
| 905 } | 1014 } |
| 906 return id(42); | 1015 return id(42); |
| 907 } | 1016 } |
| 1017 |
| 908 return f().then((v) { | 1018 return f().then((v) { |
| 909 expect(v, equals(42)); | 1019 expect(v, equals(42)); |
| 910 expect(x, equals(37)); | 1020 expect(x, equals(37)); |
| 911 }); | 1021 }); |
| 912 }); | 1022 }); |
| 913 | 1023 |
| 914 test("await err in body, override in finally 2", () { | 1024 test("await err in body, override in finally 2", () { |
| 915 f() async { | 1025 f() async { |
| 916 label: try { | 1026 label: |
| 1027 try { |
| 917 return await new Future.error("err"); | 1028 return await new Future.error("err"); |
| 918 } finally { | 1029 } finally { |
| 919 break label; | 1030 break label; |
| 920 } | 1031 } |
| 921 return id(42); | 1032 return id(42); |
| 922 } | 1033 } |
| 1034 |
| 923 return expect42(f()); | 1035 return expect42(f()); |
| 924 }); | 1036 }); |
| 925 | 1037 |
| 926 test("await in body, no-exit in finally", () { | 1038 test("await in body, no-exit in finally", () { |
| 927 f() async { | 1039 f() async { |
| 928 for (int i = 0; i < 10; i++) { | 1040 for (int i = 0; i < 10; i++) { |
| 929 try { | 1041 try { |
| 930 return await i; | 1042 return await i; |
| 931 } finally { | 1043 } finally { |
| 932 continue; | 1044 continue; |
| 933 } | 1045 } |
| 934 } | 1046 } |
| 935 return id(42); | 1047 return id(42); |
| 936 } | 1048 } |
| 1049 |
| 937 return expect42(f()); | 1050 return expect42(f()); |
| 938 }); | 1051 }); |
| 939 | 1052 |
| 940 test("no-exit after await in finally", () { | 1053 test("no-exit after await in finally", () { |
| 941 f() async { | 1054 f() async { |
| 942 int i = 0; | 1055 int i = 0; |
| 943 for (; i < 10; i++) { | 1056 for (; i < 10; i++) { |
| 944 try { | 1057 try { |
| 945 break; | 1058 break; |
| 946 } finally { | 1059 } finally { |
| 947 await new Future.value(42); | 1060 await new Future.value(42); |
| 948 continue; | 1061 continue; |
| 949 } | 1062 } |
| 950 } | 1063 } |
| 951 return id(i); | 1064 return id(i); |
| 952 } | 1065 } |
| 1066 |
| 953 return f().then((v) { | 1067 return f().then((v) { |
| 954 expect(v, equals(10)); | 1068 expect(v, equals(10)); |
| 955 }); | 1069 }); |
| 956 }); | 1070 }); |
| 957 | 1071 |
| 958 test("exit after continue, await in finally", () { | 1072 test("exit after continue, await in finally", () { |
| 959 f() async { | 1073 f() async { |
| 960 int i = 0; | 1074 int i = 0; |
| 961 for (; i < 10; i++) { | 1075 for (; i < 10; i++) { |
| 962 try { | 1076 try { |
| 963 continue; | 1077 continue; |
| 964 } finally { | 1078 } finally { |
| 965 await new Future.value(42); | 1079 await new Future.value(42); |
| 966 break; | 1080 break; |
| 967 } | 1081 } |
| 968 } | 1082 } |
| 969 return id(i); | 1083 return id(i); |
| 970 } | 1084 } |
| 1085 |
| 971 return f().then((v) { | 1086 return f().then((v) { |
| 972 expect(v, equals(0)); | 1087 expect(v, equals(0)); |
| 973 }); | 1088 }); |
| 974 }); | 1089 }); |
| 975 | 1090 |
| 976 test("no-exit before await in finally 2", () { | 1091 test("no-exit before await in finally 2", () { |
| 977 f() async { | 1092 f() async { |
| 978 for (int i = 0; i < 10; i++) { | 1093 for (int i = 0; i < 10; i++) { |
| 979 try { | 1094 try { |
| 980 return i; | 1095 return i; |
| 981 } finally { | 1096 } finally { |
| 982 if (i >= 0) continue; | 1097 if (i >= 0) continue; |
| 983 await new Future.value(42); | 1098 await new Future.value(42); |
| 984 } | 1099 } |
| 985 } | 1100 } |
| 986 return id(42); | 1101 return id(42); |
| 987 } | 1102 } |
| 1103 |
| 988 return expect42(f()); | 1104 return expect42(f()); |
| 989 }); | 1105 }); |
| 990 | 1106 |
| 991 test("no-exit after await in finally", () { | 1107 test("no-exit after await in finally", () { |
| 992 f() async { | 1108 f() async { |
| 993 for (int i = 0; i < 10; i++) { | 1109 for (int i = 0; i < 10; i++) { |
| 994 try { | 1110 try { |
| 995 return i; | 1111 return i; |
| 996 } finally { | 1112 } finally { |
| 997 await new Future.value(42); | 1113 await new Future.value(42); |
| 998 continue; | 1114 continue; |
| 999 } | 1115 } |
| 1000 } | 1116 } |
| 1001 return id(42); | 1117 return id(42); |
| 1002 } | 1118 } |
| 1119 |
| 1003 return expect42(f()); | 1120 return expect42(f()); |
| 1004 }); | 1121 }); |
| 1005 | 1122 |
| 1006 test("nested finallies", () { | 1123 test("nested finallies", () { |
| 1007 var x = 0; | 1124 var x = 0; |
| 1008 f() async { | 1125 f() async { |
| 1009 try { | 1126 try { |
| 1010 try { | 1127 try { |
| 1011 return 42; | 1128 return 42; |
| 1012 } finally { | 1129 } finally { |
| 1013 x = await new Future.value(37); | 1130 x = await new Future.value(37); |
| 1014 } | 1131 } |
| 1015 } finally { | 1132 } finally { |
| 1016 x += await new Future.value(37); | 1133 x += await new Future.value(37); |
| 1017 } | 1134 } |
| 1018 } | 1135 } |
| 1136 |
| 1019 return f().then((v) { | 1137 return f().then((v) { |
| 1020 expect(v, equals(42)); | 1138 expect(v, equals(42)); |
| 1021 expect(x, equals(74)); | 1139 expect(x, equals(74)); |
| 1022 }); | 1140 }); |
| 1023 }); | 1141 }); |
| 1024 | 1142 |
| 1025 test("nested finallies 2", () { | 1143 test("nested finallies 2", () { |
| 1026 var x = 0; | 1144 var x = 0; |
| 1027 f() async { | 1145 f() async { |
| 1028 label: try { | 1146 label: |
| 1147 try { |
| 1029 try { | 1148 try { |
| 1030 break label; | 1149 break label; |
| 1031 } finally { | 1150 } finally { |
| 1032 x = await new Future.value(37); | 1151 x = await new Future.value(37); |
| 1033 } | 1152 } |
| 1034 } finally { | 1153 } finally { |
| 1035 x += await new Future.value(37); | 1154 x += await new Future.value(37); |
| 1036 } | 1155 } |
| 1037 return 42; | 1156 return 42; |
| 1038 } | 1157 } |
| 1158 |
| 1039 return f().then((v) { | 1159 return f().then((v) { |
| 1040 expect(v, equals(42)); | 1160 expect(v, equals(42)); |
| 1041 expect(x, equals(74)); | 1161 expect(x, equals(74)); |
| 1042 }); | 1162 }); |
| 1043 }); | 1163 }); |
| 1044 | 1164 |
| 1045 test("nested finallies 3", () { | 1165 test("nested finallies 3", () { |
| 1046 var x = 0; | 1166 var x = 0; |
| 1047 f() async { | 1167 f() async { |
| 1048 label: try { | 1168 label: |
| 1169 try { |
| 1049 try { | 1170 try { |
| 1050 break label; | 1171 break label; |
| 1051 } finally { | 1172 } finally { |
| 1052 return await new Future.value(42); | 1173 return await new Future.value(42); |
| 1053 } | 1174 } |
| 1054 } finally { | 1175 } finally { |
| 1055 break label; | 1176 break label; |
| 1056 } | 1177 } |
| 1057 return 42; | 1178 return 42; |
| 1058 } | 1179 } |
| 1180 |
| 1059 return expect42(f()); | 1181 return expect42(f()); |
| 1060 }); | 1182 }); |
| 1061 | 1183 |
| 1062 test("nested finallies, throw", () { | 1184 test("nested finallies, throw", () { |
| 1063 var x = 0; | 1185 var x = 0; |
| 1064 f() async { | 1186 f() async { |
| 1065 try { | 1187 try { |
| 1066 try { | 1188 try { |
| 1067 throw "err"; | 1189 throw "err"; |
| 1068 } finally { | 1190 } finally { |
| 1069 x = await new Future.value(37); | 1191 x = await new Future.value(37); |
| 1070 } | 1192 } |
| 1071 } finally { | 1193 } finally { |
| 1072 x += await new Future.value(37); | 1194 x += await new Future.value(37); |
| 1073 } | 1195 } |
| 1074 } | 1196 } |
| 1075 return f().then((v) { fail("didn't throw"); }, | 1197 |
| 1076 onError: (e) { | 1198 return f().then((v) { |
| 1077 expect(e, equals("err")); | 1199 fail("didn't throw"); |
| 1078 expect(x, equals(2 * 37)); | 1200 }, onError: (e) { |
| 1079 }); | 1201 expect(e, equals("err")); |
| 1202 expect(x, equals(2 * 37)); |
| 1203 }); |
| 1080 }); | 1204 }); |
| 1081 }); | 1205 }); |
| 1082 | 1206 |
| 1083 group("try-catch-finally", () { | 1207 group("try-catch-finally", () { |
| 1084 test("await in body", () { | 1208 test("await in body", () { |
| 1085 f() async { | 1209 f() async { |
| 1086 try { | 1210 try { |
| 1087 return await new Future.value(42); | 1211 return await new Future.value(42); |
| 1088 } catch (e) { | 1212 } catch (e) { |
| 1089 throw null; | 1213 throw null; |
| 1090 } finally { | 1214 } finally { |
| 1091 if (id(42) == id(10)) return 10; | 1215 if (id(42) == id(10)) return 10; |
| 1092 } | 1216 } |
| 1093 } | 1217 } |
| 1218 |
| 1094 return expect42(f()); | 1219 return expect42(f()); |
| 1095 }); | 1220 }); |
| 1096 | 1221 |
| 1097 test("await in catch, not hit", () { | 1222 test("await in catch, not hit", () { |
| 1098 f() async { | 1223 f() async { |
| 1099 try { | 1224 try { |
| 1100 return id(42); | 1225 return id(42); |
| 1101 } catch (e) { | 1226 } catch (e) { |
| 1102 await new Future.error("err"); | 1227 await new Future.error("err"); |
| 1103 } finally { | 1228 } finally { |
| 1104 if (id(42) == id(10)) return 10; | 1229 if (id(42) == id(10)) return 10; |
| 1105 } | 1230 } |
| 1106 } | 1231 } |
| 1232 |
| 1107 return expect42(f()); | 1233 return expect42(f()); |
| 1108 }); | 1234 }); |
| 1109 | 1235 |
| 1110 test("await in catch, hit", () { | 1236 test("await in catch, hit", () { |
| 1111 f() async { | 1237 f() async { |
| 1112 try { | 1238 try { |
| 1113 return throw id(42); | 1239 return throw id(42); |
| 1114 } catch (e) { | 1240 } catch (e) { |
| 1115 return await new Future.value(e); | 1241 return await new Future.value(e); |
| 1116 } finally { | 1242 } finally { |
| 1117 if (id(42) == id(10)) return 10; | 1243 if (id(42) == id(10)) return 10; |
| 1118 } | 1244 } |
| 1119 } | 1245 } |
| 1246 |
| 1120 return expect42(f()); | 1247 return expect42(f()); |
| 1121 }); | 1248 }); |
| 1122 | 1249 |
| 1123 test("await in finally", () { | 1250 test("await in finally", () { |
| 1124 var x = 0; | 1251 var x = 0; |
| 1125 f() async { | 1252 f() async { |
| 1126 try { | 1253 try { |
| 1127 return id(42); | 1254 return id(42); |
| 1128 } catch (e) { | 1255 } catch (e) { |
| 1129 throw null; | 1256 throw null; |
| 1130 } finally { | 1257 } finally { |
| 1131 x = await new Future.value(37); | 1258 x = await new Future.value(37); |
| 1132 if (id(42) == id(10)) return 10; | 1259 if (id(42) == id(10)) return 10; |
| 1133 } | 1260 } |
| 1134 } | 1261 } |
| 1262 |
| 1135 return f().then((v) { | 1263 return f().then((v) { |
| 1136 expect(v, equals(42)); | 1264 expect(v, equals(42)); |
| 1137 expect(x, equals(37)); | 1265 expect(x, equals(37)); |
| 1138 }); | 1266 }); |
| 1139 }); | 1267 }); |
| 1140 }); | 1268 }); |
| 1141 | 1269 |
| 1142 group("switch", () { | 1270 group("switch", () { |
| 1143 test("await in expression", () { | 1271 test("await in expression", () { |
| 1144 f(v) async { | 1272 f(v) async { |
| 1145 switch (await new Future.value(v)) { | 1273 switch (await new Future.value(v)) { |
| 1146 case 1: return 1; | 1274 case 1: |
| 1147 case 2: return 42; | 1275 return 1; |
| 1148 default: return 3; | 1276 case 2: |
| 1277 return 42; |
| 1278 default: |
| 1279 return 3; |
| 1149 } | 1280 } |
| 1150 return null; | 1281 return null; |
| 1151 } | 1282 } |
| 1283 |
| 1152 return expect42(f(2)); | 1284 return expect42(f(2)); |
| 1153 }); | 1285 }); |
| 1154 | 1286 |
| 1155 test("await err in expression", () { | 1287 test("await err in expression", () { |
| 1156 f(v) async { | 1288 f(v) async { |
| 1157 switch (await new Future.error("err")) { | 1289 switch (await new Future.error("err")) { |
| 1158 case 1: return 1; | 1290 case 1: |
| 1159 case 2: return 42; | 1291 return 1; |
| 1160 default: return 3; | 1292 case 2: |
| 1293 return 42; |
| 1294 default: |
| 1295 return 3; |
| 1161 } | 1296 } |
| 1162 return null; | 1297 return null; |
| 1163 } | 1298 } |
| 1299 |
| 1164 return throwsErr(f(2)); | 1300 return throwsErr(f(2)); |
| 1165 }); | 1301 }); |
| 1166 | 1302 |
| 1167 test("await in case", () { | 1303 test("await in case", () { |
| 1168 f(v) async { | 1304 f(v) async { |
| 1169 switch (v) { | 1305 switch (v) { |
| 1170 case 1: return 1; | 1306 case 1: |
| 1171 case 2: return await new Future.value(42); | 1307 return 1; |
| 1172 default: return 3; | 1308 case 2: |
| 1309 return await new Future.value(42); |
| 1310 default: |
| 1311 return 3; |
| 1173 } | 1312 } |
| 1174 return null; | 1313 return null; |
| 1175 } | 1314 } |
| 1315 |
| 1176 return expect42(f(2)); | 1316 return expect42(f(2)); |
| 1177 }); | 1317 }); |
| 1178 | 1318 |
| 1179 test("await err in case", () { | 1319 test("await err in case", () { |
| 1180 f(v) async { | 1320 f(v) async { |
| 1181 switch (v) { | 1321 switch (v) { |
| 1182 case 1: return 1; | 1322 case 1: |
| 1183 case 2: return await new Future.error("err"); | 1323 return 1; |
| 1184 default: return 3; | 1324 case 2: |
| 1325 return await new Future.error("err"); |
| 1326 default: |
| 1327 return 3; |
| 1185 } | 1328 } |
| 1186 return null; | 1329 return null; |
| 1187 } | 1330 } |
| 1331 |
| 1188 return throwsErr(f(2)); | 1332 return throwsErr(f(2)); |
| 1189 }); | 1333 }); |
| 1190 // TODO(jmesserly): restore this when we fix | 1334 // TODO(jmesserly): restore this when we fix |
| 1191 // https://github.com/dart-lang/dev_compiler/issues/263 | 1335 // https://github.com/dart-lang/dev_compiler/issues/263 |
| 1192 /*test("continue before await in case", () { | 1336 /*test("continue before await in case", () { |
| 1193 f(v) async { | 1337 f(v) async { |
| 1194 switch (v) { | 1338 switch (v) { |
| 1195 label: | 1339 label: |
| 1196 case 1: return 42; | 1340 case 1: return 42; |
| 1197 case 2: | 1341 case 2: |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1222 | 1366 |
| 1223 group("if", () { | 1367 group("if", () { |
| 1224 test("await in test", () { | 1368 test("await in test", () { |
| 1225 f(v) async { | 1369 f(v) async { |
| 1226 if (await new Future.value(v)) { | 1370 if (await new Future.value(v)) { |
| 1227 return 42; | 1371 return 42; |
| 1228 } else { | 1372 } else { |
| 1229 return 37; | 1373 return 37; |
| 1230 } | 1374 } |
| 1231 } | 1375 } |
| 1376 |
| 1232 return expect42(f(true)); | 1377 return expect42(f(true)); |
| 1233 }); | 1378 }); |
| 1234 | 1379 |
| 1235 test("await err in test", () { | 1380 test("await err in test", () { |
| 1236 f(v) async { | 1381 f(v) async { |
| 1237 if (await new Future.error("err")) { | 1382 if (await new Future.error("err")) { |
| 1238 return 42; | 1383 return 42; |
| 1239 } else { | 1384 } else { |
| 1240 return 37; | 1385 return 37; |
| 1241 } | 1386 } |
| 1242 } | 1387 } |
| 1388 |
| 1243 return throwsErr(f(true)); | 1389 return throwsErr(f(true)); |
| 1244 }); | 1390 }); |
| 1245 | 1391 |
| 1246 test("await in then", () { | 1392 test("await in then", () { |
| 1247 f(v) async { | 1393 f(v) async { |
| 1248 if (v) { | 1394 if (v) { |
| 1249 return await new Future.value(42); | 1395 return await new Future.value(42); |
| 1250 } | 1396 } |
| 1251 return 37; | 1397 return 37; |
| 1252 } | 1398 } |
| 1399 |
| 1253 return expect42(f(true)); | 1400 return expect42(f(true)); |
| 1254 }); | 1401 }); |
| 1255 | 1402 |
| 1256 test("await err in then", () { | 1403 test("await err in then", () { |
| 1257 f(v) async { | 1404 f(v) async { |
| 1258 if (v) { | 1405 if (v) { |
| 1259 return await new Future.error("err"); | 1406 return await new Future.error("err"); |
| 1260 } | 1407 } |
| 1261 return 37; | 1408 return 37; |
| 1262 } | 1409 } |
| 1410 |
| 1263 return throwsErr(f(true)); | 1411 return throwsErr(f(true)); |
| 1264 }); | 1412 }); |
| 1265 | 1413 |
| 1266 test("await in then with else", () { | 1414 test("await in then with else", () { |
| 1267 f(v) async { | 1415 f(v) async { |
| 1268 if (v) { | 1416 if (v) { |
| 1269 return await new Future.value(42); | 1417 return await new Future.value(42); |
| 1270 } else { | 1418 } else { |
| 1271 return 87; | 1419 return 87; |
| 1272 } | 1420 } |
| 1273 return 37; | 1421 return 37; |
| 1274 } | 1422 } |
| 1423 |
| 1275 return expect42(f(true)); | 1424 return expect42(f(true)); |
| 1276 }); | 1425 }); |
| 1277 | 1426 |
| 1278 test("await err in then with else", () { | 1427 test("await err in then with else", () { |
| 1279 f(v) async { | 1428 f(v) async { |
| 1280 if (v) { | 1429 if (v) { |
| 1281 return await new Future.error("err"); | 1430 return await new Future.error("err"); |
| 1282 } else { | 1431 } else { |
| 1283 return 87; | 1432 return 87; |
| 1284 } | 1433 } |
| 1285 return 37; | 1434 return 37; |
| 1286 } | 1435 } |
| 1436 |
| 1287 return throwsErr(f(true)); | 1437 return throwsErr(f(true)); |
| 1288 }); | 1438 }); |
| 1289 | 1439 |
| 1290 test("await in else", () { | 1440 test("await in else", () { |
| 1291 f(v) async { | 1441 f(v) async { |
| 1292 if (v) { | 1442 if (v) { |
| 1293 return 37; | 1443 return 37; |
| 1294 } else { | 1444 } else { |
| 1295 return await new Future.value(42); | 1445 return await new Future.value(42); |
| 1296 } | 1446 } |
| 1297 return 87; | 1447 return 87; |
| 1298 } | 1448 } |
| 1449 |
| 1299 return expect42(f(false)); | 1450 return expect42(f(false)); |
| 1300 }); | 1451 }); |
| 1301 | 1452 |
| 1302 test("await err in else", () { | 1453 test("await err in else", () { |
| 1303 f(v) async { | 1454 f(v) async { |
| 1304 if (v) { | 1455 if (v) { |
| 1305 return 37; | 1456 return 37; |
| 1306 } else { | 1457 } else { |
| 1307 return await new Future.error("err"); | 1458 return await new Future.error("err"); |
| 1308 } | 1459 } |
| 1309 return 87; | 1460 return 87; |
| 1310 } | 1461 } |
| 1462 |
| 1311 return throwsErr(f(false)); | 1463 return throwsErr(f(false)); |
| 1312 }); | 1464 }); |
| 1313 | 1465 |
| 1314 test("await in else-if test", () { | 1466 test("await in else-if test", () { |
| 1315 f(v) async { | 1467 f(v) async { |
| 1316 if (v) { | 1468 if (v) { |
| 1317 return 37; | 1469 return 37; |
| 1318 } else if (!await new Future.value(v)) { | 1470 } else if (!await new Future.value(v)) { |
| 1319 return 42; | 1471 return 42; |
| 1320 } else { | 1472 } else { |
| 1321 return 37; | 1473 return 37; |
| 1322 } | 1474 } |
| 1323 return 87; | 1475 return 87; |
| 1324 } | 1476 } |
| 1477 |
| 1325 return expect42(f(false)); | 1478 return expect42(f(false)); |
| 1326 }); | 1479 }); |
| 1327 | 1480 |
| 1328 test("await in else-if then", () { | 1481 test("await in else-if then", () { |
| 1329 f(v) async { | 1482 f(v) async { |
| 1330 if (v) { | 1483 if (v) { |
| 1331 return 37; | 1484 return 37; |
| 1332 } else if (!v) { | 1485 } else if (!v) { |
| 1333 return await new Future.value(42); | 1486 return await new Future.value(42); |
| 1334 } else { | 1487 } else { |
| 1335 return 37; | 1488 return 37; |
| 1336 } | 1489 } |
| 1337 return 87; | 1490 return 87; |
| 1338 } | 1491 } |
| 1492 |
| 1339 return expect42(f(false)); | 1493 return expect42(f(false)); |
| 1340 }); | 1494 }); |
| 1341 }); | 1495 }); |
| 1342 | 1496 |
| 1343 group("conditional operator", () { | 1497 group("conditional operator", () { |
| 1344 test("await in test", () { | 1498 test("await in test", () { |
| 1345 f(v) async { | 1499 f(v) async { |
| 1346 return (await new Future.value(v)) ? 42 : 37; | 1500 return (await new Future.value(v)) ? 42 : 37; |
| 1347 } | 1501 } |
| 1502 |
| 1348 return expect42(f(true)); | 1503 return expect42(f(true)); |
| 1349 }); | 1504 }); |
| 1350 | 1505 |
| 1351 test("await err in test", () { | 1506 test("await err in test", () { |
| 1352 f(v) async { | 1507 f(v) async { |
| 1353 return (await new Future.error("err")) ? 42 : 37; | 1508 return (await new Future.error("err")) ? 42 : 37; |
| 1354 } | 1509 } |
| 1510 |
| 1355 return throwsErr(f(true)); | 1511 return throwsErr(f(true)); |
| 1356 }); | 1512 }); |
| 1357 | 1513 |
| 1358 test("await in then", () { | 1514 test("await in then", () { |
| 1359 f(v) async { | 1515 f(v) async { |
| 1360 return v ? (await new Future.value(42)) : 37; | 1516 return v ? (await new Future.value(42)) : 37; |
| 1361 } | 1517 } |
| 1518 |
| 1362 return expect42(f(true)); | 1519 return expect42(f(true)); |
| 1363 }); | 1520 }); |
| 1364 | 1521 |
| 1365 test("await err in then", () { | 1522 test("await err in then", () { |
| 1366 f(v) async { | 1523 f(v) async { |
| 1367 return v ? (await new Future.error("err")) : 37; | 1524 return v ? (await new Future.error("err")) : 37; |
| 1368 } | 1525 } |
| 1526 |
| 1369 return throwsErr(f(true)); | 1527 return throwsErr(f(true)); |
| 1370 }); | 1528 }); |
| 1371 | 1529 |
| 1372 test("await in else", () { | 1530 test("await in else", () { |
| 1373 f(v) async { | 1531 f(v) async { |
| 1374 return v ? 37 : (await new Future.value(42)); | 1532 return v ? 37 : (await new Future.value(42)); |
| 1375 } | 1533 } |
| 1534 |
| 1376 return expect42(f(false)); | 1535 return expect42(f(false)); |
| 1377 }); | 1536 }); |
| 1378 | 1537 |
| 1379 test("await err in else", () { | 1538 test("await err in else", () { |
| 1380 f(v) async { | 1539 f(v) async { |
| 1381 return v ? 37 : (await new Future.error("err")); | 1540 return v ? 37 : (await new Future.error("err")); |
| 1382 } | 1541 } |
| 1542 |
| 1383 return throwsErr(f(false)); | 1543 return throwsErr(f(false)); |
| 1384 }); | 1544 }); |
| 1385 }); | 1545 }); |
| 1386 | 1546 |
| 1387 group("async declarations", () { | 1547 group("async declarations", () { |
| 1388 var f42 = new Future.value(42); | 1548 var f42 = new Future.value(42); |
| 1389 | 1549 |
| 1390 // Top-level declarations or local declarations in top-level functions. | 1550 // Top-level declarations or local declarations in top-level functions. |
| 1391 test("topMethod", () { | 1551 test("topMethod", () { |
| 1392 return expect42(topMethod(f42)); | 1552 return expect42(topMethod(f42)); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1546 | 1706 |
| 1547 group("await expression", () { | 1707 group("await expression", () { |
| 1548 const c42 = 42; | 1708 const c42 = 42; |
| 1549 final v42 = 42; | 1709 final v42 = 42; |
| 1550 | 1710 |
| 1551 test("local variable", () { | 1711 test("local variable", () { |
| 1552 var l42 = 42; | 1712 var l42 = 42; |
| 1553 f() async { | 1713 f() async { |
| 1554 return await l42; | 1714 return await l42; |
| 1555 } | 1715 } |
| 1716 |
| 1556 return expect42(f()); | 1717 return expect42(f()); |
| 1557 }); | 1718 }); |
| 1558 | 1719 |
| 1559 test("parameter", () { | 1720 test("parameter", () { |
| 1560 f(p) async { | 1721 f(p) async { |
| 1561 return await p; | 1722 return await p; |
| 1562 } | 1723 } |
| 1724 |
| 1563 return expect42(f(42)); | 1725 return expect42(f(42)); |
| 1564 }); | 1726 }); |
| 1565 | 1727 |
| 1566 test("final local variable", () { | 1728 test("final local variable", () { |
| 1567 f() async { | 1729 f() async { |
| 1568 return await v42; | 1730 return await v42; |
| 1569 } | 1731 } |
| 1732 |
| 1570 return expect42(f()); | 1733 return expect42(f()); |
| 1571 }); | 1734 }); |
| 1572 | 1735 |
| 1573 test("const local variable", () { | 1736 test("const local variable", () { |
| 1574 f() async { | 1737 f() async { |
| 1575 return await c42; | 1738 return await c42; |
| 1576 } | 1739 } |
| 1740 |
| 1577 return expect42(f()); | 1741 return expect42(f()); |
| 1578 }); | 1742 }); |
| 1579 | 1743 |
| 1580 test("unary prefix operator", () { | 1744 test("unary prefix operator", () { |
| 1581 f() async { | 1745 f() async { |
| 1582 return -await -42; | 1746 return -await -42; |
| 1583 } | 1747 } |
| 1748 |
| 1584 return expect42(f()); | 1749 return expect42(f()); |
| 1585 }); | 1750 }); |
| 1586 | 1751 |
| 1587 test("suffix operator", () { | 1752 test("suffix operator", () { |
| 1588 f() async { | 1753 f() async { |
| 1589 var v = [42]; | 1754 var v = [42]; |
| 1590 return await v[0]; | 1755 return await v[0]; |
| 1591 } | 1756 } |
| 1757 |
| 1592 return expect42(f()); | 1758 return expect42(f()); |
| 1593 }); | 1759 }); |
| 1594 | 1760 |
| 1595 test("unary postfix operator", () { | 1761 test("unary postfix operator", () { |
| 1596 f() async { | 1762 f() async { |
| 1597 var x = 42; | 1763 var x = 42; |
| 1598 return await x++; | 1764 return await x++; |
| 1599 } | 1765 } |
| 1766 |
| 1600 return expect42(f()); | 1767 return expect42(f()); |
| 1601 }); | 1768 }); |
| 1602 | 1769 |
| 1603 test("suffix operator + increment", () { | 1770 test("suffix operator + increment", () { |
| 1604 f() async { | 1771 f() async { |
| 1605 var v = [42]; | 1772 var v = [42]; |
| 1606 return await v[0]++; | 1773 return await v[0]++; |
| 1607 } | 1774 } |
| 1775 |
| 1608 return expect42(f()); | 1776 return expect42(f()); |
| 1609 }); | 1777 }); |
| 1610 | 1778 |
| 1611 test("suffix operator + increment 2", () { | 1779 test("suffix operator + increment 2", () { |
| 1612 f() async { | 1780 f() async { |
| 1613 var v = [42]; | 1781 var v = [42]; |
| 1614 return await v[await 0]++; | 1782 return await v[await 0]++; |
| 1615 } | 1783 } |
| 1784 |
| 1616 return expect42(f()); | 1785 return expect42(f()); |
| 1617 }); | 1786 }); |
| 1618 | 1787 |
| 1619 test("unary pre-increment operator", () { | 1788 test("unary pre-increment operator", () { |
| 1620 f() async { | 1789 f() async { |
| 1621 var x = 41; | 1790 var x = 41; |
| 1622 return await ++x; | 1791 return await ++x; |
| 1623 } | 1792 } |
| 1793 |
| 1624 return expect42(f()); | 1794 return expect42(f()); |
| 1625 }); | 1795 }); |
| 1626 | 1796 |
| 1627 // TODO(jmesserly): https://github.com/dart-lang/dev_compiler/issues/265 | 1797 // TODO(jmesserly): https://github.com/dart-lang/dev_compiler/issues/265 |
| 1628 skip_test("suffix operator + pre-increment", () { | 1798 skip_test("suffix operator + pre-increment", () { |
| 1629 f() async { | 1799 f() async { |
| 1630 var v = [41]; | 1800 var v = [41]; |
| 1631 return await ++v[0]; | 1801 return await ++v[0]; |
| 1632 } | 1802 } |
| 1803 |
| 1633 return expect42(f()); | 1804 return expect42(f()); |
| 1634 }); | 1805 }); |
| 1635 | 1806 |
| 1636 test("assignment operator", () { | 1807 test("assignment operator", () { |
| 1637 f() async { | 1808 f() async { |
| 1638 var x = 37; | 1809 var x = 37; |
| 1639 return await (x = 42); | 1810 return await (x = 42); |
| 1640 } | 1811 } |
| 1812 |
| 1641 return expect42(f()); | 1813 return expect42(f()); |
| 1642 }); | 1814 }); |
| 1643 | 1815 |
| 1644 test("assignment-op operator", () { | 1816 test("assignment-op operator", () { |
| 1645 f() async { | 1817 f() async { |
| 1646 var x = 37; | 1818 var x = 37; |
| 1647 return await (x += 5); | 1819 return await (x += 5); |
| 1648 } | 1820 } |
| 1821 |
| 1649 return expect42(f()); | 1822 return expect42(f()); |
| 1650 }); | 1823 }); |
| 1651 | 1824 |
| 1652 test("binary operator", () { | 1825 test("binary operator", () { |
| 1653 f() async { | 1826 f() async { |
| 1654 return await (10 + 11) + await (10 + 11); | 1827 return await (10 + 11) + await (10 + 11); |
| 1655 } | 1828 } |
| 1829 |
| 1656 return expect42(f()); | 1830 return expect42(f()); |
| 1657 }); | 1831 }); |
| 1658 | 1832 |
| 1659 test("ternary operator", () { | 1833 test("ternary operator", () { |
| 1660 f(v) async { | 1834 f(v) async { |
| 1661 return await ((v == 10) ? new Future.value(42) : 37); | 1835 return await ((v == 10) ? new Future.value(42) : 37); |
| 1662 } | 1836 } |
| 1837 |
| 1663 return expect42(f(10)); | 1838 return expect42(f(10)); |
| 1664 }); | 1839 }); |
| 1665 | 1840 |
| 1666 test("top-level function call", () { | 1841 test("top-level function call", () { |
| 1667 f() async { | 1842 f() async { |
| 1668 return await topMethod(42); | 1843 return await topMethod(42); |
| 1669 } | 1844 } |
| 1845 |
| 1670 return expect42(f()); | 1846 return expect42(f()); |
| 1671 }); | 1847 }); |
| 1672 | 1848 |
| 1673 test("static function call", () { | 1849 test("static function call", () { |
| 1674 f() async { | 1850 f() async { |
| 1675 return await Async.staticMethod(42); | 1851 return await Async.staticMethod(42); |
| 1676 } | 1852 } |
| 1853 |
| 1677 return expect42(f()); | 1854 return expect42(f()); |
| 1678 }); | 1855 }); |
| 1679 | 1856 |
| 1680 test("instance function call", () { | 1857 test("instance function call", () { |
| 1681 f() async { | 1858 f() async { |
| 1682 var a = new Async(); | 1859 var a = new Async(); |
| 1683 return await a.instanceMethod(42); | 1860 return await a.instanceMethod(42); |
| 1684 } | 1861 } |
| 1862 |
| 1685 return expect42(f()); | 1863 return expect42(f()); |
| 1686 }); | 1864 }); |
| 1687 | 1865 |
| 1688 test("top-level function call w/ await", () { | 1866 test("top-level function call w/ await", () { |
| 1689 f() async { | 1867 f() async { |
| 1690 return await topMethod(await 42); | 1868 return await topMethod(await 42); |
| 1691 } | 1869 } |
| 1870 |
| 1692 return expect42(f()); | 1871 return expect42(f()); |
| 1693 }); | 1872 }); |
| 1694 | 1873 |
| 1695 test("static function call w/ await", () { | 1874 test("static function call w/ await", () { |
| 1696 f() async { | 1875 f() async { |
| 1697 return await Async.staticMethod(await 42); | 1876 return await Async.staticMethod(await 42); |
| 1698 } | 1877 } |
| 1878 |
| 1699 return expect42(f()); | 1879 return expect42(f()); |
| 1700 }); | 1880 }); |
| 1701 | 1881 |
| 1702 test("instance function call w/ await", () { | 1882 test("instance function call w/ await", () { |
| 1703 f() async { | 1883 f() async { |
| 1704 var a = new Async(); | 1884 var a = new Async(); |
| 1705 return await a.instanceMethod(await 42); | 1885 return await a.instanceMethod(await 42); |
| 1706 } | 1886 } |
| 1887 |
| 1707 return expect42(f()); | 1888 return expect42(f()); |
| 1708 }); | 1889 }); |
| 1709 | 1890 |
| 1710 test("top-level getter call", () { | 1891 test("top-level getter call", () { |
| 1711 f() async { | 1892 f() async { |
| 1712 return await topGetter; | 1893 return await topGetter; |
| 1713 } | 1894 } |
| 1895 |
| 1714 return expect42(f()); | 1896 return expect42(f()); |
| 1715 }); | 1897 }); |
| 1716 | 1898 |
| 1717 test("static getter call", () { | 1899 test("static getter call", () { |
| 1718 f() async { | 1900 f() async { |
| 1719 return await Async.staticGetter; | 1901 return await Async.staticGetter; |
| 1720 } | 1902 } |
| 1903 |
| 1721 return expect42(f()); | 1904 return expect42(f()); |
| 1722 }); | 1905 }); |
| 1723 | 1906 |
| 1724 test("top-level getter call", () { | 1907 test("top-level getter call", () { |
| 1725 f() async { | 1908 f() async { |
| 1726 var a = new Async(); | 1909 var a = new Async(); |
| 1727 return await a.instanceGetter; | 1910 return await a.instanceGetter; |
| 1728 } | 1911 } |
| 1912 |
| 1729 return expect42(f()); | 1913 return expect42(f()); |
| 1730 }); | 1914 }); |
| 1731 | 1915 |
| 1732 if (!checkedMode) return; | 1916 if (!checkedMode) return; |
| 1733 | 1917 |
| 1734 test("inside assert, true", () { // //# 03: ok | 1918 test("inside assert, true", () { // //# 03: ok |
| 1735 f() async { // //# 03: continued | 1919 f() async { // //# 03: continued |
| 1736 assert(await new Future.microtask(() => true)); // //# 03: continued | 1920 assert(await new Future.microtask(() => true)); // //# 03: continued |
| 1737 return 42; // //# 03: continued | 1921 return 42; // //# 03: continued |
| 1738 } // //# 03: continued | 1922 } // //# 03: continued |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1755 f() async { // //# 03: continued | 1939 f() async { // //# 03: continued |
| 1756 assert(await new Future.microtask(() => false)); // //# 03: continued | 1940 assert(await new Future.microtask(() => false)); // //# 03: continued |
| 1757 return 42; // //# 03: continued | 1941 return 42; // //# 03: continued |
| 1758 } // //# 03: continued | 1942 } // //# 03: continued |
| 1759 return f().then((_) { // //# 03: continued | 1943 return f().then((_) { // //# 03: continued |
| 1760 fail("assert didn't throw"); // //# 03: continued | 1944 fail("assert didn't throw"); // //# 03: continued |
| 1761 }, onError: (e, s) { // //# 03: continued | 1945 }, onError: (e, s) { // //# 03: continued |
| 1762 expect(e is AssertionError, isTrue); // //# 03: continued | 1946 expect(e is AssertionError, isTrue); // //# 03: continued |
| 1763 }); // //# 03: continued | 1947 }); // //# 03: continued |
| 1764 }); // //# 03: continued | 1948 }); // //# 03: continued |
| 1765 | |
| 1766 }); | 1949 }); |
| 1767 | 1950 |
| 1768 group("syntax", () { | 1951 group("syntax", () { |
| 1769 test("async as variable", () { | 1952 test("async as variable", () { |
| 1770 // Valid identifiers outside of async function. | 1953 // Valid identifiers outside of async function. |
| 1771 var async = 42; | 1954 var async = 42; |
| 1772 expect(async, equals(42)); | 1955 expect(async, equals(42)); |
| 1773 }); | 1956 }); |
| 1774 | 1957 |
| 1775 test("await as variable", () { // //# 02: ok | 1958 test("await as variable", () { // //# 02: ok |
| 1776 // Valid identifiers outside of async function. // //# 02: continued | 1959 // Valid identifiers outside of async function. // //# 02: continued |
| 1777 var await = 42; // //# 02: continued | 1960 var await = 42; // //# 02: continued |
| 1778 expect(await, equals(42)); // //# 02: continued | 1961 expect(await, equals(42)); // //# 02: continued |
| 1779 }); // //# 02: continued | 1962 }); // //# 02: continued |
| 1780 | 1963 |
| 1781 test("yield as variable", () { | 1964 test("yield as variable", () { |
| 1782 // Valid identifiers outside of async function. | 1965 // Valid identifiers outside of async function. |
| 1783 var yield = 42; | 1966 var yield = 42; |
| 1784 expect(yield, equals(42)); | 1967 expect(yield, equals(42)); |
| 1785 }); | 1968 }); |
| 1786 }); | 1969 }); |
| 1787 } | 1970 } |
| 1788 | 1971 |
| 1789 | |
| 1790 // Attempt to obfuscates value to avoid too much constant folding. | 1972 // Attempt to obfuscates value to avoid too much constant folding. |
| 1791 id(v) { | 1973 id(v) { |
| 1792 try { | 1974 try { |
| 1793 if (v != null) throw v; | 1975 if (v != null) throw v; |
| 1794 } catch (e) { | 1976 } catch (e) { |
| 1795 return e; | 1977 return e; |
| 1796 } | 1978 } |
| 1797 return null; | 1979 return null; |
| 1798 } | 1980 } |
| 1799 | 1981 |
| 1800 // Create a stream for testing "async for-in". | 1982 // Create a stream for testing "async for-in". |
| 1801 Stream<int> mkStream() { | 1983 Stream<int> mkStream() { |
| 1802 StreamController<int> c; | 1984 StreamController<int> c; |
| 1803 int i = 0; | 1985 int i = 0; |
| 1804 next() { | 1986 next() { |
| 1805 c.add(i++); | 1987 c.add(i++); |
| 1806 if (i == 10) { | 1988 if (i == 10) { |
| 1807 c.close(); | 1989 c.close(); |
| 1808 } else { | 1990 } else { |
| 1809 scheduleMicrotask(next); | 1991 scheduleMicrotask(next); |
| 1810 } | 1992 } |
| 1811 } | 1993 } |
| 1994 |
| 1812 c = new StreamController(onListen: () { | 1995 c = new StreamController(onListen: () { |
| 1813 scheduleMicrotask(next); | 1996 scheduleMicrotask(next); |
| 1814 }); | 1997 }); |
| 1815 return c.stream; | 1998 return c.stream; |
| 1816 } | 1999 } |
| 1817 | 2000 |
| 1818 // Check that future contains the error "err". | 2001 // Check that future contains the error "err". |
| 1819 Future throwsErr(Future future) { | 2002 Future throwsErr(Future future) { |
| 1820 return future.then((v) { fail("didn't throw"); }, | 2003 return future.then((v) { |
| 1821 onError: (e) { expect(e, equals("err")); }); | 2004 fail("didn't throw"); |
| 2005 }, onError: (e) { |
| 2006 expect(e, equals("err")); |
| 2007 }); |
| 1822 } | 2008 } |
| 1823 | 2009 |
| 1824 // Check that future contains the value 42. | 2010 // Check that future contains the value 42. |
| 1825 Future expect42(Future future) { | 2011 Future expect42(Future future) { |
| 1826 return future.then((v) { | 2012 return future.then((v) { |
| 1827 expect(v, equals(42)); | 2013 expect(v, equals(42)); |
| 1828 }); | 2014 }); |
| 1829 } | 2015 } |
| 1830 | 2016 |
| 1831 | |
| 1832 // Various async declarations. | 2017 // Various async declarations. |
| 1833 | 2018 |
| 1834 Future topMethod(f) async { return await f; } | 2019 Future topMethod(f) async { |
| 2020 return await f; |
| 2021 } |
| 1835 | 2022 |
| 1836 Future topArrowMethod(f) async => await f; | 2023 Future topArrowMethod(f) async => await f; |
| 1837 | 2024 |
| 1838 Future get topGetter async { | 2025 Future get topGetter async { |
| 1839 return await new Future.value(42); | 2026 return await new Future.value(42); |
| 1840 } | 2027 } |
| 1841 | 2028 |
| 1842 Future get topArrowGetter async => await new Future.value(42); | 2029 Future get topArrowGetter async => await new Future.value(42); |
| 1843 | 2030 |
| 1844 Future topLocal(f) { | 2031 Future topLocal(f) { |
| 1845 local() async { return await f; } | 2032 local() async { |
| 2033 return await f; |
| 2034 } |
| 2035 |
| 1846 return local(); | 2036 return local(); |
| 1847 } | 2037 } |
| 1848 | 2038 |
| 1849 Future topArrowLocal(f) { | 2039 Future topArrowLocal(f) { |
| 1850 local() async => await f; | 2040 local() async => await f; |
| 1851 return local(); | 2041 return local(); |
| 1852 } | 2042 } |
| 1853 | 2043 |
| 1854 Future topExpression(f) { | 2044 Future topExpression(f) { |
| 1855 return () async { return await f; } (); | 2045 return () async { |
| 2046 return await f; |
| 2047 }(); |
| 1856 } | 2048 } |
| 1857 | 2049 |
| 1858 Future topArrowExpression(f) { | 2050 Future topArrowExpression(f) { |
| 1859 return (() async => await f) (); | 2051 return (() async => await f)(); |
| 1860 } | 2052 } |
| 1861 | 2053 |
| 1862 var topVarExpression = (f) async { return await f; }; | 2054 var topVarExpression = (f) async { |
| 2055 return await f; |
| 2056 }; |
| 1863 | 2057 |
| 1864 var topVarArrowExpression = (f) async => await f; | 2058 var topVarArrowExpression = (f) async => await f; |
| 1865 | 2059 |
| 1866 class Async { | 2060 class Async { |
| 1867 var initValue; | 2061 var initValue; |
| 1868 Async(); | 2062 Async(); |
| 1869 | 2063 |
| 1870 Async.initializer(f) : initValue = (() async { return await f; } ()); | 2064 Async.initializer(f) |
| 2065 : initValue = (() async { |
| 2066 return await f; |
| 2067 }()); |
| 1871 | 2068 |
| 1872 Async.initializerArrow(f) : initValue = ((() async => await f) ()); | 2069 Async.initializerArrow(f) : initValue = ((() async => await f)()); |
| 1873 | 2070 |
| 1874 /* static */ | 2071 /* static */ |
| 1875 static Future staticMethod(f) async { return await f; } | 2072 static Future staticMethod(f) async { |
| 2073 return await f; |
| 2074 } |
| 1876 | 2075 |
| 1877 static Future staticArrowMethod(f) async => await f; | 2076 static Future staticArrowMethod(f) async => await f; |
| 1878 | 2077 |
| 1879 static Future get staticGetter async { | 2078 static Future get staticGetter async { |
| 1880 return await new Future.value(42); | 2079 return await new Future.value(42); |
| 1881 } | 2080 } |
| 1882 | 2081 |
| 1883 static Future get staticArrowGetter async => await new Future.value(42); | 2082 static Future get staticArrowGetter async => await new Future.value(42); |
| 1884 | 2083 |
| 1885 static Future staticLocal(f) { | 2084 static Future staticLocal(f) { |
| 1886 local() async { return await f; } | 2085 local() async { |
| 2086 return await f; |
| 2087 } |
| 2088 |
| 1887 return local(); | 2089 return local(); |
| 1888 } | 2090 } |
| 1889 | 2091 |
| 1890 static Future staticArrowLocal(f) { | 2092 static Future staticArrowLocal(f) { |
| 1891 local() async => await f; | 2093 local() async => await f; |
| 1892 return local(); | 2094 return local(); |
| 1893 } | 2095 } |
| 1894 | 2096 |
| 1895 static Future staticExpression(f) { | 2097 static Future staticExpression(f) { |
| 1896 return () async { return await f; } (); | 2098 return () async { |
| 2099 return await f; |
| 2100 }(); |
| 1897 } | 2101 } |
| 1898 | 2102 |
| 1899 static Future staticArrowExpression(f) { | 2103 static Future staticArrowExpression(f) { |
| 1900 return (() async => await f) (); | 2104 return (() async => await f)(); |
| 1901 } | 2105 } |
| 1902 | 2106 |
| 1903 static var staticVarExpression = (f) async { return await f; }; | 2107 static var staticVarExpression = (f) async { |
| 2108 return await f; |
| 2109 }; |
| 1904 | 2110 |
| 1905 static var staticVarArrowExpression = (f) async => await f; | 2111 static var staticVarArrowExpression = (f) async => await f; |
| 1906 | 2112 |
| 1907 /* instance */ | 2113 /* instance */ |
| 1908 Future instanceMethod(f) async { return await f; } | 2114 Future instanceMethod(f) async { |
| 2115 return await f; |
| 2116 } |
| 1909 | 2117 |
| 1910 Future instanceArrowMethod(f) async => await f; | 2118 Future instanceArrowMethod(f) async => await f; |
| 1911 | 2119 |
| 1912 Future get instanceGetter async { | 2120 Future get instanceGetter async { |
| 1913 return await new Future.value(42); | 2121 return await new Future.value(42); |
| 1914 } | 2122 } |
| 1915 | 2123 |
| 1916 Future get instanceArrowGetter async => await new Future.value(42); | 2124 Future get instanceArrowGetter async => await new Future.value(42); |
| 1917 | 2125 |
| 1918 Future instanceLocal(f) { | 2126 Future instanceLocal(f) { |
| 1919 local() async { return await f; } | 2127 local() async { |
| 2128 return await f; |
| 2129 } |
| 2130 |
| 1920 return local(); | 2131 return local(); |
| 1921 } | 2132 } |
| 1922 | 2133 |
| 1923 Future instanceArrowLocal(f) { | 2134 Future instanceArrowLocal(f) { |
| 1924 local() async => await f; | 2135 local() async => await f; |
| 1925 return local(); | 2136 return local(); |
| 1926 } | 2137 } |
| 1927 | 2138 |
| 1928 Future instanceExpression(f) { | 2139 Future instanceExpression(f) { |
| 1929 return () async { return await f; } (); | 2140 return () async { |
| 2141 return await f; |
| 2142 }(); |
| 1930 } | 2143 } |
| 1931 | 2144 |
| 1932 Future instanceArrowExpression(f) { | 2145 Future instanceArrowExpression(f) { |
| 1933 return (() async => await f) (); | 2146 return (() async => await f)(); |
| 1934 } | 2147 } |
| 1935 | 2148 |
| 1936 var instanceVarExpression = (f) async { return await f; }; | 2149 var instanceVarExpression = (f) async { |
| 2150 return await f; |
| 2151 }; |
| 1937 | 2152 |
| 1938 var instanceVarArrowExpression = (f) async => await f; | 2153 var instanceVarArrowExpression = (f) async => await f; |
| 1939 } | 2154 } |
| 1940 | 2155 |
| 1941 Future asyncInAsync(f) async { | 2156 Future asyncInAsync(f) async { |
| 1942 inner(f) async { | 2157 inner(f) async { |
| 1943 return await f; | 2158 return await f; |
| 1944 } | 2159 } |
| 2160 |
| 1945 return await inner(f); | 2161 return await inner(f); |
| 1946 } | 2162 } |
| 1947 | 2163 |
| 1948 Future asyncInSync(f) { | 2164 Future asyncInSync(f) { |
| 1949 inner(f) async { | 2165 inner(f) async { |
| 1950 return await f; | 2166 return await f; |
| 1951 } | 2167 } |
| 2168 |
| 1952 return inner(f); | 2169 return inner(f); |
| 1953 } | 2170 } |
| 1954 | 2171 |
| 1955 Future syncInAsync(f) async { | 2172 Future syncInAsync(f) async { |
| 1956 inner(f) { | 2173 inner(f) { |
| 1957 return f; | 2174 return f; |
| 1958 } | 2175 } |
| 2176 |
| 1959 return await inner(f); | 2177 return await inner(f); |
| 1960 } | 2178 } |
| 1961 | 2179 |
| 1962 /** | 2180 /** |
| 1963 * A non-standard implementation of Future with a value. | 2181 * A non-standard implementation of Future with a value. |
| 1964 */ | 2182 */ |
| 1965 class FakeValueFuture implements Future { | 2183 class FakeValueFuture implements Future { |
| 1966 final _value; | 2184 final _value; |
| 1967 FakeValueFuture(this._value); | 2185 FakeValueFuture(this._value); |
| 1968 Future/*<S>*/ then/*<S>*/(callback(value), {Function onError}) { | 2186 Future/*<S>*/ then/*<S>*/(callback(value), {Function onError}) { |
| 1969 return new Future/*<S>*/.microtask(() => callback(_value)); | 2187 return new Future/*<S>*/ .microtask(() => callback(_value)); |
| 1970 } | 2188 } |
| 2189 |
| 1971 Future whenComplete(callback()) { | 2190 Future whenComplete(callback()) { |
| 1972 return new Future.microtask(() { callback(); }); | 2191 return new Future.microtask(() { |
| 2192 callback(); |
| 2193 }); |
| 1973 } | 2194 } |
| 2195 |
| 1974 Future catchError(Function onError, {bool test(error)}) => this; | 2196 Future catchError(Function onError, {bool test(error)}) => this; |
| 1975 Stream asStream() => (new StreamController()..add(_value)..close()).stream; | 2197 Stream asStream() => (new StreamController() |
| 2198 ..add(_value) |
| 2199 ..close()) |
| 2200 .stream; |
| 1976 Future timeout(Duration duration, {onTimeout()}) => this; | 2201 Future timeout(Duration duration, {onTimeout()}) => this; |
| 1977 } | 2202 } |
| 1978 | 2203 |
| 1979 typedef BinaryFunction(a, b); | 2204 typedef BinaryFunction(a, b); |
| 1980 | 2205 |
| 1981 /** | 2206 /** |
| 1982 * A non-standard implementation of Future with an error. | 2207 * A non-standard implementation of Future with an error. |
| 1983 */ | 2208 */ |
| 1984 class FakeErrorFuture implements Future { | 2209 class FakeErrorFuture implements Future { |
| 1985 final _error; | 2210 final _error; |
| 1986 FakeErrorFuture(this._error); | 2211 FakeErrorFuture(this._error); |
| 1987 Future/*<S>*/ then/*<S>*/(callback(value), {Function onError}) { | 2212 Future/*<S>*/ then/*<S>*/(callback(value), {Function onError}) { |
| 1988 if (onError != null) { | 2213 if (onError != null) { |
| 1989 if (onError is BinaryFunction) { | 2214 if (onError is BinaryFunction) { |
| 1990 return new Future/*<S>*/.microtask(() => onError(_error, null)); | 2215 return new Future/*<S>*/ .microtask(() => onError(_error, null)); |
| 1991 } | 2216 } |
| 1992 return new Future/*<S>*/.microtask(() => onError(_error)); | 2217 return new Future/*<S>*/ .microtask(() => onError(_error)); |
| 1993 } | 2218 } |
| 1994 return new Future/*<S>*/.error(_error); | 2219 return new Future/*<S>*/ .error(_error); |
| 1995 } | 2220 } |
| 2221 |
| 1996 Future whenComplete(callback()) { | 2222 Future whenComplete(callback()) { |
| 1997 return new Future.microtask(() { callback(); }).then((_) => this); | 2223 return new Future.microtask(() { |
| 2224 callback(); |
| 2225 }).then((_) => this); |
| 1998 } | 2226 } |
| 2227 |
| 1999 Future catchError(Function onError, {bool test(error)}) { | 2228 Future catchError(Function onError, {bool test(error)}) { |
| 2000 return new Future.microtask(() { | 2229 return new Future.microtask(() { |
| 2001 if (test != null && !test(_error)) return this; | 2230 if (test != null && !test(_error)) return this; |
| 2002 if (onError is BinaryFunction) { | 2231 if (onError is BinaryFunction) { |
| 2003 return onError(_error, null); | 2232 return onError(_error, null); |
| 2004 } | 2233 } |
| 2005 return onError(_error); | 2234 return onError(_error); |
| 2006 }); | 2235 }); |
| 2007 } | 2236 } |
| 2008 Stream asStream() => | 2237 |
| 2009 (new StreamController()..addError(_error)..close()).stream; | 2238 Stream asStream() => (new StreamController() |
| 2239 ..addError(_error) |
| 2240 ..close()) |
| 2241 .stream; |
| 2010 Future timeout(Duration duration, {onTimeout()}) => this; | 2242 Future timeout(Duration duration, {onTimeout()}) => this; |
| 2011 } | 2243 } |
| OLD | NEW |