public void ImmutableNode_replaces_child_in_clone_current_instance()
        {
            // ARRANGE

            var child = new ImmutableNode <string, int>("a");
            var node  = new ImmutableNode <string, int>().AddChild(child);

            node.SetValue(1);
            var secondChild = new ImmutableNode <string, int>("a");

            // ACT

            var result = node.ReplaceChild(child, secondChild);

            // ASSERT

            Assert.NotSame(node, result);
            Assert.True(node.HasChildNodes);
            Assert.True(result.HasChildNodes);
            Assert.Equal(1, result.Value);

            var(found, readChildNode) = node.TryGetChildNode("a");

            Assert.True(found);
            Assert.Same(child, readChildNode);

            (found, readChildNode) = result.TryGetChildNode("a");

            Assert.True(found);
            Assert.Same(secondChild, readChildNode);
        }
        public void ImmutableNode_adds_child_to_clone_of_current_instance()
        {
            // ARRANGE

            var child = new ImmutableNode <string, int>("a");
            var node  = new ImmutableNode <string, int>();

            node.SetValue(1);

            // ACT

            var result = node.AddChild(child);

            // ASSERT
            // node creates a clone with the new child.

            Assert.NotSame(node, result);
            Assert.False(node.HasChildNodes);
            Assert.True(result.HasChildNodes);
            Assert.True(result.HasValue);
            Assert.Equal(1, result.Value);
            Assert.Same(child, result.ChildNodes.Single());

            var(found, addedChild) = node.TryGetChildNode("a");

            Assert.False(found);

            (found, addedChild) = result.TryGetChildNode("a");

            Assert.True(found);
            Assert.Same(child, addedChild);
        }