| // 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); |
| } |