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