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