| // 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. |
| |
| 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}; |
| |
| void main() { |
| testList(); |
| testMap(); |
| testSet(); |
| testDuplicateKeys(); |
| testKeyOrder(); |
| } |
| |
| void testList() { |
| // Only for. |
| Expect.listEquals(list, <int>[for (var i in list) i]); |
| |
| // For at beginning. |
| Expect.listEquals(list, <int>[for (var i in <int>[1, 2]) i, 3, 4]); |
| |
| // For in middle. |
| Expect.listEquals(list, <int>[1, for (var i in <int>[2, 3]) i, 4]); |
| |
| // For at end. |
| Expect.listEquals(list, <int>[1, 2, for (var i in <int>[3, 4]) i]); |
| |
| // Empty for. |
| Expect.listEquals(list, |
| <int>[1, for (var i in <int>[]) i, 2, 3, for (; false;) 9, 4]); |
| |
| // Multiple fors. |
| Expect.listEquals(list, |
| <int>[for (var i in <int>[1]) i, 2, for (var i = 3; i <= 4; i++) i]); |
| |
| // Spread inside for. |
| Expect.listEquals(list, |
| <int>[for (var i in <int>[0, 2]) ...<int>[1 + i, 2 + i]]); |
| |
| // If inside for. |
| Expect.listEquals(list, |
| <int>[for (var i in <int>[1, 9, 2, 3, 9, 4]) if (i != 9) i]); |
| |
| // Else inside for. |
| Expect.listEquals(list, |
| <int>[for (var i in <int>[1, -2, 3, -4]) if (i < 0) -i else i]); |
| |
| // For inside for. |
| Expect.listEquals(list, |
| <int>[for (var i in <int>[0, 2]) for (var j = 1; j <= 2; j++) i + j]); |
| |
| // Does not flatten nested collection literal. |
| Expect.listEquals([1], [for (var i = 1; i < 2; i++) [i]].first); |
| Expect.mapEquals({1: 1}, [for (var i = 1; i < 2; i++) {i: i}].first); |
| Expect.setEquals({1}, [for (var i = 1; i < 2; i++) {i}].first); |
| |
| // Downcast condition. |
| Expect.listEquals([1], <int>[for (var i = 1; (i < 2) as dynamic; i++) i]); |
| } |
| |
| void testMap() { |
| // Only for. |
| Expect.mapEquals(map, <int, int>{for (var i in list) i: i}); |
| |
| // For at beginning. |
| Expect.mapEquals(map, |
| <int, int>{for (var i in <int>[1, 2]) i: i, 3: 3, 4: 4}); |
| |
| // For in middle. |
| Expect.mapEquals(map, |
| <int, int>{1: 1, for (var i in <int>[2, 3]) i: i, 4: 4}); |
| |
| // For at end. |
| Expect.mapEquals(map, |
| <int, int>{1: 1, 2: 2, for (var i in <int>[3, 4]) i: i}); |
| |
| // Empty for. |
| Expect.mapEquals(map, <int, int>{ |
| 1: 1, |
| for (var i in <int>[]) i: i, |
| 2: 2, |
| 3: 3, |
| for (; false;) 9: 9, |
| 4: 4 |
| }); |
| |
| // Multiple fors. |
| Expect.mapEquals(map, <int, int>{ |
| for (var i in <int>[1]) i: i, |
| 2: 2, |
| for (var i = 3; i <= 4; i++) i: i |
| }); |
| |
| // Spread inside for. |
| Expect.mapEquals(map, <int, int>{ |
| for (var i in <int>[0, 2]) ...<int, int>{1 + i: 1 + i, 2 + i: 2 + i} |
| }); |
| |
| // If inside for. |
| Expect.mapEquals(map, |
| <int, int>{for (var i in <int>[1, 9, 2, 3, 9, 4]) if (i != 9) i: i}); |
| |
| // Else inside for. |
| Expect.mapEquals(map, |
| <int, int>{for (var i in <int>[1, -2, 3, -4]) if (i < 0) -i: -i else i: i}); |
| |
| // For inside for. |
| Expect.mapEquals(map, <int, int>{ |
| for (var i in <int>[0, 2]) for (var j = 1; j <= 2; j++) i + j: i + j |
| }); |
| |
| // Downcast condition. |
| Expect.mapEquals({1 : 1}, |
| <int, int>{for (var i = 1; (i < 2) as dynamic; i++) i: i}); |
| } |
| |
| void testSet() { |
| // Only for. |
| Expect.setEquals(set, <int>{for (var i in list) i}); |
| |
| // For at beginning. |
| Expect.setEquals(set, <int>{for (var i in <int>[1, 2]) i, 3, 4}); |
| |
| // For in middle. |
| Expect.setEquals(set, <int>{1, for (var i in <int>[2, 3]) i, 4}); |
| |
| // For at end. |
| Expect.setEquals(set, <int>{1, 2, for (var i in <int>[3, 4]) i}); |
| |
| // Empty for. |
| Expect.setEquals(set, |
| <int>{1, for (var i in <int>[]) i, 2, 3, for (; false;) 9, 4}); |
| |
| // Multiple fors. |
| Expect.setEquals(set, |
| <int>{for (var i in <int>[1]) i, 2, for (var i = 3; i <= 4; i++) i}); |
| |
| // Spread inside for. |
| Expect.setEquals(set, |
| <int>{for (var i in <int>[0, 2]) ...<int>[1 + i, 2 + i]}); |
| |
| // If inside for. |
| Expect.setEquals(set, |
| <int>{for (var i in <int>[1, 9, 2, 3, 9, 4]) if (i != 9) i}); |
| |
| // Else inside for. |
| Expect.setEquals(set, |
| <int>{for (var i in <int>[1, -2, 3, -4]) if (i < 0) -i else i}); |
| |
| // For inside for. |
| Expect.setEquals(set, |
| <int>{for (var i in <int>[0, 2]) for (var j = 1; j <= 2; j++) i + j}); |
| |
| // Does not flatten nested collection literal. |
| Expect.listEquals([1], {for (var i = 1; i < 2; i++) [i]}.first); |
| Expect.mapEquals({1: 1}, {for (var i = 1; i < 2; i++) {i: i}}.first); |
| Expect.setEquals({1}, {for (var i = 1; i < 2; i++) {i}}.first); |
| |
| // Downcast condition. |
| Expect.setEquals({1}, <int>{for (var i = 1; (i < 2) as dynamic; i++) i}); |
| } |
| |
| void testDuplicateKeys() { |
| Expect.mapEquals(map, <int, int>{ |
| 1: 1, |
| for (var i in <int>[1, 2, 3]) i: i, |
| for (var i = 2; i <= 3; i++) i: i, |
| 3: 3, |
| 4: 4 |
| }); |
| Expect.setEquals(set, <int>{ |
| 1, |
| for (var i in <int>[1, 2, 3]) i, |
| for (var i = 2; i <= 3; i++) i, |
| 3, |
| 4 |
| }); |
| } |
| |
| void testKeyOrder() { |
| // 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, |
| for (var i = 0; i < keys.length; i++) keys[i]: values[i] |
| }; |
| Expect.equals("1:a,2:a", map.keys.join(",")); |
| Expect.equals("2,4", map.values.join(",")); |
| |
| var set = <Equality>{e1a, for (var i = 0; i < keys.length; i++) keys[i]}; |
| Expect.equals("1:a,2:a", set.join(",")); |
| } |