﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml.DataValidation;

namespace EPPlusTest.DataValidation
{
    [TestClass]
    public class ValidationCollectionTests : ValidationTestBase
    {
        [TestInitialize]
        public void Setup()
        {
            SetupTestData();
        }

        [TestCleanup]
        public void Cleanup()
        {
            CleanupTestData();
        }

        [TestMethod, ExpectedException(typeof(ArgumentNullException))]
        public void ExcelDataValidationCollection_AddDecimal_ShouldThrowWhenAddressIsNullOrEmpty()
        {
            // Act
            _sheet.DataValidations.AddDecimalValidation(string.Empty);
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelDataValidationCollection_AddDecimal_ShouldThrowWhenNewValidationCollidesWithExisting()
        {
            // Act
            _sheet.DataValidations.AddDecimalValidation("A1");
            _sheet.DataValidations.AddDecimalValidation("A1");
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelDataValidationCollection_AddInteger_ShouldThrowWhenNewValidationCollidesWithExisting()
        {
            // Act
            _sheet.DataValidations.AddIntegerValidation("A1");
            _sheet.DataValidations.AddIntegerValidation("A1");
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelDataValidationCollection_AddTextLength_ShouldThrowWhenNewValidationCollidesWithExisting()
        {
            // Act
            _sheet.DataValidations.AddTextLengthValidation("A1");
            _sheet.DataValidations.AddTextLengthValidation("A1");
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelDataValidationCollection_AddDateTime_ShouldThrowWhenNewValidationCollidesWithExisting()
        {
            // Act
            _sheet.DataValidations.AddDateTimeValidation("A1");
            _sheet.DataValidations.AddDateTimeValidation("A1");
        }

        [TestMethod]
        public void ExcelDataValidationCollection_Index_ShouldReturnItemAtIndex()
        {
            // Arrange
            _sheet.DataValidations.AddDateTimeValidation("A1");
            _sheet.DataValidations.AddDateTimeValidation("A2");
            _sheet.DataValidations.AddDateTimeValidation("B1");

            // Act
            var result = _sheet.DataValidations[1];

            // Assert
            Assert.AreEqual("A2", result.Address.Address);
        }

        [TestMethod]
        public void ExcelDataValidationCollection_FindAll_ShouldReturnValidationInColumnAonly()
        {
            // Arrange
            _sheet.DataValidations.AddDateTimeValidation("A1");
            _sheet.DataValidations.AddDateTimeValidation("A2");
            _sheet.DataValidations.AddDateTimeValidation("B1");

            // Act
            var result = _sheet.DataValidations.FindAll(x => x.Address.Address.StartsWith("A"));

            // Assert
            Assert.AreEqual(2, result.Count());

        }

        [TestMethod]
        public void ExcelDataValidationCollection_Find_ShouldReturnFirstMatchOnly()
        {
            // Arrange
            _sheet.DataValidations.AddDateTimeValidation("A1");
            _sheet.DataValidations.AddDateTimeValidation("A2");

            // Act
            var result = _sheet.DataValidations.Find(x => x.Address.Address.StartsWith("A"));

            // Assert
            Assert.AreEqual("A1", result.Address.Address);

        }

        [TestMethod]
        public void ExcelDataValidationCollection_Clear_ShouldBeEmpty()
        {
            // Arrange
            _sheet.DataValidations.AddDateTimeValidation("A1");

            // Act
            _sheet.DataValidations.Clear();

            // Assert
            Assert.AreEqual(0, _sheet.DataValidations.Count);

        }

        [TestMethod]
        public void ExcelDataValidationCollection_RemoveAll_ShouldRemoveMatchingEntries()
        {
            // Arrange
            _sheet.DataValidations.AddIntegerValidation("A1");
            _sheet.DataValidations.AddIntegerValidation("A2");
            _sheet.DataValidations.AddIntegerValidation("B1");

            // Act
            _sheet.DataValidations.RemoveAll(x => x.Address.Address.StartsWith("B"));

            // Assert
            Assert.AreEqual(2, _sheet.DataValidations.Count);
        }
    }
}
