blob: 800bac16829cd35614503deea16698c6c5fa0bb0 [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 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;
}
}
}
}