dart-sdk/tests/lib/collection/map_iterables_consistency_test.dart
Stephen Adams 8d335e5e08 [lib/collection] Test for #48282
Change-Id: I62306feab09f8dcd0335daa296b6c744bc139e62
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/231336
Reviewed-by: Lasse Nielsen <lrn@google.com>
Commit-Queue: Stephen Adams <sra@google.com>
2022-02-08 19:36:38 +00:00

74 lines
2 KiB
Dart

// Copyright (c) 2022, 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 'dart:collection';
import 'package:expect/expect.dart';
// Test that a Map's keys, values and entries iterables are consistent with
// their map.
//
// While it is generally not permitted to modify a map while iterating the keys,
// values, or entries, it is possible to iterate these collections in between
// modifications of the map.
//
// See #48282
void check(String kind, Map m) {
Expect.equals(0, m.length);
// These existing iterables
final keys = m.keys;
final values = m.values;
final entries = m.entries;
for (int i = 0; i < 20; i++) {
Expect.equals(i, m.length);
// Fresh iterables.
Expect.equals(i, m.keys.length);
Expect.equals(i, m.values.length);
Expect.equals(i, m.entries.length);
Expect.equals(i, List.of(m.keys).length);
Expect.equals(i, List.of(m.values).length);
Expect.equals(i, List.of(m.entries).length);
Expect.equals(i, iteratedLength(m.keys));
Expect.equals(i, iteratedLength(m.values));
Expect.equals(i, iteratedLength(m.entries));
// Existing iterables.
Expect.equals(i, keys.length);
Expect.equals(i, values.length);
Expect.equals(i, entries.length);
Expect.equals(i, List.of(keys).length);
Expect.equals(i, List.of(values).length);
Expect.equals(i, List.of(entries).length);
Expect.equals(i, iteratedLength(keys));
Expect.equals(i, iteratedLength(values));
Expect.equals(i, iteratedLength(entries));
m[i] = i;
}
}
int iteratedLength(Iterable iterable) {
int length = 0;
final iterator = iterable.iterator;
while (iterator.moveNext()) {
length++;
}
return length;
}
void main() {
check('Map', {});
check('Map.identity', Map.identity());
check('HashMap', HashMap());
check('HashMap.identity', HashMap.identity());
check('SplayTreeMap', SplayTreeMap());
}