| using System; | 
 | using System.IO; | 
 | using System.Text; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using Microsoft.VisualStudio.TestTools.UnitTesting; | 
 | using OfficeOpenXml; | 
 | using Rhino.Mocks; | 
 | using OfficeOpenXml.FormulaParsing; | 
 |  | 
 | namespace EPPlusTest.FormulaParsing.IntegrationTests.BuiltInFunctions | 
 | { | 
 |     [TestClass] | 
 |     public class RefAndLookupTests : FormulaParserTestBase | 
 |     { | 
 |         private ExcelDataProvider _excelDataProvider; | 
 |         const string WorksheetName = null; | 
 |         private ExcelPackage _package; | 
 |         private ExcelWorksheet _worksheet; | 
 |  | 
 |         [TestInitialize] | 
 |         public void Initialize() | 
 |         { | 
 |             _excelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>(); | 
 |             _excelDataProvider.Stub(x => x.GetDimensionEnd(Arg<string>.Is.Anything)).Return(new ExcelCellAddress(10, 1)); | 
 |             _parser = new FormulaParser(_excelDataProvider); | 
 |             _package = new ExcelPackage(); | 
 |             _worksheet = _package.Workbook.Worksheets.Add("Test"); | 
 |         } | 
 |  | 
 |         [TestCleanup] | 
 |         public void Cleanup() | 
 |         { | 
 |             _package.Dispose(); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void VLookupShouldReturnCorrespondingValue() | 
 |         { | 
 |             using(var pck = new ExcelPackage()) | 
 |             { | 
 |                 var ws = pck.Workbook.Worksheets.Add("test"); | 
 |                 var lookupAddress = "A1:B2"; | 
 |                 ws.Cells["A1"].Value = 1; | 
 |                 ws.Cells["B1"].Value = 1; | 
 |                 ws.Cells["A2"].Value = 2; | 
 |                 ws.Cells["B2"].Value = 5; | 
 |                 ws.Cells["A3"].Formula = "VLOOKUP(2, " + lookupAddress + ", 2)"; | 
 |                 ws.Calculate(); | 
 |                 var result = ws.Cells["A3"].Value; | 
 |                 Assert.AreEqual(5, result); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void VLookupShouldReturnClosestValueBelowIfLastArgIsTrue() | 
 |         { | 
 |             using (var pck = new ExcelPackage()) | 
 |             { | 
 |                 var ws = pck.Workbook.Worksheets.Add("test"); | 
 |                 var lookupAddress = "A1:B2"; | 
 |                 ws.Cells["A1"].Value = 3; | 
 |                 ws.Cells["B1"].Value = 1; | 
 |                 ws.Cells["A2"].Value = 5; | 
 |                 ws.Cells["B2"].Value = 5; | 
 |                 ws.Cells["A3"].Formula = "VLOOKUP(4, " + lookupAddress + ", 2, true)"; | 
 |                 ws.Calculate(); | 
 |                 var result = ws.Cells["A3"].Value; | 
 |                 Assert.AreEqual(1, result); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void HLookupShouldReturnCorrespondingValue() | 
 |         { | 
 |             var lookupAddress = "A1:B2"; | 
 |             _worksheet.Cells["A1"].Value = 1; | 
 |             _worksheet.Cells["B1"].Value = 2; | 
 |             _worksheet.Cells["A2"].Value = 2; | 
 |             _worksheet.Cells["B2"].Value = 5; | 
 |             _worksheet.Cells["A3"].Formula = "HLOOKUP(2, " + lookupAddress + ", 2)"; | 
 |             _worksheet.Calculate(); | 
 |             var result = _worksheet.Cells["A3"].Value; | 
 |             Assert.AreEqual(5, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void HLookupShouldReturnClosestValueBelowIfLastArgIsTrue() | 
 |         { | 
 |             var lookupAddress = "A1:B2"; | 
 |             _excelDataProvider.Stub(x => x.GetDimensionEnd(Arg<string>.Is.Anything)).Return(new ExcelCellAddress(5, 5)); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(3); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(5); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return(1); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,2, 2)).Return(2); | 
 |             var result = _parser.Parse("HLOOKUP(4, " + lookupAddress + ", 2, true)"); | 
 |             Assert.AreEqual(1, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void LookupShouldReturnMatchingValue() | 
 |         { | 
 |             var lookupAddress = "A1:B2"; | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(3); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(5); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return(4); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,2, 2)).Return(1); | 
 |             var result = _parser.Parse("LOOKUP(4, " + lookupAddress + ")"); | 
 |             Assert.AreEqual(1, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void MatchShouldReturnIndexOfMatchingValue() | 
 |         { | 
 |             var lookupAddress = "A1:A2"; | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(3); | 
 |             _excelDataProvider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(5); | 
 |             var result = _parser.Parse("MATCH(3, " + lookupAddress + ")"); | 
 |             Assert.AreEqual(1, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void RowShouldReturnRowNumber() | 
 |         { | 
 |             _excelDataProvider.Stub(x => x.GetRangeFormula("", 4, 1)).Return("Row()"); | 
 |             var result = _parser.ParseAt("A4"); | 
 |             Assert.AreEqual(4, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void RowSholdHandleReference() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("test"); | 
 |                 s1.Cells["A1"].Formula = "ROW(A4)"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(4, s1.Cells["A1"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void ColumnShouldReturnRowNumber() | 
 |         { | 
 |             //_excelDataProvider.Stub(x => x.GetRangeValues("B4")).Return(new List<ExcelCell> { new ExcelCell(null, "Column()", 0, 0) }); | 
 |             _excelDataProvider.Stub(x => x.GetRangeFormula("", 4, 2)).Return("Column()"); | 
 |             var result = _parser.ParseAt("B4"); | 
 |             Assert.AreEqual(2, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void ColumnSholdHandleReference() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("test"); | 
 |                 s1.Cells["A1"].Formula = "COLUMN(B4)"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(2, s1.Cells["A1"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void RowsShouldReturnNbrOfRows() | 
 |         { | 
 |             _excelDataProvider.Stub(x => x.GetRangeFormula("", 4, 1)).Return("Rows(A5:B7)"); | 
 |             var result = _parser.ParseAt("A4"); | 
 |             Assert.AreEqual(3, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void ColumnsShouldReturnNbrOfCols() | 
 |         { | 
 |             _excelDataProvider.Stub(x => x.GetRangeFormula("", 4, 1)).Return("Columns(A5:B7)"); | 
 |             var result = _parser.ParseAt("A4"); | 
 |             Assert.AreEqual(2, result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void ChooseShouldReturnCorrectResult() | 
 |         { | 
 |             var result = _parser.Parse("Choose(1, \"A\", \"B\")"); | 
 |             Assert.AreEqual("A", result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void AddressShouldReturnCorrectResult() | 
 |         { | 
 |             _excelDataProvider.Stub(x => x.ExcelMaxRows).Return(12345); | 
 |             var result = _parser.Parse("Address(1, 1)"); | 
 |             Assert.AreEqual("$A$1", result); | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void IndirectShouldReturnARange() | 
 |         { | 
 |             using (var package = new ExcelPackage(new MemoryStream())) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["A1:A2"].Value = 2; | 
 |                 s1.Cells["A3"].Formula = "SUM(Indirect(\"A1:A2\"))"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(4d, s1.Cells["A3"].Value); | 
 |  | 
 |                 s1.Cells["A4"].Formula = "SUM(Indirect(\"A1:A\" & \"2\"))"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(4d, s1.Cells["A4"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void OffsetShouldReturnASingleValue() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["B3"].Value = 1d; | 
 |                 s1.Cells["A5"].Formula = "OFFSET(A1, 2, 1)"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(1d, s1.Cells["A5"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void OffsetShouldReturnARange() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["B1"].Value = 1d; | 
 |                 s1.Cells["B2"].Value = 1d; | 
 |                 s1.Cells["B3"].Value = 1d; | 
 |                 s1.Cells["A5"].Formula = "SUM(OFFSET(A1:A3, 0, 1))"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(3d, s1.Cells["A5"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void OffsetDirectReferenceToMultiRangeShouldSetValueError() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["B1"].Value = 1d; | 
 |                 s1.Cells["B2"].Value = 1d; | 
 |                 s1.Cells["B3"].Value = 1d; | 
 |                 s1.Cells["A5"].Formula = "OFFSET(A1:A3, 0, 1)"; | 
 |                 s1.Calculate(); | 
 |                 var result = s1.Cells["A5"].Value; | 
 |                 Assert.AreEqual(ExcelErrorValue.Create(eErrorType.Value), result); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void OffsetShouldReturnARangeAccordingToWidth() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["B1"].Value = 1d; | 
 |                 s1.Cells["B2"].Value = 1d; | 
 |                 s1.Cells["B3"].Value = 1d; | 
 |                 s1.Cells["A5"].Formula = "SUM(OFFSET(A1:A3, 0, 1, 2))"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(2d, s1.Cells["A5"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void OffsetShouldReturnARangeAccordingToHeight() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["B1"].Value = 1d; | 
 |                 s1.Cells["B2"].Value = 1d; | 
 |                 s1.Cells["B3"].Value = 1d; | 
 |                 s1.Cells["C1"].Value = 2d; | 
 |                 s1.Cells["C2"].Value = 2d; | 
 |                 s1.Cells["C3"].Value = 2d; | 
 |                 s1.Cells["A5"].Formula = "SUM(OFFSET(A1:A3, 0, 1, 2, 2))"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(6d, s1.Cells["A5"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod] | 
 |         public void OffsetShouldCoverMultipleColumns() | 
 |         { | 
 |             using (var package = new ExcelPackage()) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.Add("Test"); | 
 |                 s1.Cells["C1"].Value = 1d; | 
 |                 s1.Cells["C2"].Value = 1d; | 
 |                 s1.Cells["C3"].Value = 1d; | 
 |                 s1.Cells["D1"].Value = 2d; | 
 |                 s1.Cells["D2"].Value = 2d; | 
 |                 s1.Cells["D3"].Value = 2d; | 
 |                 s1.Cells["A5"].Formula = "SUM(OFFSET(A1:B3, 0, 2))"; | 
 |                 s1.Calculate(); | 
 |                 Assert.AreEqual(9d, s1.Cells["A5"].Value); | 
 |             } | 
 |         } | 
 |  | 
 |         [TestMethod, Ignore] | 
 |         public void VLookupShouldHandleNames() | 
 |         { | 
 |             using (var package = new ExcelPackage(new FileInfo(@"c:\temp\Book3.xlsx"))) | 
 |             { | 
 |                 var s1 = package.Workbook.Worksheets.First(); | 
 |                 var v = s1.Cells["X10"].Formula; | 
 |                 //s1.Calculate(); | 
 |                 v = s1.Cells["X10"].Formula; | 
 |             } | 
 |         } | 
 |     } | 
 | } |