﻿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);
        }
    }
}
