﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
using OfficeOpenXml.FormulaParsing;

namespace EPPlusTest.FormulaParsing.LexicalAnalysis
{
    [TestClass]
    public class TokenHandlerTests
    {
        private TokenizerContext _tokenizerContext;
        private TokenHandler _handler;

        [TestInitialize]
        public void Init()
        {
            _tokenizerContext = new TokenizerContext("test");
            InitHandler(_tokenizerContext);
        }

        private void InitHandler(TokenizerContext context)
        {
            var parsingContext = ParsingContext.Create();
            var tokenFactory = new TokenFactory(parsingContext.Configuration.FunctionRepository, null);
            _handler = new TokenHandler(_tokenizerContext, tokenFactory, new TokenSeparatorProvider()); 
        }

        [TestMethod]
        public void HasMoreTokensShouldBeTrueWhenTokensExists()
        {
            Assert.IsTrue(_handler.HasMore());
        }

        [TestMethod]
        public void HasMoreTokensShouldBeFalseWhenAllAreHandled()
        {
            for (var x = 0; x < "test".Length; x++ )
            {
                _handler.Next();
            }
            Assert.IsFalse(_handler.HasMore());
        }
    }
}
