// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.IO;
using System.Xml;
using Microsoft.Web.XmlTransform;
using Xunit;

namespace Microsoft.Web.Xdt.Extensions
{
    public class InsertOrAppendAttributeTests
    {
        [Fact]
        public void InsertOrAppend_NoExesitingLine_InsertsLine()
        {
            var transform = new XmlTransformation(Path.GetFullPath("transform.xdt"));
            var doc = new XmlDocument();
            doc.Load("config_empty.xml");
            Assert.True(transform.Apply(doc));

            Assert.Equal(2, doc.ChildNodes.Count);
            var configurationNode = doc["configuration"];

            Assert.Equal(2, configurationNode.ChildNodes.Count);

            var firstChild = configurationNode.FirstChild;
            Assert.Equal("add", firstChild.Name);
            Assert.Equal("KeyName1", firstChild.Attributes["name"].Value);
            Assert.Equal("InsertValue1", firstChild.Attributes["value"].Value);

            var secondChild = firstChild.NextSibling;
            Assert.Equal("add", secondChild.Name);
            Assert.Equal("KeyName2", secondChild.Attributes["name"].Value);
            Assert.Equal("InsertValue2", secondChild.Attributes["value"].Value);
        }

        [Fact]
        public void InsertOrAppend_LineExistsButNoValueField_FieldInserted()
        {
            var transform = new XmlTransformation(Path.GetFullPath("transform.xdt"));
            var doc = new XmlDocument();
            doc.Load("config_existingline.xml");
            Assert.True(transform.Apply(doc));

            Assert.Equal(2, doc.ChildNodes.Count);
            var configurationNode = doc["configuration"];

            Assert.Equal(2, configurationNode.ChildNodes.Count);

            var firstChild = configurationNode.FirstChild;
            Assert.Equal("add", firstChild.Name);
            Assert.Equal("KeyName1", firstChild.Attributes["name"].Value);
            Assert.Equal("InsertValue1", firstChild.Attributes["value"].Value);

            var secondChild = firstChild.NextSibling;
            Assert.Equal("add", secondChild.Name);
            Assert.Equal("KeyName2", secondChild.Attributes["name"].Value);
            Assert.Equal("InsertValue2", secondChild.Attributes["value"].Value);
        }

        [Fact]
        public void InsertOrAppend_ExistingEmptyValue_InsertsValue()
        {
            var transform = new XmlTransformation(Path.GetFullPath("transform.xdt"));
            var doc = new XmlDocument();
            doc.Load("config_existingemptyvalue.xml");
            Assert.True(transform.Apply(doc));

            Assert.Equal(2, doc.ChildNodes.Count);
            var configurationNode = doc["configuration"];

            Assert.Equal(2, configurationNode.ChildNodes.Count);

            var firstChild = configurationNode.FirstChild;
            Assert.Equal("add", firstChild.Name);
            Assert.Equal("KeyName1", firstChild.Attributes["name"].Value);
            Assert.Equal("InsertValue1", firstChild.Attributes["value"].Value);

            var secondChild = firstChild.NextSibling;
            Assert.Equal("add", secondChild.Name);
            Assert.Equal("KeyName2", secondChild.Attributes["name"].Value);
            Assert.Equal("InsertValue2", secondChild.Attributes["value"].Value);
        }

        [Fact]
        public void InsertOrAppend_ExistingValue_AppendsValue()
        {
            var transform = new XmlTransformation(Path.GetFullPath("transform.xdt"));
            var doc = new XmlDocument();
            doc.Load("config_existingvalue.xml");
            Assert.True(transform.Apply(doc));

            Assert.Equal(2, doc.ChildNodes.Count);
            var configurationNode = doc["configuration"];

            Assert.Equal(2, configurationNode.ChildNodes.Count);

            var firstChild = configurationNode.FirstChild;
            Assert.Equal("add", firstChild.Name);
            Assert.Equal("KeyName1", firstChild.Attributes["name"].Value);
            Assert.Equal("ExistingValue1;InsertValue1", firstChild.Attributes["value"].Value);

            var secondChild = firstChild.NextSibling;
            Assert.Equal("add", secondChild.Name);
            Assert.Equal("KeyName2", secondChild.Attributes["name"].Value);
            Assert.Equal("ExistingValue2;InsertValue2", secondChild.Attributes["value"].Value);
        }
    }
}
