// Copyright (c) 2014, 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.7

import "package:expect/expect.dart";
import "package:compiler/src/util/maplet.dart";

main() {
  for (int i = 1; i <= 32; i++) {
    test(i);
  }
}

test(int size) {
  var maplet = new Maplet();
  for (int i = 0; i < size; i++) {
    Expect.isTrue(maplet.isEmpty == (i == 0));
    maplet[i] = '$i';
    Expect.equals(i + 1, maplet.length);
    Expect.isFalse(maplet.isEmpty);
    for (int j = 0; j < size + size; j++) {
      Expect.isTrue(maplet[j] == ((j <= i) ? '$j' : null));
    }
    Expect.equals('$i', maplet.remove(i));
    Expect.isNull(maplet.remove(i + 1));
    maplet[i] = '$i';

    List expectedKeys = [];
    List expectedValues = [];
    for (int j = 0; j <= i; j++) {
      expectedKeys.add(j);
      expectedValues.add('$j');
    }

    List actualKeys = [];
    List actualValues = [];
    maplet.forEach((eachKey, eachValue) {
      actualKeys.add(eachKey);
      actualValues.add(eachValue);
    });
    Expect.listEquals(expectedKeys, actualKeys);
    Expect.listEquals(expectedValues, actualValues);
    Expect.listEquals(expectedKeys, maplet.keys.toList());
    Expect.listEquals(expectedValues, maplet.values.toList());
  }

  for (int i = 0; i < size; i++) {
    Expect.equals(size, maplet.length);

    // Try removing all possible ranges one by one and re-add them.
    for (int k = size; k > i; --k) {
      for (int j = i; j < k; j++) {
        Expect.equals('$j', maplet.remove(j));
        int expectedSize = size - (j - i + 1);
        Expect.equals(expectedSize, maplet.length);
        Expect.isNull(maplet.remove(j));
        Expect.isNull(maplet[j]);

        Expect.isNull(maplet[null]);
        maplet[null] = 'null';
        Expect.equals(expectedSize + 1, maplet.length);
        Expect.equals('null', maplet[null]);
        Expect.equals('null', maplet.remove(null));
        Expect.equals(expectedSize, maplet.length);
        Expect.isNull(maplet.remove(null));
      }

      for (int j = i; j < k; j++) {
        maplet[j] = '$j';
      }
    }

    Expect.equals(size, maplet.length);
    Expect.equals('$i', maplet[i]);
  }
}
