blob: b3905be983604b632daf10d293c8766602a2b42f [file] [log] [blame]
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.ExpressionGraph;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
using OfficeOpenXml.FormulaParsing;
namespace EPPlusTest.FormulaParsing.LexicalAnalysis
{
[TestClass]
public class SourceCodeTokenizerTests
{
private SourceCodeTokenizer _tokenizer;
[TestInitialize]
public void Setup()
{
var context = ParsingContext.Create();
_tokenizer = new SourceCodeTokenizer(context.Configuration.FunctionRepository, null);
}
[TestCleanup]
public void Cleanup()
{
}
[TestMethod]
public void ShouldCreateTokensForStringCorrectly()
{
var input = "\"abc123\"";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(3, tokens.Count());
Assert.AreEqual(TokenType.String, tokens.First().TokenType);
Assert.AreEqual(TokenType.StringContent, tokens.ElementAt(1).TokenType);
Assert.AreEqual(TokenType.String, tokens.Last().TokenType);
}
[TestMethod]
public void ShouldTokenizeStringCorrectly()
{
var input = "'ab(c)d'";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(3, tokens.Count());
}
[TestMethod]
public void ShouldCreateTokensForFunctionCorrectly()
{
var input = "Text(2)";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(4, tokens.Count());
Assert.AreEqual(TokenType.Function, tokens.First().TokenType);
Assert.AreEqual(TokenType.OpeningParenthesis, tokens.ElementAt(1).TokenType);
Assert.AreEqual(TokenType.Integer, tokens.ElementAt(2).TokenType);
Assert.AreEqual("2", tokens.ElementAt(2).Value);
Assert.AreEqual(TokenType.ClosingParenthesis, tokens.Last().TokenType);
}
[TestMethod]
public void ShouldHandleMultipleCharOperatorCorrectly()
{
var input = "1 <= 2";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(3, tokens.Count());
Assert.AreEqual("<=", tokens.ElementAt(1).Value);
Assert.AreEqual(TokenType.Operator, tokens.ElementAt(1).TokenType);
}
[TestMethod]
public void ShouldCreateTokensForEnumerableCorrectly()
{
var input = "Text({1;2})";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(8, tokens.Count());
Assert.AreEqual(TokenType.OpeningEnumerable, tokens.ElementAt(2).TokenType);
Assert.AreEqual(TokenType.ClosingEnumerable, tokens.ElementAt(6).TokenType);
}
[TestMethod]
public void ShouldCreateTokensForExcelAddressCorrectly()
{
var input = "Text(A1)";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(TokenType.ExcelAddress, tokens.ElementAt(2).TokenType);
}
[TestMethod]
public void ShouldCreateTokenForPercentAfterDecimal()
{
var input = "1,23%";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(TokenType.Percent, tokens.Last().TokenType);
}
[TestMethod]
public void ShouldIgnoreTwoSubsequentStringIdentifyers()
{
var input = "\"hello\"\"world\"";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(3, tokens.Count());
Assert.AreEqual("hello\"world", tokens.ElementAt(1).Value);
}
[TestMethod]
public void ShouldIgnoreTwoSubsequentStringIdentifyers2()
{
//using (var pck = new ExcelPackage(new FileInfo("c:\\temp\\QuoteIssue2.xlsx")))
//{
// pck.Workbook.Worksheets.First().Calculate();
//}
var input = "\"\"\"\"\"\"";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(TokenType.StringContent, tokens.ElementAt(1).TokenType);
}
[TestMethod]
public void TokenizerShouldIgnoreOperatorInString()
{
var input = "\"*\"";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(TokenType.StringContent, tokens.ElementAt(1).TokenType);
}
[TestMethod]
public void TokenizerShouldHandleWorksheetNameWithMinus()
{
var input = "'A-B'!A1";
var tokens = _tokenizer.Tokenize(input);
Assert.AreEqual(1, tokens.Count());
}
[TestMethod]
public void TestBug9_12_14()
{
//(( W60 -(- W63 )-( W29 + W30 + W31 ))/( W23 + W28 + W42 - W51 )* W4 )
using (var pck = new ExcelPackage())
{
var ws1 = pck.Workbook.Worksheets.Add("test");
for (var x = 1; x <= 10; x++)
{
ws1.Cells[x, 1].Value = x;
}
ws1.Cells["A11"].Formula = "(( A1 -(- A2 )-( A3 + A4 + A5 ))/( A6 + A7 + A8 - A9 )* A5 )";
//ws1.Cells["A11"].Formula = "(-A2 + 1 )";
ws1.Calculate();
var result = ws1.Cells["A11"].Value;
Assert.AreEqual(-3.75, result);
}
}
}
}