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