private static void TestHeight(RedBlackNULLTree <int, int> tree)
        {
            var max    = 2 * Math.Log(tree.Count + 1, 2);
            var height = tree.Height();

            Assert.IsTrue(height <= max);
        }
        private static void TestNodes(RedBlackNULLTree <int, int> tree)
        {
            var node = tree.Tree;

            Assert.IsFalse(node.Red);
            TestNode(node);
        }
        private static RedBlackNULLTree <int, int> Create()
        {
            var tree = new RedBlackNULLTree <int, int>((x, y) => x - y);

            Assert.IsNull(tree.Tree);
            Assert.AreEqual(0, tree.Count);
            Assert.AreEqual(0, tree.Height());
            return(tree);
        }
        private static void TestCopyKeysDescending(RedBlackNULLTree <int, int> tree)
        {
            var keys = tree.CopyKeysDescending();

            Assert.AreEqual(tree.Count, keys.Length);
            for (var i = keys.Length - 1; i > 0; --i)
            {
                Assert.IsTrue(keys[i - 1] > keys[i]);
            }
        }
 private static void TestNode(RedBlackNULLTree <int, int> .Node node)
 {
     if (node.Red)
     {
         Assert.IsTrue((node.Less == null) == (node.More == null));
         if (node.Less != null)
         {
             Assert.IsFalse(node.Less.Red);
         }
         if (node.More != null)
         {
             Assert.IsFalse(node.More.Red);
         }
     }
     else
     {
         if (node.Less == null && node.More != null)
         {
             Assert.IsTrue(node.More.Red);
         }
         if (node.More == null && node.Less != null)
         {
             Assert.IsTrue(node.Less.Red);
         }
         if (node.Parent != null)
         {
             Assert.IsNotNull(node.Parent.Less);
             Assert.IsNotNull(node.Parent.More);
         }
     }
     if (node.Parent != null)
     {
         Assert.IsFalse(object.ReferenceEquals(node.Parent, node));
         Assert.IsFalse(object.ReferenceEquals(node.Parent, node.Less));
         Assert.IsFalse(object.ReferenceEquals(node.Parent, node.More));
     }
     if (node.Less != null)
     {
         Assert.IsFalse(object.ReferenceEquals(node.Less, node));
         Assert.IsTrue(object.ReferenceEquals(node.Less.Parent, node));
         TestNode(node.Less);
     }
     if (node.More != null)
     {
         Assert.IsFalse(object.ReferenceEquals(node.More, node));
         Assert.IsTrue(object.ReferenceEquals(node.More.Parent, node));
         TestNode(node.More);
     }
     if (node.Less != null && node.More != null)
     {
         Assert.IsFalse(object.ReferenceEquals(node.Less, node.More));
     }
 }
 private static void Tests(RedBlackNULLTree <int, int> tree)
 {
     TestNodes(tree);
     TestBlackCount(tree);
     TestHeight(tree);
     TestMinMaxKey(tree);
     TestNext(tree);
     TestTryNext(tree);
     TestPrev(tree);
     TestTryPrev(tree);
     TestCopyKeysAscending(tree);
     TestCopyKeysDescending(tree);
 }
        private static void TestMinMaxKey(RedBlackNULLTree <int, int> tree)
        {
            var minKey = tree.GetMinKey();
            var maxKey = tree.GetMaxKey();

            if (tree.Count > 1)
            {
                Assert.IsTrue(minKey < maxKey);
            }
            else
            {
                Assert.IsTrue(minKey == maxKey);
            }
        }
        private static int GetBlackCount(RedBlackNULLTree <int, int> .Node node)
        {
            var count = 0;

            while (true)
            {
                if (!node.Red)
                {
                    ++count;
                }
                node = node.Parent;
                if (node == null)
                {
                    return(count);
                }
            }
        }
        private static void TestBlackCount(RedBlackNULLTree <int, int> tree)
        {
            var node   = tree.GetMinNode();
            var blacks = GetBlackCount(node);

            while (true)
            {
                node = node.Next();
                if (node == null)
                {
                    break;
                }
                if (node.Less == null || node.More == null)
                {
                    Assert.AreEqual(blacks, GetBlackCount(node));
                }
            }
        }
        private static void TestPrev(RedBlackNULLTree <int, int> tree)
        {
            var node = tree.GetMaxNode();

            Assert.IsNotNull(node);
            var count = 1;

            while (true)
            {
                var prev = node.Prev();
                if (prev == null)
                {
                    break;
                }
                ++count;
                Assert.IsNotNull(prev);
                Assert.IsTrue(node.Key > prev.Key);
                node = prev;
            }
            Assert.AreEqual(tree.Count, count);
        }
        private static void TestNext(RedBlackNULLTree <int, int> tree)
        {
            var node = tree.GetMinNode();

            Assert.IsNotNull(node);
            var count = 1;

            while (true)
            {
                var next = node.Next();
                if (next == null)
                {
                    break;
                }
                ++count;
                Assert.IsNotNull(next);
                Assert.IsTrue(node.Key < next.Key);
                node = next;
            }
            Assert.AreEqual(tree.Count, count);
        }
        private static void TestTryPrev(RedBlackNULLTree <int, int> tree)
        {
            if (!tree.TryGetMaxNode(out var node))
            {
                Assert.Fail();
            }
            Assert.IsNotNull(node);
            var count = 1;

            while (true)
            {
                if (!node.TryPrev(out var prev))
                {
                    break;
                }
                ++count;
                Assert.IsNotNull(prev);
                Assert.IsTrue(node.Key > prev.Key);
                node = prev;
            }
            Assert.AreEqual(tree.Count, count);
        }
        private static void TestTryNext(RedBlackNULLTree <int, int> tree)
        {
            if (!tree.TryGetMinNode(out var node))
            {
                Assert.Fail();
            }
            Assert.IsNotNull(node);
            var count = 1;

            while (true)
            {
                if (!node.TryNext(out var next))
                {
                    break;
                }
                ++count;
                Assert.IsNotNull(next);
                Assert.IsTrue(node.Key < next.Key);
                node = next;
            }
            Assert.AreEqual(tree.Count, count);
        }
 private static void TestsAdd(RedBlackNULLTree <int, int> tree, int add)
 {
     tree.Add(add, add);
     Tests(tree);
 }