blob: 3ba421e2ed585380a6436e702d1a82792a74748f [file] [log] [blame]
// 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.
// @dart = 2.9
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()) {
return length;
void main() {
check('Map', {});
check('Map.identity', Map.identity());
check('HashMap', HashMap());
check('HashMap.identity', HashMap.identity());
check('SplayTreeMap', SplayTreeMap());