// Copyright (c) 2013, 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. library map_test; import 'dart:collection'; // Test that length/isEmpty opertions are constant time on // maps, strings and collections. void testString(int n) { String s = "x"; String string = ""; int length = n; while (true) { if ((length & 1) == 1) { string += s; } length >>= 1; if (length == 0) break; s += s; } testLength(string, n); testLength(string.codeUnits, n); } void testMap(Map map, int n) { for (int i = 0; i < n; i++) { map[i] = i; } testLength(map, n); testLength(map.keys, n); testLength(map.values, n); } void testCollection(var collection, n) { for (int i = 0; i < n; i++) { collection.add(i); } testLength(collection, n); } void testList(List list, n) { // Works even if list is fixed-length. for (int i = 0; i < n; i++) { list[i] = i; } testLength(list, n); } void testLength(dynamic lengthable, int size) { print(lengthable.runtimeType); // Show what hangs the test. int length = 0; // If length, isEmpty or isNotEmpty is not a constant-time (or very fast) // operation, this will timeout. for (int i = 0; i < 100000; i++) { if (!lengthable.isEmpty) length += lengthable.length as int; if (lengthable.isNotEmpty) length += lengthable.length as int; } if (length != size * 200000) throw "Bad length: $length / size: $size"; } main() { const int N = 100000; testMap(new HashMap(), N); testMap(new LinkedHashMap(), N); testMap(new SplayTreeMap(), N); testCollection(new HashSet(), N); testCollection(new LinkedHashSet(), N); testCollection(new ListQueue(), N); testCollection(new DoubleLinkedQueue(), N); testList([]..length = N, N); testList(new List.filled(0, null, growable: true)..length = N, N); testList(new List.filled(N, null), N); testString(N); }