| // Copyright (c) 2019, 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. |
| |
| // @dart = 2.9 |
| |
| import 'package:async_helper/async_helper.dart'; |
| import 'package:expect/expect.dart'; |
| |
| import 'utils.dart'; |
| |
| final list = [1, 2, 3, 4]; |
| final map = {1: 1, 2: 2, 3: 3, 4: 4}; |
| final set = {1, 2, 3, 4}; |
| |
| Stream<int> stream(List<int> values) => Stream.fromIterable(values); |
| Stream<num> numStream(List<num> values) => Stream.fromIterable(values); |
| |
| void main() { |
| asyncTest(() async { |
| await testList(); |
| await testMap(); |
| await testSet(); |
| await testDuplicateKeys(); |
| await testKeyOrder(); |
| await testRuntimeErrors(); |
| }); |
| } |
| |
| Future<void> testList() async { |
| // Only await for. |
| Expect.listEquals(list, <int>[await for (var i in stream(list)) i]); |
| |
| // Await for at beginning. |
| Expect.listEquals(list, <int>[ |
| await for (var i in stream([1, 2])) i, |
| 3, |
| 4 |
| ]); |
| |
| // Await for in middle. |
| Expect.listEquals(list, <int>[ |
| 1, |
| await for (var i in stream([2, 3])) i, |
| 4 |
| ]); |
| |
| // Await for at end. |
| Expect.listEquals(list, <int>[ |
| 1, |
| 2, |
| await for (var i in stream([3, 4])) i |
| ]); |
| |
| // Empty await for. |
| Expect.listEquals(list, <int>[1, 2, await for (var i in stream([])) i, 3, 4]); |
| |
| // Multiple await fors. |
| Expect.listEquals(list, <int>[ |
| await for (var i in stream([1])) i, |
| 2, |
| await for (var i in stream([3, 4])) i |
| ]); |
| |
| // Spread inside await for. |
| Expect.listEquals(list, <int>[ |
| await for (var i in stream([0, 2])) ...<int>[1 + i, 2 + i] |
| ]); |
| |
| // If inside await for. |
| Expect.listEquals(list, <int>[ |
| await for (var i in stream([1, 9, 2, 3, 9, 4])) |
| if (i != 9) i |
| ]); |
| |
| // Else inside await for. |
| Expect.listEquals(list, <int>[ |
| await for (var i in stream([1, -2, 3, -4])) |
| if (i < 0) -i else i |
| ]); |
| |
| // For inside await for. |
| Expect.listEquals(list, <int>[ |
| await for (var i in stream([0, 2])) |
| for (var j = 1; j <= 2; j++) i + j |
| ]); |
| |
| // Does not flatten nested collection literal. |
| Expect.listEquals( |
| [1], |
| [ |
| await for (var i in stream([1])) [i] |
| ].first); |
| Expect.mapEquals( |
| {1: 1}, |
| [ |
| await for (var i in stream([1])) {i: i} |
| ].first); |
| Expect.setEquals( |
| {1}, |
| [ |
| await for (var i in stream([1])) {i} |
| ].first); |
| |
| // Downcast stream. |
| Object obj = stream([1, 2, 3, 4]); |
| Expect.listEquals(list, <int>[await for (var n in obj) n]); |
| |
| // Downcast variable. |
| Expect.listEquals(list, <int>[ |
| await for (int n in numStream([1, 2, 3, 4])) n |
| ]); |
| |
| // Downcast element. |
| Expect.listEquals(list, <int>[ |
| await for (num n in numStream([1, 2, 3, 4])) n |
| ]); |
| } |
| |
| Future<void> testMap() async { |
| // Only for. |
| Expect.mapEquals(map, <int, int>{await for (var i in stream(list)) i: i}); |
| |
| // Await for at beginning. |
| Expect.mapEquals(map, <int, int>{ |
| await for (var i in stream([1, 2])) i: i, |
| 3: 3, |
| 4: 4 |
| }); |
| |
| // Await for in middle. |
| Expect.mapEquals(map, <int, int>{ |
| 1: 1, |
| await for (var i in stream([2, 3])) i: i, |
| 4: 4 |
| }); |
| |
| // Await for at end. |
| Expect.mapEquals(map, <int, int>{ |
| 1: 1, |
| 2: 2, |
| await for (var i in stream([3, 4])) i: i |
| }); |
| |
| // Empty await for. |
| Expect.mapEquals(map, |
| <int, int>{1: 1, await for (var i in stream([])) i: i, 2: 2, 3: 3, 4: 4}); |
| |
| // Multiple await fors. |
| Expect.mapEquals(map, <int, int>{ |
| await for (var i in stream([1])) i: i, |
| 2: 2, |
| await for (var i in stream([3, 4])) i: i |
| }); |
| |
| // Spread inside await for. |
| Expect.mapEquals(map, <int, int>{ |
| await for (var i in stream([0, 2])) ...<int, int>{ |
| 1 + i: 1 + i, |
| 2 + i: 2 + i |
| } |
| }); |
| |
| // If inside await for. |
| Expect.mapEquals(map, <int, int>{ |
| await for (var i in stream([1, 9, 2, 3, 9, 4])) |
| if (i != 9) i: i |
| }); |
| |
| // Else inside await for. |
| Expect.mapEquals(map, <int, int>{ |
| await for (var i in stream([1, -2, 3, -4])) |
| if (i < 0) -i: -i else i: i |
| }); |
| |
| // For inside await for. |
| Expect.mapEquals(map, <int, int>{ |
| await for (var i in stream([0, 2])) |
| for (var j = 1; j <= 2; j++) i + j: i + j |
| }); |
| |
| // Downcast stream. |
| Object obj = stream([1, 2, 3, 4]); |
| Expect.mapEquals(map, <int, int>{await for (var n in obj) n: n}); |
| |
| // Downcast variable. |
| Expect.mapEquals(map, <int, int>{ |
| await for (int n in numStream([1, 2, 3, 4])) n: n |
| }); |
| |
| // Downcast element. |
| Expect.mapEquals(map, <int, int>{ |
| await for (num n in numStream([1, 2, 3, 4])) n: n |
| }); |
| } |
| |
| Future<void> testSet() async { |
| // Only await for. |
| Expect.setEquals(set, <int>{await for (var i in stream(list)) i}); |
| |
| // Await for at beginning. |
| Expect.setEquals(set, <int>{ |
| await for (var i in stream([1, 2])) i, |
| 3, |
| 4 |
| }); |
| |
| // Await for in middle. |
| Expect.setEquals(set, <int>{ |
| 1, |
| await for (var i in stream([2, 3])) i, |
| 4 |
| }); |
| |
| // Await for at end. |
| Expect.setEquals(set, <int>{ |
| 1, |
| 2, |
| await for (var i in stream([3, 4])) i |
| }); |
| |
| // Empty await for. |
| Expect.setEquals(set, <int>{1, await for (var i in stream([])) i, 2, 3, 4}); |
| |
| // Multiple await fors. |
| Expect.setEquals(set, <int>{ |
| await for (var i in stream([1])) i, |
| 2, |
| await for (var i in stream([3, 4])) i |
| }); |
| |
| // Spread inside await for. |
| Expect.setEquals(set, <int>{ |
| await for (var i in stream([0, 2])) ...<int>[1 + i, 2 + i] |
| }); |
| |
| // If inside await for. |
| Expect.setEquals(set, <int>{ |
| await for (var i in stream([1, 9, 2, 3, 9, 4])) |
| if (i != 9) i |
| }); |
| |
| // Else inside await for. |
| Expect.setEquals(set, <int>{ |
| await for (var i in stream([1, -2, 3, -4])) |
| if (i < 0) -i else i |
| }); |
| |
| // For inside await for. |
| Expect.setEquals(set, <int>{ |
| await for (var i in stream([0, 2])) |
| for (var j = 1; j <= 2; j++) i + j |
| }); |
| |
| // Does not flatten nested collection literal. |
| Expect.listEquals( |
| [1], |
| { |
| await for (var i in stream([1])) [i] |
| }.first); |
| Expect.mapEquals( |
| {1: 1}, |
| { |
| await for (var i in stream([1])) {i: i} |
| }.first); |
| Expect.setEquals( |
| {1}, |
| { |
| await for (var i in stream([1])) {i} |
| }.first); |
| |
| // Downcast stream. |
| Object obj = stream([1, 2, 3, 4]); |
| Expect.setEquals(set, <int>{await for (var n in obj) n}); |
| |
| // Downcast variable. |
| Expect.setEquals(set, <int>{ |
| await for (int n in numStream([1, 2, 3, 4])) n |
| }); |
| |
| // Downcast element. |
| Expect.setEquals(set, <int>{ |
| await for (num n in numStream([1, 2, 3, 4])) n |
| }); |
| } |
| |
| Future<void> testDuplicateKeys() async { |
| Expect.mapEquals(map, <int, int>{ |
| 1: 1, |
| await for (var i in stream([1, 2, 3])) i: i, |
| await for (var i in stream([2, 3])) i: i, |
| 3: 3, |
| 4: 4 |
| }); |
| Expect.setEquals(set, <int>{ |
| 1, |
| await for (var i in stream([1, 2, 3])) i, |
| await for (var i in stream([2, 3])) i, |
| 3, |
| 4 |
| }); |
| } |
| |
| Future<void> testKeyOrder() async { |
| // First equal key wins. |
| var e1a = Equality(1, "a"); |
| var e1b = Equality(1, "b"); |
| var e2a = Equality(2, "a"); |
| var e2b = Equality(2, "b"); |
| var keys = [e1b, e2a, e2b]; |
| var values = [2, 3, 4]; |
| |
| var map = <Equality, int>{ |
| e1a: 1, |
| await for (var i in stream([0, 1, 2])) keys[i]: values[i] |
| }; |
| Expect.equals("1:a,2:a", map.keys.join(",")); |
| Expect.equals("2,4", map.values.join(",")); |
| |
| var set = <Equality>{ |
| e1a, |
| await for (var i in stream([0, 1, 2])) keys[i] |
| }; |
| Expect.equals("1:a,2:a", set.join(",")); |
| } |
| |
| Future<void> testRuntimeErrors() async { |
| // Cast variable. |
| dynamic nonStream = 3; |
| asyncExpectThrows<TypeError>(() async { |
| <int>[await for (int i in nonStream) 1]; |
| }()); |
| asyncExpectThrows<TypeError>(() async { |
| <int, int>{await for (int i in nonStream) 1: 1}; |
| }()); |
| asyncExpectThrows<TypeError>(() async { |
| <int>{await for (int i in nonStream) 1}; |
| }()); |
| |
| // Wrong element type. |
| dynamic nonInt = "string"; |
| asyncExpectThrows<TypeError>(() async { |
| <int>[ |
| await for (var i in stream([1])) nonInt |
| ]; |
| }()); |
| asyncExpectThrows<TypeError>(() async { |
| <int, int>{ |
| await for (var i in stream([1])) nonInt: 1 |
| }; |
| }()); |
| asyncExpectThrows<TypeError>(() async { |
| <int, int>{ |
| await for (var i in stream([1])) 1: nonInt |
| }; |
| }()); |
| asyncExpectThrows<TypeError>(() async { |
| <int>{ |
| await for (var i in stream([1])) nonInt |
| }; |
| }()); |
| } |