﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml.FormulaParsing.Excel.Functions;

namespace EPPlusTest.Excel.Functions
{
    [TestClass]
    public class ArgumentParsersImplementationsTests
    {
        [TestMethod, ExpectedException(typeof(ArgumentNullException))]
        public void IntParserShouldThrowIfArgumentIsNull()
        {
            var parser = new IntArgumentParser();
            parser.Parse(null);
        }

        [TestMethod]
        public void IntParserShouldConvertToAnInteger()
        {
            var parser = new IntArgumentParser();
            var result = parser.Parse(3);
            Assert.AreEqual(3, result);
        }

        [TestMethod]
        public void IntParserShouldConvertADoubleToAnInteger()
        {
            var parser = new IntArgumentParser();
            var result = parser.Parse(3d);
            Assert.AreEqual(3, result);
        }

        [TestMethod]
        public void IntParserShouldConvertAStringValueToAnInteger()
        {
            var parser = new IntArgumentParser();
            var result = parser.Parse("3");
            Assert.AreEqual(3, result);
        }

        [TestMethod]
        public void BoolParserShouldConvertNullToFalse()
        {
            var parser = new BoolArgumentParser();
            var result = (bool)parser.Parse(null);
            Assert.IsFalse(result);
        }

        [TestMethod]
        public void BoolParserShouldConvertStringValueTrueToBoolValueTrue()
        {
            var parser = new BoolArgumentParser();
            var result = (bool)parser.Parse("true");
            Assert.IsTrue(result);
        }

        [TestMethod]
        public void BoolParserShouldConvert0ToFalse()
        {
            var parser = new BoolArgumentParser();
            var result = (bool)parser.Parse(0);
            Assert.IsFalse(result);
        }

        [TestMethod]
        public void BoolParserShouldConvert1ToTrue()
        {
            var parser = new BoolArgumentParser();
            var result = (bool)parser.Parse(0);
            Assert.IsFalse(result);
        }

        [TestMethod]
        public void DoubleParserShouldConvertDoubleToDouble()
        {
            var parser = new DoubleArgumentParser();
            var result = parser.Parse(3d);
            Assert.AreEqual(3d, result);
        }

        [TestMethod]
        public void DoubleParserShouldConvertIntToDouble()
        {
            var parser = new DoubleArgumentParser();
            var result = parser.Parse(3);
            Assert.AreEqual(3d, result);
        }

        [TestMethod, ExpectedException(typeof(ArgumentNullException))]
        public void DoubleParserShouldThrowIfArgumentIsNull()
        {
            var parser = new DoubleArgumentParser();
            parser.Parse(null);
        }

        [TestMethod]
        public void DoubleParserConvertStringToDoubleWithDotSeparator()
        {
            var parser = new DoubleArgumentParser();
            var result = parser.Parse("3.3");
            Assert.AreEqual(3.3d, result);
        }

    }
}
