﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
using OfficeOpenXml.FormulaParsing.Exceptions;

namespace EPPlusTest.FormulaParsing.LexicalAnalysis
{
    [TestClass]
    public class SyntacticAnalyzerTests
    {
        private ISyntacticAnalyzer _analyser;

        [TestInitialize]
        public void Setup()
        {
            _analyser = new SyntacticAnalyzer();
        }

        [TestMethod]
        public void ShouldPassIfParenthesisAreWellformed()
        {
            var input = new List<Token>
            {
                new Token("(", TokenType.OpeningParenthesis),
                new Token("1", TokenType.Integer),
                new Token("+", TokenType.Operator),
                new Token("2", TokenType.Integer),
                new Token(")", TokenType.ClosingParenthesis)
            };
            _analyser.Analyze(input);
        }

        [TestMethod, ExpectedException(typeof(FormatException))]
        public void ShouldThrowExceptionIfParenthesesAreNotWellformed()
        {
            var input = new List<Token>
            {
                new Token("(", TokenType.OpeningParenthesis),
                new Token("1", TokenType.Integer),
                new Token("+", TokenType.Operator),
                new Token("2", TokenType.Integer)
            };
            _analyser.Analyze(input);
        }

        [TestMethod]
        public void ShouldPassIfStringIsWellformed()
        {
            var input = new List<Token>
            {
                new Token("'", TokenType.String),
                new Token("abc123", TokenType.StringContent),
                new Token("'", TokenType.String)
            };
            _analyser.Analyze(input);
        }

        [TestMethod, ExpectedException(typeof(FormatException))]
        public void ShouldThrowExceptionIfStringHasNotClosing()
        {
            var input = new List<Token>
            {
                new Token("'", TokenType.String),
                new Token("abc123", TokenType.StringContent)
            };
            _analyser.Analyze(input);
        }


        [TestMethod, ExpectedException(typeof(UnrecognizedTokenException))]
        public void ShouldThrowExceptionIfThereIsAnUnrecognizedToken()
        {
            var input = new List<Token>
            {
                new Token("abc123", TokenType.Unrecognized)
            };
            _analyser.Analyze(input);
        }
    }
}
