public void Insert_TreeIsUnbalanced_RebuildsTree(int root, int[] keys, int candidate, double alpha)
        {
            var tree = new ScapegoatTree <int>(root, alpha);

            tree.TreeIsUnbalanced += FailTreeIsUnbalanced;

            foreach (var item in keys)
            {
                Assert.DoesNotThrow(() => tree.Insert(item));
            }

            tree.TreeIsUnbalanced -= FailTreeIsUnbalanced;
            tree.TreeIsUnbalanced += PassTreeIsUnbalanced;

            Assert.Throws <SuccessException>(() => tree.Insert(candidate));
        }
        public void Contains_TreeDoesNotContainKey_ReturnsFalse()
        {
            var tree = new ScapegoatTree <int>(1);

            tree.Insert(2);

            Assert.IsFalse(tree.Contains(-1));
        }
        public void Contains_TreeHasKey_ReturnsTrue()
        {
            var tree = new ScapegoatTree <int>(1);

            tree.Insert(2);

            Assert.IsTrue(tree.Contains(2));
        }
        public void Remove_KeyIsRootWithTwoChildren_RemovesKey()
        {
            var tree = new ScapegoatTree <int>(1);

            var inserted = tree.Insert(-1);

            Assert.IsTrue(inserted);

            inserted = tree.Insert(2);

            Assert.IsTrue(inserted);

            var deleted = tree.Delete(1);

            Assert.IsTrue(deleted);
            Assert.AreEqual(2, tree.Size);
        }
        public void Insert_TreeIsUnbalanced_BalancesTree2(int root, int candidate, double alpha)
        {
            var tree = new ScapegoatTree <int>(root, alpha);

            var inserted = tree.Insert(candidate);

            Assert.True(inserted);
            Assert.True(tree.Size == 2);
            Assert.True(tree.IsAlphaWeightBalanced());
        }
        public void Insert_TreeIsUnbalanced_BalancesTree(int root, int[] keys, int candidate, double alpha)
        {
            var tree = new ScapegoatTree <int>(root, alpha);

            tree.TreeIsUnbalanced += FailTreeIsUnbalanced;

            foreach (var item in keys)
            {
                Assert.DoesNotThrow(() => tree.Insert(item));
            }

            tree.TreeIsUnbalanced -= FailTreeIsUnbalanced;

            var inserted = tree.Insert(candidate);

            Assert.True(inserted);
            Assert.True(tree.Size == 6);
            Assert.True(tree.IsAlphaWeightBalanced());
        }
        public void Insert_KeyIsNotPresent_KeyIsInserted()
        {
            var tree = new ScapegoatTree <int>(1);

            var inserted = tree.Insert(2);

            Assert.IsTrue(inserted);
            Assert.AreEqual(2, tree.Size);
            Assert.AreEqual(2, tree.MaxSize);
        }
        public void Insert_KeyIsPresent_ReturnsFalse()
        {
            var tree = new ScapegoatTree <int>(1);

            var inserted = tree.Insert(1);

            Assert.IsFalse(inserted);
            Assert.AreEqual(1, tree.Size);
            Assert.AreEqual(1, tree.MaxSize);
        }
        public void Insert_RootIsNull_InsertsRoot()
        {
            var tree = new ScapegoatTree <int>();

            var inserted = tree.Insert(1);

            Assert.IsTrue(inserted);
            Assert.IsNotNull(tree.Root);
            Assert.AreEqual(1, tree.Root !.Key);
            Assert.AreEqual(1, tree.Size);
            Assert.AreEqual(1, tree.MaxSize);
        }
        public void Remove_KeyIsPresent_RemovesKey()
        {
            var tree = new ScapegoatTree <int>(1);

            var inserted = tree.Insert(2);

            Assert.IsTrue(inserted);

            var deleted = tree.Delete(2);

            Assert.IsTrue(deleted);
            Assert.AreEqual(1, tree.Size);
        }
        public void Delete_TreeIsUnbalanced_MaxSizeEqualsSize(int root, int[] keys, int candidate, double alpha)
        {
            var tree = new ScapegoatTree <int>(root, alpha);

            tree.TreeIsUnbalanced += FailTreeIsUnbalanced;

            foreach (var item in keys)
            {
                Assert.DoesNotThrow(() => tree.Insert(item));
            }

            tree.TreeIsUnbalanced -= FailTreeIsUnbalanced;

            tree.Delete(candidate);

            Assert.AreEqual(tree.Size, tree.MaxSize);
        }
        public void Delete_TreeIsUnbalanced_BalancesTree(int root, int[] keys, int[] candidates, double alpha)
        {
            var tree = new ScapegoatTree <int>(root, alpha);

            tree.TreeIsUnbalanced += FailTreeIsUnbalanced;

            foreach (var item in keys)
            {
                Assert.DoesNotThrow(() => tree.Insert(item));
            }

            tree.TreeIsUnbalanced -= FailTreeIsUnbalanced;
            tree.TreeIsUnbalanced += PassTreeIsUnbalanced;

            Assert.Throws <SuccessException>(() =>
            {
                foreach (var item in candidates)
                {
                    tree.Delete(item);
                }
            });
        }