public void NextKeyTest()
        {
            var tree = new VanEmdeBoasTree <int>(111);

            tree.Insert(100, 1100);
            tree.Insert(77, 1077);
            tree.Insert(33, 1033);
            tree.Insert(55, 1055);

            Assert.Null(tree.NextKey(100));
            Assert.Equal(100, tree.NextKey(77));
            Assert.Equal(33, tree.NextKey(10));
            Assert.Equal(55, tree.NextKey(33));
            Assert.Equal(100, tree.NextKey(77));

            Assert.True(tree.Delete(33));
            Assert.Equal(55, tree.NextKey(10));

            for (int i = 0; i < tree.Capacity; ++i)
            {
                tree.Insert(i, i * 100);
            }

            for (int i = 0; i < tree.Capacity - 1; ++i)
            {
                Assert.Equal(i + 1, tree.NextKey(i));
            }

            Assert.Null(tree.NextKey(tree.Capacity - 1));
        }
        public void PreviousKeyTest()
        {
            var tree = new VanEmdeBoasTree <int>(111);

            tree.Insert(100, 1100);
            tree.Insert(77, 1077);
            tree.Insert(33, 1033);
            tree.Insert(55, 1055);

            Assert.Null(tree.PreviousKey(33));
            Assert.Equal(77, tree.PreviousKey(100));
            Assert.Equal(33, tree.PreviousKey(55));
            Assert.Equal(100, tree.PreviousKey(110));

            for (int i = 0; i < tree.Capacity; ++i)
            {
                tree.Insert(i, i * 100);
            }

            for (int i = 1; i < tree.Capacity; ++i)
            {
                Assert.Equal(i - 1, tree.PreviousKey(i));
            }

            Assert.Null(tree.PreviousKey(0));
        }
        public void VanEmdeBoasNodeTest(int universeSize)
        {
            var tree = new VanEmdeBoasTree <string>(universeSize);

            Assert.Equal(universeSize, tree.Capacity);

            for (int i = 0; i < universeSize; ++i)
            {
                Assert.False(tree.Contains(i));
            }

            for (int i = 0; i < universeSize; ++i)
            {
                tree.Insert(i, i.ToString());
            }

            Assert.Equal(universeSize, tree.Count);

            for (int i = universeSize - 1; i > 0; i -= 3)
            {
                Assert.True(tree.Contains(i));
                Assert.Equal(i.ToString(), tree.GetValue(i));
            }

            for (int i = 0; i < universeSize; ++i)
            {
                Assert.True(tree.Contains(i));
                Assert.Equal(i.ToString(), tree.GetValue(i));
            }
        }
        public void VanEmdeBoasTree_CLRS_Book_SuccessorTest()
        {
            // Arrange.
            IReadOnlyList <int> values   = TestData.Get_CLRS_Figure20_6_Values();
            const int           universe = 16;
            int expectedMinimum          = values.Min();
            int expectedMaximum          = values.Max();
            IVanEmdeBoasTree tree;

            // Act.
            tree = new VanEmdeBoasTree(universe, values);

            // Assert.
            int?successorFound = tree.Successor(expectedMaximum);
            int expectedSuccessor;

            Assert.IsNull(
                successorFound,
                $"The van Emde Boas tree claims to have found a successor to the largest value ({successorFound}).");
            for (int i = 0; i < values.Count - 1; i++)
            {
                successorFound = tree.Successor(values[i]);

                Assert.IsNotNull(
                    successorFound,
                    $"The van Emde Boas tree could not find a successor to value {values[i]}.");

                expectedSuccessor = values[i + 1];
                Assert.AreEqual(
                    expectedSuccessor,
                    successorFound,
                    $"The successor the van Emde Boas tree found for value {values[i]} was {successorFound}, not {expectedSuccessor}.");
            }
        }
        public void VanEmdeBoasTree_CLRS_Book_MembershipTest()
        {
            // Arrange.
            IReadOnlyList <int> values   = TestData.Get_CLRS_Figure20_6_Values();
            const int           universe = 16;
            int expectedMinimum          = values.Min();
            int expectedMaximum          = values.Max();
            IVanEmdeBoasTree tree;

            // Act.
            tree = new VanEmdeBoasTree(universe, values);

            // Assert.
            for (int i = 0; i <= universe; i++)
            {
                if (values.Contains(i))
                {
                    Assert.IsTrue(
                        tree.Member(i),
                        $"The van Emde Boas tree claims not to contain a value it should ({i}).");
                }
                else
                {
                    Assert.IsFalse(
                        tree.Member(i),
                        $"The van Emde Boas tree claims to contain a value it should not ({i}).");
                }
            }
        }
        public void OutOfRanngeKeyTest()
        {
            var tree = new VanEmdeBoasTree <int>(64);

            Assert.Throws <ArgumentOutOfRangeException>(() => tree.GetValue(-1));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.GetValue(100));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.Contains(-1));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.Contains(100));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.Delete(-1));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.Delete(100));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.Insert(-1, 1));
            Assert.Throws <ArgumentOutOfRangeException>(() => tree.Insert(100, 1));
        }
        public void VanEmdeBoasTree_CLRS_Book_TreeStructureTest()
        {
            // Arrange.
            IReadOnlyList <int> values           = TestData.Get_CLRS_Figure20_6_Values();
            const int           universe         = 16;
            int                  expectedMinimum = values.Min();
            int                  expectedMaximum = values.Max();
            VanEmdeBoasTree      tree;
            IVanEmdeBoasTreeNode root;

            // Act.
            tree = new VanEmdeBoasTree(universe, values);

            // Assert.

            // Check the root node.
            root = tree.Root;
            Utility.CheckNode(root, "The van Emde Boas tree root", universe, expectedMinimum, expectedMaximum, false, 4);

            // Check depth 1.
            Utility.CheckNode(root.Summary, "vEB(4) node 1", 4, 0, 3, false, 2);
            Utility.CheckNode(root.Cluster[0], "vEB(4) node 2", 4, 3, 3, false, 2);
            Utility.CheckNode(root.Cluster[1], "vEB(4) node 3", 4, 0, 3, false, 2);
            Utility.CheckNode(root.Cluster[2], "vEB(4) node 4", 4, null, null, false, 2);
            Utility.CheckNode(root.Cluster[3], "vEB(4) node 5", 4, 2, 3, false, 2);

            // Check depth 2.
            Utility.CheckNode(root.Summary.Summary, "vEB(2) node 1", 2, 0, 1, true, 0);
            Utility.CheckNode(root.Summary.Cluster[0], "vEB(2) node 2", 2, 1, 1, true, 0);
            Utility.CheckNode(root.Summary.Cluster[1], "vEB(2) node 3", 2, 1, 1, true, 0);

            Utility.CheckNode(root.Cluster[0].Summary, "vEB(2) node 4", 2, null, null, true, 0);
            Utility.CheckNode(root.Cluster[0].Cluster[0], "vEB(2) node 5", 2, null, null, true, 0);
            Utility.CheckNode(root.Cluster[0].Cluster[1], "vEB(2) node 6", 2, null, null, true, 0);

            Utility.CheckNode(root.Cluster[1].Summary, "vEB(2) node 7", 2, 0, 1, true, 0);
            Utility.CheckNode(root.Cluster[1].Cluster[0], "vEB(2) node 8", 2, 1, 1, true, 0);
            Utility.CheckNode(root.Cluster[1].Cluster[1], "vEB(2) node 9", 2, 1, 1, true, 0);

            Utility.CheckNode(root.Cluster[2].Summary, "vEB(2) node 10", 2, null, null, true, 0);
            Utility.CheckNode(root.Cluster[2].Cluster[0], "vEB(2) node 11", 2, null, null, true, 0);
            Utility.CheckNode(root.Cluster[2].Cluster[1], "vEB(2) node 12", 2, null, null, true, 0);

            Utility.CheckNode(root.Cluster[3].Summary, "vEB(2) node 13", 2, 1, 1, true, 0);
            Utility.CheckNode(root.Cluster[3].Cluster[0], "vEB(2) node 14", 2, null, null, true, 0);
            Utility.CheckNode(root.Cluster[3].Cluster[1], "vEB(2) node 15", 2, 1, 1, true, 0);
        }
        public void VanEmdeBoasNodeDeleteTest(int capacity, int expectedCapacity)
        {
            var tree = new VanEmdeBoasTree <int>(capacity);

            Assert.Equal(expectedCapacity, tree.Capacity);

            for (int i = 0; i < tree.Capacity; ++i)
            {
                tree.Insert(i, 100 * i);
            }

            int numDeleted = 0;

            for (int i = 0; i < tree.Capacity; i += 3)
            {
                ++numDeleted;
                Assert.True(tree.Delete(i));
                Assert.Equal(tree.Capacity - numDeleted, tree.Count);
            }

            for (int i = tree.Capacity - 2; i >= 0; i -= 2)
            {
                bool toDelete = i % 3 != 0;

                Assert.Equal(toDelete, tree.Delete(i));

                if (toDelete)
                {
                    ++numDeleted;
                }
            }

            Assert.Equal(tree.Capacity - numDeleted, tree.Count);

            for (int i = 0; i < tree.Capacity; i += 2)
            {
                bool deleted = (i % 2 == 0) || (i % 3 == 0);
                Assert.Equal(!deleted, tree.Contains(i));
                Assert.Equal(deleted ? 0 : i * 100, tree.GetValue(i));
            }
        }
        public void VanEmdeBoasNodeInsertTest()
        {
            var tree = new VanEmdeBoasTree <int>(64);

            Assert.Equal(0, tree.Count);

            Assert.False(tree.Contains(1));
            Assert.True(tree.Insert(1, 11));
            Assert.Equal(11, tree.GetValue(1));
            Assert.True(tree.Contains(1));

            Assert.False(tree.Insert(1, 10));
            Assert.Equal(10, tree.GetValue(1));
            Assert.True(tree.Contains(1));

            Assert.False(tree.Contains(50));
            Assert.True(tree.Insert(50, 101));
            Assert.Equal(101, tree.GetValue(50));
            Assert.True(tree.Contains(50));

            Assert.Equal(2, tree.Count);
        }