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

namespace EPPlusTest.FormulaParsing.ExpressionGraph
{
    [TestClass]
    public class ExpressionFactoryTests
    {
        private IExpressionFactory _factory;
        private ParsingContext _parsingContext;

        [TestInitialize]
        public void Setup()
        {
            _parsingContext = ParsingContext.Create();
            var provider = MockRepository.GenerateStub<ExcelDataProvider>();
            _factory = new ExpressionFactory(provider, _parsingContext);
        }

        [TestMethod]
        public void ShouldReturnIntegerExpressionWhenTokenIsInteger()
        {
            var token = new Token("2", TokenType.Integer);
            var expression = _factory.Create(token);
            Assert.IsInstanceOfType(expression, typeof(IntegerExpression));
        }

        [TestMethod]
        public void ShouldReturnBooleanExpressionWhenTokenIsBoolean()
        {
            var token = new Token("true", TokenType.Boolean);
            var expression = _factory.Create(token);
            Assert.IsInstanceOfType(expression, typeof(BooleanExpression));
        }

        [TestMethod]
        public void ShouldReturnDecimalExpressionWhenTokenIsDecimal()
        {
            var token = new Token("2.5", TokenType.Decimal);
            var expression = _factory.Create(token);
            Assert.IsInstanceOfType(expression, typeof(DecimalExpression));
        }

        [TestMethod]
        public void ShouldReturnExcelRangeExpressionWhenTokenIsExcelAddress()
        {
            var token = new Token("A1", TokenType.ExcelAddress);
            var expression = _factory.Create(token);
            Assert.IsInstanceOfType(expression, typeof(ExcelAddressExpression));
        }

        [TestMethod]
        public void ShouldReturnNamedValueExpressionWhenTokenIsNamedValue()
        {
            var token = new Token("NamedValue", TokenType.NameValue);
            var expression = _factory.Create(token);
            Assert.IsInstanceOfType(expression, typeof(NamedValueExpression));
        }
    }
}
