using Grand.Domain.Catalog;
using Grand.Domain.Common;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Grand.Business.Catalog.Tests.Service.Products
{
    [TestClass()]
    public class ProductExtensionsAttributeParserTests
    {
        private List<CustomAttribute> customAtr;

        [TestInitialize()]
        public void Init()
        {
            customAtr = new List<CustomAttribute>()
            {
                new CustomAttribute(){Key="key1",Value="value1" },
                new CustomAttribute(){Key="key2",Value="value2" },
                new CustomAttribute(){Key="key3",Value="value3" },
                new CustomAttribute(){Key="key4",Value="value4" },
            };
        }

        [TestMethod()]
        public void ParseProductAttributeMappings_ReturnExpectedValues()
        {
            var product = new Product();
            product.ProductAttributeMappings.Add(new ProductAttributeMapping() { Id = "key1" });
            product.ProductAttributeMappings.Add(new ProductAttributeMapping() { Id = "key2" });
            var result = product.ParseProductAttributeMappings(customAtr);

            Assert.IsTrue(result.Any(c => c.Id.Equals("key1")));
            Assert.IsTrue(result.Any(c => c.Id.Equals("key2")));
            Assert.IsFalse(result.Any(c => c.Id.Equals("key3")));
            Assert.IsFalse(result.Any(c => c.Id.Equals("key4")));
        }

        [TestMethod()]
        public void ParseProductAttributeMappings_ReturnEmptyList()
        {
            var product = new Product();
            product.ProductAttributeMappings.Add(new ProductAttributeMapping() { Id = "key10" });
            product.ProductAttributeMappings.Add(new ProductAttributeMapping() { Id = "key12" });
            var result = product.ParseProductAttributeMappings(customAtr);
            Assert.IsTrue(result.Count == 0);
        }

        [TestMethod()]
        public void ParseProductAttributeValues_ReturnExpectedValues()
        {
            var product = new Product();
            var mapping1 = new ProductAttributeMapping() { Id = "key1" };
            mapping1.ProductAttributeValues.Add(new ProductAttributeValue() { Id = "value1" });
            product.ProductAttributeMappings.Add(mapping1);
            var mapping2 = new ProductAttributeMapping() { Id = "key2" };
            mapping2.ProductAttributeValues.Add(new ProductAttributeValue() { Id = "value2" });
            product.ProductAttributeMappings.Add(mapping2);
            var result = product.ParseProductAttributeValues(customAtr);

            Assert.IsTrue(result.Any(c => c.Id.Equals("value1")));
            Assert.IsTrue(result.Any(c => c.Id.Equals("value2")));
            Assert.IsFalse(result.Any(c => c.Id.Equals("value3")));
            Assert.IsFalse(result.Any(c => c.Id.Equals("value4")));
        }

        [TestMethod()]
        public void ParseValues_ReturnExpectedValues()
        {
            var result = ProductExtensions.ParseValues(customAtr, "key1");
            Assert.IsTrue(result.Any(c => c.Equals("value1")));
        }

        [TestMethod()]
        public void AddProductAttribute_ReturnExpectedValues()
        {
            var result = ProductExtensions.AddProductAttribute(customAtr, new ProductAttributeMapping() { Id = "key6" }, "value6");
            Assert.IsTrue(result.Count == 5);
            Assert.IsTrue(result.Last().Value.Equals("value6"));
        }

        [TestMethod()]
        public void RemoveProductAttribute_ReturnExpectedValues()
        {
            var result = ProductExtensions.RemoveProductAttribute(customAtr, new ProductAttributeMapping() { Id = "key1" });
            Assert.IsTrue(result.Count == 3);
            Assert.IsFalse(result.Any(c => c.Key.Equals("key1")));
        }
    }
}
