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