﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Rhino.Mocks;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.ExcelUtilities;

namespace EPPlusTest.ExcelUtilities
{
    [TestClass]
    public class IndexToAddressTranslatorTests
    {
        private ExcelDataProvider _excelDataProvider;
        private IndexToAddressTranslator _indexToAddressTranslator;

        [TestInitialize]
        public void Setup()
        {
            SetupTranslator(12345, ExcelReferenceType.RelativeRowAndColumn);
        }

        private void SetupTranslator(int maxRows, ExcelReferenceType refType)
        {
            _excelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
            _excelDataProvider.Stub(x => x.ExcelMaxRows).Return(maxRows);
            _indexToAddressTranslator = new IndexToAddressTranslator(_excelDataProvider, refType);
        }

        [TestMethod, ExpectedException(typeof(ArgumentNullException))]
        public void ShouldThrowIfExcelDataProviderIsNull()
        {
            new IndexToAddressTranslator(null);
        }

        [TestMethod]
        public void ShouldTranslate1And1ToA1()
        {
            var result = _indexToAddressTranslator.ToAddress(1, 1);
            Assert.AreEqual("A1", result);
        }

        [TestMethod]
        public void ShouldTranslate27And1ToAA1()
        {
            var result = _indexToAddressTranslator.ToAddress(27, 1);
            Assert.AreEqual("AA1", result);
        }

        [TestMethod]
        public void ShouldTranslate53And1ToBA1()
        {
            var result = _indexToAddressTranslator.ToAddress(53, 1);
            Assert.AreEqual("BA1", result);
        }

        [TestMethod]
        public void ShouldTranslate702And1ToZZ1()
        {
            var result = _indexToAddressTranslator.ToAddress(702, 1);
            Assert.AreEqual("ZZ1", result);
        }

        [TestMethod]
        public void ShouldTranslate703ToAAA4()
        {
            var result = _indexToAddressTranslator.ToAddress(703, 4);
            Assert.AreEqual("AAA4", result);
        }

        [TestMethod]
        public void ShouldTranslateToEntireColumnWhenRowIsEqualToMaxRows()
        {
            _excelDataProvider.Stub(x => x.ExcelMaxRows).Return(123456);
            var result = _indexToAddressTranslator.ToAddress(1, 123456);
            Assert.AreEqual("A", result);
        }

        [TestMethod]
        public void ShouldTranslateToAbsoluteAddress()
        {
            SetupTranslator(123456, ExcelReferenceType.AbsoluteRowAndColumn);
            var result = _indexToAddressTranslator.ToAddress(1, 1);
            Assert.AreEqual("$A$1", result);
        }

        [TestMethod]
        public void ShouldTranslateToAbsoluteRowAndRelativeCol()
        {
            SetupTranslator(123456, ExcelReferenceType.AbsoluteRowRelativeColumn);
            var result = _indexToAddressTranslator.ToAddress(1, 1);
            Assert.AreEqual("A$1", result);
        }

        [TestMethod]
        public void ShouldTranslateToRelativeRowAndAbsoluteCol()
        {
            SetupTranslator(123456, ExcelReferenceType.RelativeRowAbsolutColumn);
            var result = _indexToAddressTranslator.ToAddress(1, 1);
            Assert.AreEqual("$A1", result);
        }

        [TestMethod]
        public void ShouldTranslateToRelativeRowAndCol()
        {
            SetupTranslator(123456, ExcelReferenceType.RelativeRowAndColumn);
            var result = _indexToAddressTranslator.ToAddress(1, 1);
            Assert.AreEqual("A1", result);
        }
    }
}
