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