// Copyright (c) 2011, 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 test for Splaytrees.
library splay_tree_test;
import "package:expect/expect.dart";
import 'dart:collection';


class SplayTreeMapTest {

  static testMain() {
    SplayTreeMap tree = new SplayTreeMap();
    tree[1] = "first";
    tree[3] = "third";
    tree[5] = "fifth";
    tree[2] = "second";
    tree[4] = "fourth";

    var correctSolution = ["first", "second", "third", "fourth", "fifth"];

    tree.forEach((key, value) {
      Expect.equals(true, key >= 1);
      Expect.equals(true, key <= 5);
      Expect.equals(value, correctSolution[key - 1]);
    });

    for (var v in ["first", "second", "third", "fourth", "fifth"]) {
      Expect.isTrue(tree.containsValue(v));
    };
    Expect.isFalse(tree.containsValue("sixth"));

    tree[7] = "seventh";

    Expect.equals(1, tree.firstKey());
    Expect.equals(7, tree.lastKey());

    Expect.equals(2, tree.lastKeyBefore(3));
    Expect.equals(4, tree.firstKeyAfter(3));

    Expect.equals(null, tree.lastKeyBefore(1));
    Expect.equals(2, tree.firstKeyAfter(1));

    Expect.equals(4, tree.lastKeyBefore(5));
    Expect.equals(7, tree.firstKeyAfter(5));

    Expect.equals(5, tree.lastKeyBefore(7));
    Expect.equals(null, tree.firstKeyAfter(7));

    Expect.equals(5, tree.lastKeyBefore(6));
    Expect.equals(7, tree.firstKeyAfter(6));
  }
}

main() {
  SplayTreeMapTest.testMain();
}
