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(); }
/// <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()); }