| // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | import 'dart:async'; | 
 |  | 
 | import "package:expect/expect.dart"; | 
 | import "package:async_helper/async_helper.dart"; | 
 |  | 
 | // Test that local variable reads and writes are sequenced correctly with | 
 | // respect to reads and writes in an awaited Future.  See issue 26175. | 
 |  | 
 | // Reads are sequenced correctly with respect to writes in a Future. | 
 | Future test1() async { | 
 |   var x = 'a'; | 
 |   f() async => x = 'b'; | 
 |   Expect.equals('abb', '${x}${await f()}${x}'); | 
 | } | 
 |  | 
 | // Writes are sequenced correctly with respect to writes in a Future. | 
 | Future test2(ignore) async { | 
 |   var x; | 
 |   f() async => x = 'b'; | 
 |   Expect.equals('abb', '${x = 'a'}${await f()}${x}'); | 
 | } | 
 |  | 
 | // Writes are sequenced correctly with respect to reads in a Future. | 
 | Future test3(ignore) async { | 
 |   var x = 'a'; | 
 |   f() async => x; | 
 |   Expect.equals('bbb', '${x = 'b'}${await f()}${x}'); | 
 | } | 
 |  | 
 | // Repeat the same tests for static variables. | 
 | var cell = 'a'; | 
 |  | 
 | asyncReadCell() async => cell; | 
 | asyncWriteCell(value) async => cell = value; | 
 |  | 
 | Future test4(ignore) async { | 
 |   // This test assumes that it can read the initial value of cell. | 
 |   Expect.equals('abb', '${cell}${await asyncWriteCell('b')}${cell}'); | 
 | } | 
 |  | 
 | Future test5(ignore) async { | 
 |   Expect.equals('abb', '${cell = 'a'}${await asyncWriteCell('b')}${cell}'); | 
 | } | 
 |  | 
 | Future test6(ignore) async { | 
 |   Expect.equals('bbb', '${cell = 'b'}${await asyncReadCell()}${cell}'); | 
 | } | 
 |  | 
 | // Test that throwing is sequenced correctly with respect to other effects. | 
 | Future test7(ignore) async { | 
 |   cell = 'a'; | 
 |   try { | 
 |     Expect.equals( | 
 |         'unreachable', '${throw 0}${await asyncWriteCell('b')}${cell}'); | 
 |   } catch (_) { | 
 |     Expect.equals('a', cell); | 
 |   } | 
 | } | 
 |  | 
 | main() { | 
 |   asyncStart(); | 
 |   test1() | 
 |       .then(test2) | 
 |       .then(test3) | 
 |       .then(test4) | 
 |       .then(test5) | 
 |       .then(test6) | 
 |       .then(test7) | 
 |       .then((_) => asyncEnd()); | 
 | } |