public void KeyValueNode_Factory_creates_root_node_with_value()
        {
            // ACT

            var result = KeyValueNode.RootNode <string, int>(value: 0);

            // ASSERT

            Assert.Equal(0, result.Value);
            Assert.False(result.HasKey);
            Assert.False(result.HasChildNodes);
            Assert.False(result.ChildNodes.Any());
        }
        public void KeyValueNode_fails_gracefully_on_removing_childnode_by_unkown_key()
        {
            // ARRANGE

            var root = KeyValueNode.RootNode <string, int>(0, KeyValueNode.InnerNode("a", 0));

            // ACT

            var result = root.Remove("x");

            // ASSERT

            Assert.False(result);
            Assert.Single(root.ChildNodes);
        }
        public void KeyValueNode_removes_childnode_by_key()
        {
            // ARRANGE

            var root = KeyValueNode.RootNode <string, int>(0, KeyValueNode.InnerNode("a", 0));

            // ACT

            var result = root.Remove("a");

            // ASSERT

            Assert.True(result);
            Assert.False(root.ChildNodes.Any());
        }
        public void KeyValueNode_substitutes_child_node_by_Key()
        {
            // ARRANGE

            var root  = KeyValueNode.RootNode <string, int>(0, KeyValueNode.InnerNode("a", 0));
            var child = KeyValueNode.InnerNode("a", 1);

            // ACT

            root.Set(child);

            // ASSERT

            Assert.Same(child, root.ChildNodes.Single());
        }
        public void KeyValueNode_adds_childnode_fails_on_duplicate_key()
        {
            // ARRANGE

            var root  = KeyValueNode.RootNode <string, int>(0, KeyValueNode.InnerNode("a", 0));
            var child = KeyValueNode.InnerNode("a", 1);

            // ACT

            var result = Assert.Throws <InvalidOperationException>(() => root.Add(child));

            // ASSERT

            Assert.True(root.HasChildNodes);
            Assert.NotSame(child, root.ChildNodes.Single());
        }
        public void KeyValueNode_adds_childnode()
        {
            // ARRANGE

            var root  = KeyValueNode.RootNode <string, int>(0);
            var child = KeyValueNode.InnerNode("a", 1);

            // ACT

            root.Add(child);

            // ASSERT

            Assert.True(root.HasChildNodes);
            Assert.Same(child, root.ChildNodes.Single());
        }
        public void KeyValueNode_Factory_creates_root_node_with_childNodes_and_grandchildren()
        {
            // ACT

            var result = KeyValueNode.RootNode <string, int>(0,
                                                             KeyValueNode.InnerNode("a", 1,
                                                                                    KeyValueNode.InnerNode("b", 2)));

            // ASSERT

            Assert.True(result.HasChildNodes);
            Assert.Equal("a", result.ChildNodes.Single().Key);
            Assert.True(result.ChildNodes.Single().HasChildNodes);
            Assert.Equal("b", result.ChildNodes.Single().ChildNodes.Single().Key);

            (var found, var child) = result.TryGetChildNode("a");

            Assert.True(found);
            Assert.Equal("a", child.Key);
        }