public void Should_handle_GetAncestors_operation_over_larger_hierarchy()
        {
            // build a sample hierarchy
            var hierarchyEntry = new HierarchyEntry
            {
                Name = "Test Hierarchy",
                SchemaName = "dbo",
                TableName = "test"
            };

            // initialize the provider
            var dataProvider = new MssqlDataProvider();
            var provider = new MssqlHierarchyDataProvider(dataProvider);

            // generate the complex hierarchy
            TestHierarchy.BuildTestHierarchy(hierarchyEntry, provider);

            var rootNode = provider.GetRootNode(hierarchyEntry);
            var primaryChildren = provider.GetChildren(hierarchyEntry, rootNode);
            var primaryChild1 = primaryChildren.First();
            var secondaryChildren = provider.GetChildren(hierarchyEntry, primaryChild1);
            var leafChild = secondaryChildren.First();

            var ancestors = provider.GetAncestors(hierarchyEntry, leafChild, true, true);

            Assert.That(ancestors.Count, Is.EqualTo(3));
            Assert.That(ancestors[0].LeftId, Is.EqualTo(1));
            Assert.That(ancestors[0].RightId, Is.EqualTo(14));
            Assert.That(ancestors[1].LeftId, Is.EqualTo(2));
            Assert.That(ancestors[1].RightId, Is.EqualTo(7));
            Assert.That(ancestors[2].LeftId, Is.EqualTo(leafChild.LeftId));
            Assert.That(ancestors[2].RightId, Is.EqualTo(leafChild.RightId));

            // clean up
            dataProvider.DropTable(hierarchyEntry.SchemaName, hierarchyEntry.TableName);
        }
        public void Should_handle_GetParent_operation_over_larger_hierarchy()
        {
            // build a sample hierarchy
            var hierarchyEntry = new HierarchyEntry
            {
                Name = "Test Hierarchy",
                SchemaName = "dbo",
                TableName = "test"
            };

            // initialize the provider
            var dataProvider = new MssqlDataProvider();
            var provider = new MssqlHierarchyDataProvider(dataProvider);

            // generate the complex hierarchy
            TestHierarchy.BuildTestHierarchy(hierarchyEntry, provider);

            var rootNode = provider.GetRootNode(hierarchyEntry);
            var primaryChildren = provider.GetChildren(hierarchyEntry, rootNode);
            var primaryChild1 = primaryChildren.First();
            var secondaryChildren = provider.GetChildren(hierarchyEntry, primaryChild1);
            var leafChild = secondaryChildren.First();

            var parent = provider.GetParent(hierarchyEntry, leafChild);

            Assert.That(parent.LeftId, Is.LessThan(leafChild.LeftId));
            Assert.That(parent.RightId, Is.GreaterThan(leafChild.RightId));

            // clean up
            dataProvider.DropTable(hierarchyEntry.SchemaName, hierarchyEntry.TableName);
        }
        public void Should_properly_create_and_handle_simple_hierarchy_with_basic_operations()
        {
            // build a sample hierarchy
            var hierarchyEntry = new HierarchyEntry
            {
                Name = "Test Hierarchy",
                SchemaName = "dbo",
                TableName = "test"
            };

            // initialize the provider
            var dataProvider = new MssqlDataProvider();
            var provider = new MssqlHierarchyDataProvider(dataProvider);

            // initialize the hierarchy
            var originalRootNode = new HierarchyNode
            {
                LeftId = 1,
                RightId = 2
            };
            var rootId = provider.Add(hierarchyEntry, originalRootNode);

            // test get root node
            var persistedRootNode = provider.GetRootNode(hierarchyEntry);

            Assert.That(persistedRootNode.Id, Is.EqualTo(rootId));
            Assert.That(persistedRootNode.LeftId, Is.EqualTo(1));
            Assert.That(persistedRootNode.RightId, Is.EqualTo(2));

            // then insert first primary child
            var firstChild = new HierarchyNode();
            firstChild.LeftId = persistedRootNode.RightId;
            provider.PrepareForInsertNode(hierarchyEntry, persistedRootNode);
            firstChild.RightId = firstChild.LeftId + 1;
            provider.Add(hierarchyEntry, firstChild);

            // verify new hierarchy
            persistedRootNode = provider.GetRootNode(hierarchyEntry);
            var firstChildren = provider.GetChildren(hierarchyEntry, persistedRootNode);

            Assert.That(firstChildren.Count, Is.EqualTo(1));
            Assert.That(firstChildren[0].Id, Is.Not.EqualTo(0));
            Assert.That(firstChildren[0].LeftId, Is.EqualTo(2));
            Assert.That(firstChildren[0].RightId, Is.EqualTo(3));
            Assert.That(persistedRootNode.LeftId, Is.EqualTo(1));
            Assert.That(persistedRootNode.RightId, Is.EqualTo(4));

            // insert second primary child
            var secondChild = new HierarchyNode();
            secondChild.LeftId = persistedRootNode.RightId;
            provider.PrepareForInsertNode(hierarchyEntry, persistedRootNode);
            secondChild.RightId = secondChild.LeftId + 1;
            provider.Add(hierarchyEntry, secondChild);

            // verify new hierarchy
            persistedRootNode = provider.GetRootNode(hierarchyEntry);
            var secondChildren = provider.GetChildren(hierarchyEntry, persistedRootNode);

            Assert.That(secondChildren.Count, Is.EqualTo(2));
            Assert.That(secondChildren[1].Id, Is.Not.EqualTo(0));
            Assert.That(secondChildren[1].LeftId, Is.EqualTo(4));
            Assert.That(secondChildren[1].RightId, Is.EqualTo(5));
            Assert.That(secondChildren[0].LeftId, Is.EqualTo(2));
            Assert.That(secondChildren[0].RightId, Is.EqualTo(3));
            Assert.That(persistedRootNode.LeftId, Is.EqualTo(1));
            Assert.That(persistedRootNode.RightId, Is.EqualTo(6));

            // delete a node
            var deleteNode = secondChildren[1];
            provider.Delete(hierarchyEntry, deleteNode);

            // verify revised hierarchy
            persistedRootNode = provider.GetRootNode(hierarchyEntry);
            var children = provider.GetChildren(hierarchyEntry, persistedRootNode);

            Assert.That(children.Count, Is.EqualTo(1));
            Assert.That(children[0].Id, Is.Not.EqualTo(0));
            Assert.That(children[0].LeftId, Is.EqualTo(2));
            Assert.That(children[0].RightId, Is.EqualTo(3));
            Assert.That(persistedRootNode.LeftId, Is.EqualTo(1));
            Assert.That(persistedRootNode.RightId, Is.EqualTo(4));

            // clean up
            dataProvider.DropTable(hierarchyEntry.SchemaName, hierarchyEntry.TableName);
        }