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