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