blob: 3eeb10b5873a39b15be1666cc38ca0c7ded77701 [file] [log] [blame]
// 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(","));
}