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