blob: 6c1e64cfffc3aa2cb6aa0b1c9925ccb639ad2182 [file] [log] [blame]
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using Rhino.Mocks;
using EPPlusTest.FormulaParsing.TestHelpers;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Exceptions;
using OfficeOpenXml.FormulaParsing.ExcelUtilities;
using OfficeOpenXml.FormulaParsing.Excel.Functions;
using AddressFunction = OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup.Address;
namespace EPPlusTest.Excel.Functions
{
[TestClass]
public class RefAndLookupTests
{
const string WorksheetName = null;
[TestMethod]
public void LookupArgumentsShouldSetSearchedValue()
{
var args = FunctionsHelper.CreateArgs(1, "A:B", 2);
var lookupArgs = new LookupArguments(args);
Assert.AreEqual(1, lookupArgs.SearchedValue);
}
[TestMethod]
public void LookupArgumentsShouldSetRangeAddress()
{
var args = FunctionsHelper.CreateArgs(1, "A:B", 2);
var lookupArgs = new LookupArguments(args);
Assert.AreEqual("A:B", lookupArgs.RangeAddress);
}
[TestMethod]
public void LookupArgumentsShouldSetColIndex()
{
var args = FunctionsHelper.CreateArgs(1, "A:B", 2);
var lookupArgs = new LookupArguments(args);
Assert.AreEqual(2, lookupArgs.LookupIndex);
}
[TestMethod]
public void LookupArgumentsShouldSetRangeLookupToTrueAsDefaultValue()
{
var args = FunctionsHelper.CreateArgs(1, "A:B", 2);
var lookupArgs = new LookupArguments(args);
Assert.IsTrue(lookupArgs.RangeLookup);
}
[TestMethod]
public void LookupArgumentsShouldSetRangeLookupToTrueWhenTrueIsSupplied()
{
var args = FunctionsHelper.CreateArgs(1, "A:B", 2, true);
var lookupArgs = new LookupArguments(args);
Assert.IsTrue(lookupArgs.RangeLookup);
}
[TestMethod]
public void VLookupShouldReturnResultFromMatchingRow()
{
var func = new VLookup();
var args = FunctionsHelper.CreateArgs(2, "A1:B2", 2);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return(2);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 2)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(5, result.Result);
}
[TestMethod]
public void VLookupShouldReturnClosestValueBelowWhenRangeLookupIsTrue()
{
var func = new VLookup();
var args = FunctionsHelper.CreateArgs(4, "A1:B2", 2, true);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return(5);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 2)).Return(4);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(1, result.Result);
}
[TestMethod]
public void VLookupShouldReturnClosestStringValueBelowWhenRangeLookupIsTrue()
{
var func = new VLookup();
var args = FunctionsHelper.CreateArgs("B", "A1:B2", 2, true);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
//provider.Stub(x => x.GetCellValue(WorksheetName,0, 0)).Return(new ExcelCell("A", null, 0, 0));
//provider.Stub(x => x.GetCellValue(WorksheetName,0, 1)).Return(new ExcelCell(1, null, 0, 0));
//provider.Stub(x => x.GetCellValue(WorksheetName,1, 0)).Return(new ExcelCell("C", null, 0, 0));
//provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(new ExcelCell(4, null, 0, 0));
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 1)).Return("A");
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 2)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 1)).Return("C");
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 2)).Return(4);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(1, result.Result);
}
[TestMethod]
public void HLookupShouldReturnResultFromMatchingRow()
{
var func = new HLookup();
var args = FunctionsHelper.CreateArgs(2, "A1:B2", 2);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
//provider.Stub(x => x.GetCellValue(WorksheetName,0, 0)).Return(new ExcelCell(3, null, 0, 0));
//provider.Stub(x => x.GetCellValue(WorksheetName,0, 1)).Return(new ExcelCell(1, null, 0, 0));
//provider.Stub(x => x.GetCellValue(WorksheetName,1, 0)).Return(new ExcelCell(2, null, 0, 0));
//provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(new ExcelCell(5, null, 0, 0));
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 2)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 1)).Return(2);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 2)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(5, result.Result);
}
[TestMethod]
public void HLookupShouldReturnNaErrorIfNoMatchingRecordIsFoundWhenRangeLookupIsFalse()
{
var func = new HLookup();
var args = FunctionsHelper.CreateArgs(2, "A1:B2", 2, false);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 1)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 2)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 1)).Return(2);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 2)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
var expectedResult = ExcelErrorValue.Create(eErrorType.NA);
Assert.AreEqual(expectedResult, result.Result);
}
[TestMethod, ExpectedException(typeof(ExcelErrorValueException))]
public void HLookupShouldThrowIfNoMatchingRecordIsFoundWhenRangeLookupIsTrue()
{
var func = new HLookup();
var args = FunctionsHelper.CreateArgs(1, "A1:B2", 2, true);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 1)).Return(2);
provider.Stub(x => x.GetCellValue(WorksheetName, 1, 2)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 1)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName, 2, 2)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
}
[TestMethod]
public void LookupShouldReturnResultFromMatchingRowArrayVertical()
{
var func = new Lookup();
var args = FunctionsHelper.CreateArgs(4, "A1:B3", 2);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return("A");
provider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 2)).Return("B");
provider.Stub(x => x.GetCellValue(WorksheetName,3, 1)).Return(5);
provider.Stub(x => x.GetCellValue(WorksheetName,3, 2)).Return("C");
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual("B", result.Result);
}
[TestMethod]
public void LookupShouldReturnResultFromMatchingRowArrayHorizontal()
{
var func = new Lookup();
var args = FunctionsHelper.CreateArgs(4, "A1:C2", 2);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return("A");
provider.Stub(x => x.GetCellValue(WorksheetName,2, 2)).Return("B");
provider.Stub(x => x.GetCellValue(WorksheetName,2, 3)).Return("C");
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual("B", result.Result);
}
[TestMethod]
public void LookupShouldReturnResultFromMatchingSecondArrayHorizontal()
{
var func = new Lookup();
var args = FunctionsHelper.CreateArgs(4, "A1:C1", "A3:C3");
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
provider.Stub(x => x.GetCellValue(WorksheetName,3, 1)).Return("A");
provider.Stub(x => x.GetCellValue(WorksheetName,3, 2)).Return("B");
provider.Stub(x => x.GetCellValue(WorksheetName,3, 3)).Return("C");
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual("B", result.Result);
}
[TestMethod]
public void LookupShouldReturnResultFromMatchingSecondArrayHorizontalWithOffset()
{
var func = new Lookup();
var args = FunctionsHelper.CreateArgs(4, "A1:C1", "B3:D3");
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
provider.Stub(x => x.GetCellValue(WorksheetName,3, 2)).Return("A");
provider.Stub(x => x.GetCellValue(WorksheetName,3, 3)).Return("B");
provider.Stub(x => x.GetCellValue(WorksheetName,3, 4)).Return("C");
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual("B", result.Result);
}
[TestMethod]
public void MatchShouldReturnIndexOfMatchingValHorizontal_MatchTypeExact()
{
var func = new Match();
var args = FunctionsHelper.CreateArgs(3, "A1:C1", 0);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(2, result.Result);
}
[TestMethod]
public void MatchShouldReturnIndexOfMatchingValVertical_MatchTypeExact()
{
var func = new Match();
var args = FunctionsHelper.CreateArgs(3, "A1:A3", 0);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,2, 1)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,3, 1)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(2, result.Result);
}
[TestMethod]
public void MatchShouldReturnIndexOfMatchingValHorizontal_MatchTypeClosestBelow()
{
var func = new Match();
var args = FunctionsHelper.CreateArgs(4, "A1:C1", 1);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(1);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(3);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(2, result.Result);
}
[TestMethod]
public void MatchShouldReturnIndexOfMatchingValHorizontal_MatchTypeClosestAbove()
{
var func = new Match();
var args = FunctionsHelper.CreateArgs(6, "A1:C1", -1);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(10);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(8);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(2, result.Result);
}
[TestMethod]
public void MatchShouldReturnFirstItemWhenExactMatch_MatchTypeClosestAbove()
{
var func = new Match();
var args = FunctionsHelper.CreateArgs(10, "A1:C1", -1);
var parsingContext = ParsingContext.Create();
parsingContext.Scopes.NewScope(RangeAddress.Empty);
var provider = MockRepository.GenerateStub<ExcelDataProvider>();
provider.Stub(x => x.GetCellValue(WorksheetName,1, 1)).Return(10);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 2)).Return(8);
provider.Stub(x => x.GetCellValue(WorksheetName,1, 3)).Return(5);
parsingContext.ExcelDataProvider = provider;
var result = func.Execute(args, parsingContext);
Assert.AreEqual(1, result.Result);
}
[TestMethod]
public void RowShouldReturnRowFromCurrentScopeIfNoAddressIsSupplied()
{
var func = new Row();
var parsingContext = ParsingContext.Create();
var rangeAddressFactory = new RangeAddressFactory(MockRepository.GenerateStub<ExcelDataProvider>());
parsingContext.Scopes.NewScope(rangeAddressFactory.Create("A2"));
var result = func.Execute(Enumerable.Empty<FunctionArgument>(), parsingContext);
Assert.AreEqual(2, result.Result);
}
[TestMethod]
public void RowShouldReturnRowSuppliedAddress()
{
var func = new Row();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
var result = func.Execute(FunctionsHelper.CreateArgs("A3"), parsingContext);
Assert.AreEqual(3, result.Result);
}
[TestMethod]
public void ColumnShouldReturnRowFromCurrentScopeIfNoAddressIsSupplied()
{
var func = new Column();
var parsingContext = ParsingContext.Create();
var rangeAddressFactory = new RangeAddressFactory(MockRepository.GenerateStub<ExcelDataProvider>());
parsingContext.Scopes.NewScope(rangeAddressFactory.Create("B2"));
var result = func.Execute(Enumerable.Empty<FunctionArgument>(), parsingContext);
Assert.AreEqual(2, result.Result);
}
[TestMethod]
public void ColumnShouldReturnRowSuppliedAddress()
{
var func = new Column();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
var result = func.Execute(FunctionsHelper.CreateArgs("E3"), parsingContext);
Assert.AreEqual(5, result.Result);
}
[TestMethod]
public void RowsShouldReturnNbrOfRowsSuppliedRange()
{
var func = new Rows();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
var result = func.Execute(FunctionsHelper.CreateArgs("A1:B3"), parsingContext);
Assert.AreEqual(3, result.Result);
}
[TestMethod]
public void RowsShouldReturnNbrOfRowsForEntireColumn()
{
var func = new Rows();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
var result = func.Execute(FunctionsHelper.CreateArgs("A:B"), parsingContext);
Assert.AreEqual(1048576, result.Result);
}
[TestMethod]
public void ColumnssShouldReturnNbrOfRowsSuppliedRange()
{
var func = new Columns();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
var result = func.Execute(FunctionsHelper.CreateArgs("A1:E3"), parsingContext);
Assert.AreEqual(5, result.Result);
}
[TestMethod]
public void ChooseShouldReturnItemByIndex()
{
var func = new Choose();
var parsingContext = ParsingContext.Create();
var result = func.Execute(FunctionsHelper.CreateArgs(1, "A", "B"), parsingContext);
Assert.AreEqual("A", result.Result);
}
[TestMethod]
public void AddressShouldReturnAddressByIndexWithDefaultRefType()
{
var func = new AddressFunction();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
parsingContext.ExcelDataProvider.Stub(x => x.ExcelMaxRows).Return(10);
var result = func.Execute(FunctionsHelper.CreateArgs(1, 2), parsingContext);
Assert.AreEqual("$B$1", result.Result);
}
[TestMethod]
public void AddressShouldReturnAddressByIndexWithRelativeType()
{
var func = new AddressFunction();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
parsingContext.ExcelDataProvider.Stub(x => x.ExcelMaxRows).Return(10);
var result = func.Execute(FunctionsHelper.CreateArgs(1, 2, (int)ExcelReferenceType.RelativeRowAndColumn), parsingContext);
Assert.AreEqual("B1", result.Result);
}
[TestMethod]
public void AddressShouldReturnAddressByWithSpecifiedWorksheet()
{
var func = new AddressFunction();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
parsingContext.ExcelDataProvider.Stub(x => x.ExcelMaxRows).Return(10);
var result = func.Execute(FunctionsHelper.CreateArgs(1, 2, (int)ExcelReferenceType.RelativeRowAndColumn, true, "Worksheet1"), parsingContext);
Assert.AreEqual("Worksheet1!B1", result.Result);
}
[TestMethod, ExpectedException(typeof(InvalidOperationException))]
public void AddressShouldThrowIfR1C1FormatIsSpecified()
{
var func = new AddressFunction();
var parsingContext = ParsingContext.Create();
parsingContext.ExcelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>();
parsingContext.ExcelDataProvider.Stub(x => x.ExcelMaxRows).Return(10);
var result = func.Execute(FunctionsHelper.CreateArgs(1, 2, (int)ExcelReferenceType.RelativeRowAndColumn, false), parsingContext);
}
}
}