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

namespace EPPlusTest.ExcelUtilities
{
    [TestClass]
    public class ValueMatcherTests
    {
        private ValueMatcher _matcher;

        [TestInitialize]
        public void Setup()
        {
            _matcher = new ValueMatcher();
        }

        [TestMethod]
        public void ShouldReturn1WhenFirstParamIsSomethingAndSecondParamIsNull()
        {
            object o1 = 1;
            object o2 = null;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(1, result);
        }

        [TestMethod]
        public void ShouldReturnMinus1WhenFirstParamIsNullAndSecondParamIsSomething()
        {
            object o1 = null;
            object o2 = 1;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(-1, result);
        }

        [TestMethod]
        public void ShouldReturn0WhenBothParamsAreNull()
        {
            object o1 = null;
            object o2 = null;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(0, result);
        }

        [TestMethod]
        public void ShouldReturn0WhenBothParamsAreEqual()
        {
            object o1 = 1d;
            object o2 = 1d;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(0, result);
        }

        [TestMethod]
        public void ShouldReturnMinus1WhenFirstParamIsLessThanSecondParam()
        {
            object o1 = 1d;
            object o2 = 5d;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(-1, result);
        }

        [TestMethod]
        public void ShouldReturn1WhenFirstParamIsGreaterThanSecondParam()
        {
            object o1 = 3d;
            object o2 = 1d;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(1, result);
        }

        [TestMethod]
        public void ShouldReturn0WhenWhenParamsAreEqualStrings()
        {
            object o1 = "T";
            object o2 = "T";
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(0, result);
        }

        [TestMethod]
        public void ShouldReturn0WhenParamsAreEqualButDifferentTypes()
        {
            object o1 = "2";
            object o2 = 2d;
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(0, result, "IsMatch did not return 0 as expected when first param is a string and second a double");

            o1 = 2d;
            o2 = "2";
            result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(0, result, "IsMatch did not return 0 as expected when first param is a double and second a string");
        }

        [TestMethod]
        public void ShouldReturnMînus2WhenTypesDifferAndStringConversionToDoubleFails()
        {
            object o1 = 2d;
            object o2 = "T";
            var result = _matcher.IsMatch(o1, o2);
            Assert.AreEqual(-2, result);
        }
    }
}
