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

namespace EPPlusTest.DataValidation
{
    [TestClass]
    public class ExcelTimeTests
    {
        private ExcelTime _time;
        private readonly decimal SecondsPerHour = 3600;
       // private readonly decimal HoursPerDay = 24;
        private readonly decimal SecondsPerDay = 3600 * 24;

        private decimal Round(decimal value)
        {
            return Math.Round(value, ExcelTime.NumberOfDecimals);
        }

        [TestInitialize]
        public void Setup()
        {
            _time = new ExcelTime();
        }

        [TestCleanup]
        public void Cleanup()
        {
            _time = null;
        }

        [TestMethod, ExpectedException(typeof(ArgumentException))]
        public void ExcelTimeTests_ConstructorWithValue_ShouldThrowIfValueIsLessThan0()
        {
            new ExcelTime(-1);
        }

        [TestMethod, ExpectedException(typeof(ArgumentException))]
        public void ExcelTimeTests_ConstructorWithValue_ShouldThrowIfValueIsEqualToOrGreaterThan1()
        {
            new ExcelTime(1);
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelTimeTests_Hour_ShouldThrowIfNegativeValue()
        {
            _time.Hour = -1;
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelTimeTests_Minute_ShouldThrowIfNegativeValue()
        {
            _time.Minute = -1;
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelTimeTests_Minute_ShouldThrowIValueIsGreaterThan59()
        {
            _time.Minute = 60;
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelTimeTests_Second_ShouldThrowIfNegativeValue()
        {
            _time.Second = -1;
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void ExcelTimeTests_Second_ShouldThrowIValueIsGreaterThan59()
        {
            _time.Second = 60;
        }

        [TestMethod]
        public void ExcelTimeTests_ToExcelTime_HourIsSet()
        {
            // Act
            _time.Hour = 1;
            
            // Assert
            Assert.AreEqual(Round(SecondsPerHour/SecondsPerDay), _time.ToExcelTime());
        }

        [TestMethod]
        public void ExcelTimeTests_ToExcelTime_MinuteIsSet()
        {
            // Arrange
            decimal expected = SecondsPerHour + (20M * 60M);
            // Act
            _time.Hour = 1;
            _time.Minute = 20;

            // Assert
            Assert.AreEqual(Round(expected/SecondsPerDay), _time.ToExcelTime());
        }

        [TestMethod]
        public void ExcelTimeTests_ToExcelTime_SecondIsSet()
        {
            // Arrange
            decimal expected = SecondsPerHour + (20M * 60M) + 10M;
            // Act
            _time.Hour = 1;
            _time.Minute = 20;
            _time.Second = 10;

            // Assert
            Assert.AreEqual(Round(expected / SecondsPerDay), _time.ToExcelTime());
        }

        [TestMethod]
        public void ExcelTimeTests_ConstructorWithValue_ShouldSetHour()
        {
            // Arrange
            decimal value = 3660M/(decimal)SecondsPerDay;

            // Act
            var time = new ExcelTime(value);

            // Assert
            Assert.AreEqual(1, time.Hour);
        }

        [TestMethod]
        public void ExcelTimeTests_ConstructorWithValue_ShouldSetMinute()
        {
            // Arrange
            decimal value = 3660M / (decimal)SecondsPerDay;

            // Act
            var time = new ExcelTime(value);

            // Assert
            Assert.AreEqual(1, time.Minute);
        }

        [TestMethod]
        public void ExcelTimeTests_ConstructorWithValue_ShouldSetSecond()
        {
            // Arrange
            decimal value = 3662M / (decimal)SecondsPerDay;

            // Act
            var time = new ExcelTime(value);

            // Assert
            Assert.AreEqual(2, time.Second);
        }
    }
}
