public void RemoveNodeHierachyWriter_removes_childNodes_of_given_node()
        {
            // ARRANGE

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

            var startNodeMock = new Mock <NodeType>();

            startNodeMock
            .Setup(n => n.RemoveChild(childNode))
            .Returns(startNodeMock.Object);
            startNodeMock
            .Setup(n => n.HasChildNodes)
            .Returns(true);
            startNodeMock
            .Setup(n => n.ChildNodes)
            .Returns(new[] { childNodeMock.Object });

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

            // ACT

            var result = writer.RemoveChildNodes(startNodeMock.Object, out var childNodesWereRemoved);

            // ASSERT

            Assert.Same(result, startNodeMock.Object);
            Assert.True(childNodesWereRemoved);

            startNodeMock.Verify(n => n.RemoveChild(childNodeMock.Object), Times.Once());
            startNodeMock.VerifyAll();
        }
        public void RemoveNodeHierachyWriter_ignores_if_node_childNodes_exist()
        {
            // ARRANGE

            var startNodeMock = new Mock <NodeType>();

            startNodeMock
            .Setup(n => n.HasChildNodes)
            .Returns(false);

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

            // ACT

            var result = writer.RemoveChildNodes(startNodeMock.Object, out var childNodesWereRemoved);

            // ASSERT

            Assert.Same(result, startNodeMock.Object);
            Assert.False(childNodesWereRemoved);

            startNodeMock.Verify(n => n.RemoveChild(It.IsAny <NodeType>()), Times.Never());
            startNodeMock.VerifyAll();
        }