public void RemoveValueAndPruneHierarchyWriter_removes_value_from_childNode()
        {
            // ARRANGE

            var childNodeMock = new Mock <NodeType>();

            childNodeMock
            .Setup(n => n.RemoveValue())
            .Returns(true);

            var childNode = childNodeMock.Object;

            var startNodeMock = new Mock <NodeType>();

            startNodeMock
            .Setup(n => n.TryGetChildNode("a"))
            .Returns((true, childNode));

            var writer = new RemoveValueAndPruneHierarchyWriter <string, int, NodeType>();

            // ACT

            writer.ClearValue(startNodeMock.Object, HierarchyPath.Create("a"));

            // ASSERT

            Assert.True(writer.ValueWasCleared);

            startNodeMock.Verify(n => n.RemoveValue(), Times.Never());
            startNodeMock.VerifyAll();
            childNodeMock.Verify(n => n.RemoveValue(), Times.Once());
            childNodeMock.VerifyAll();
        }
        public void RemoveValueAndPruneHierarchyWriter_prunes_hierarchy_if_no_descendant_has_value_and_no_value_was_removed()
        {
            // ARRANGE

            var childNodeMock = new Mock <NodeType>();

            childNodeMock
            .Setup(n => n.RemoveValue())
            .Returns(false);

            var childNode = childNodeMock.Object;
            var startNode = new Mock <NodeType>();

            startNode
            .Setup(n => n.TryGetChildNode("a"))
            .Returns((true, childNode));
            startNode
            .Setup(n => n.RemoveChild(childNode))
            .Returns(startNode.Object);     // node is changed in place

            var writer = new RemoveValueAndPruneHierarchyWriter <string, int, NodeType>();

            // ACT

            writer.ClearValue(startNode.Object, HierarchyPath.Create <string>("a"));

            // ASSERT

            Assert.False(writer.ValueWasCleared);

            startNode.Verify(n => n.TryGetChildNode("a"), Times.Once());
            startNode.Verify(n => n.RemoveChild(childNode), Times.Once());
            childNodeMock.Verify(n => n.RemoveValue());
        }
        public void RemoveValueAndPruneHierarchyWriter_doesnt_remove_value_from_startNode_child_if_no_value_was_set()
        {
            // ARRANGE

            var childNodeMock = new Mock <NodeType>();
            int value         = 0;

            childNodeMock
            .Setup(n => n.TryGetValue(out value))
            .Returns(false);
            childNodeMock
            .Setup(n => n.RemoveValue())
            .Returns(false);

            var childNode = childNodeMock.Object;
            var startNode = new Mock <NodeType>();

            startNode
            .Setup(n => n.TryGetChildNode("a"))
            .Returns((true, childNode));

            var writer = new RemoveValueAndPruneHierarchyWriter <string, int, NodeType>();

            // ACT

            writer.ClearValue(startNode.Object, HierarchyPath.Create <string>("a"));

            // ASSERT

            Assert.False(writer.ValueWasCleared);

            startNode.Verify(n => n.TryGetChildNode("a"), Times.Once());
            childNodeMock.Verify(n => n.RemoveValue());
        }
        /// <summary>
        /// Removes the value from the specified node in hierarchy.
        /// </summary>
        /// <param name="path"></param>
        /// <returns>true if value was removed, false otherwise</returns>
        public bool Remove(HierarchyPath <TKey> path)
        {
            var writer = new RemoveValueAndPruneHierarchyWriter <TKey, TValue, MutableNode <TKey, TValue> >();

            writer.ClearValue(this.rootNode, path);

            return(writer.ValueWasCleared);
        }
        public void RemoveValueAndPruneHierarchyWriter_doesnt_prune_hierarchy_if_value_wasnt_removed_and_descendant_has_value()
        {
            // ARRANGE

            int value = 0;

            var grandChildMock = new Mock <NodeType>();

            grandChildMock
            .Setup(n => n.TryGetValue(out value))
            .Returns(true);

            var childNodeMock = new Mock <NodeType>();

            childNodeMock
            .Setup(n => n.RemoveValue())
            .Returns(false);
            childNodeMock
            .Setup(n => n.HasChildNodes)
            .Returns(true);
            childNodeMock
            .Setup(n => n.ChildNodes)
            .Returns(new[] { grandChildMock.Object });

            var childNode = childNodeMock.Object;
            var startNode = new Mock <NodeType>();

            startNode
            .Setup(n => n.TryGetChildNode("a"))
            .Returns((true, childNode));

            var writer = new RemoveValueAndPruneHierarchyWriter <string, int, NodeType>();

            // ACT

            writer.ClearValue(startNode.Object, HierarchyPath.Create <string>("a"));

            // ASSERT

            Assert.False(writer.ValueWasCleared);

            startNode.Verify(n => n.TryGetChildNode("a"), Times.Once());
            startNode.Verify(n => n.RemoveChild(It.IsAny <NodeType>()), Times.Never());
            startNode.VerifyAll();
            childNodeMock.Verify(n => n.RemoveValue());
            childNodeMock.VerifyAll();
            grandChildMock.Verify(n => n.TryGetValue(out value), Times.Once());
            grandChildMock.VerifyAll();
        }
Example #6
0
        /// <summary>
        /// Removes the value from the specified node in hierarchy.
        /// </summary>
        /// <param name="path"></param>
        /// <returns>true if value was removed, false otherwise</returns>
        public bool Remove(HierarchyPath <TKey> path)
        {
            bool isLocked = false;

            try
            {
                var writer = new RemoveValueAndPruneHierarchyWriter <TKey, TValue, ImmutableNode <TKey, TValue> >();
                writer.ClearValue(this.rootNode, path);

                return(writer.ValueWasCleared);
            }
            finally
            {
                if (isLocked)
                {
                    this.writeLock.Exit();
                }
            }
        }
        public void RemoveValueAndPruneHierarchyWriter_removes_value_from_startNode()
        {
            // ARRANGE

            var startNode = new Mock <NodeType>();

            startNode
            .Setup(n => n.RemoveValue())
            .Returns(true);

            var writer = new RemoveValueAndPruneHierarchyWriter <string, int, NodeType>();

            // ACT

            writer.ClearValue(startNode.Object, HierarchyPath.Create <string>());

            // ASSERT

            Assert.True(writer.ValueWasCleared);

            startNode.Verify(n => n.RemoveValue(), Times.Once());
        }