| using System; | |
| using Microsoft.VisualStudio.TestTools.UnitTesting; | |
| using OfficeOpenXml; | |
| using OfficeOpenXml.FormulaParsing; | |
| using OfficeOpenXml.FormulaParsing.Excel.Functions; | |
| using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; | |
| using OfficeOpenXml.FormulaParsing.Exceptions; | |
| namespace EPPlusTest.FormulaParsing.Excel.Functions.Math | |
| { | |
| [TestClass] | |
| public class AverageTests | |
| { | |
| [TestMethod] | |
| public void AverageLiterals() | |
| { | |
| // In the case of literals, Average DOES parse and include numeric strings, date strings, bools, etc. | |
| Average average = new Average(); | |
| var date1 = new DateTime(2013, 1, 5); | |
| var date2 = new DateTime(2013, 1, 15); | |
| double value1 = 1000; | |
| double value2 = 2000; | |
| double value3 = 6000; | |
| double value4 = 1; | |
| double value5 = date1.ToOADate(); | |
| double value6 = date2.ToOADate(); | |
| var result = average.Execute(new FunctionArgument[] | |
| { | |
| new FunctionArgument(value1.ToString("n")), | |
| new FunctionArgument(value2), | |
| new FunctionArgument(value3.ToString("n")), | |
| new FunctionArgument(true), | |
| new FunctionArgument(date1), | |
| new FunctionArgument(date2.ToString("d")) | |
| }, ParsingContext.Create()); | |
| Assert.AreEqual((value1 + value2 + value3 + value4 + value5 + value6) / 6, result.Result); | |
| } | |
| [TestMethod] | |
| public void AverageCellReferences() | |
| { | |
| // In the case of cell references, Average DOES NOT parse and include numeric strings, date strings, bools, unparsable strings, etc. | |
| ExcelPackage package = new ExcelPackage(); | |
| var worksheet = package.Workbook.Worksheets.Add("Test"); | |
| ExcelRange range1 = worksheet.Cells[1, 1]; | |
| range1.Formula = "\"1000\""; | |
| range1.Calculate(); | |
| var range2 = worksheet.Cells[1, 2]; | |
| range2.Value = 2000; | |
| var range3 = worksheet.Cells[1, 3]; | |
| range3.Formula = $"\"{new DateTime(2013, 1, 5).ToString("d")}\""; | |
| range3.Calculate(); | |
| var range4 = worksheet.Cells[1, 4]; | |
| range4.Value = true; | |
| var range5 = worksheet.Cells[1, 5]; | |
| range5.Value = new DateTime(2013, 1, 5); | |
| var range6 = worksheet.Cells[1, 6]; | |
| range6.Value = "Test"; | |
| Average average = new Average(); | |
| var rangeInfo1 = new EpplusExcelDataProvider.RangeInfo(worksheet, 1, 1, 1, 3); | |
| var rangeInfo2 = new EpplusExcelDataProvider.RangeInfo(worksheet, 1, 4, 1, 4); | |
| var rangeInfo3 = new EpplusExcelDataProvider.RangeInfo(worksheet, 1, 5, 1, 6); | |
| var context = ParsingContext.Create(); | |
| var address = new OfficeOpenXml.FormulaParsing.ExcelUtilities.RangeAddress(); | |
| address.FromRow = address.ToRow = address.FromCol = address.ToCol = 2; | |
| context.Scopes.NewScope(address); | |
| var result = average.Execute(new FunctionArgument[] | |
| { | |
| new FunctionArgument(rangeInfo1), | |
| new FunctionArgument(rangeInfo2), | |
| new FunctionArgument(rangeInfo3) | |
| }, context); | |
| Assert.AreEqual((2000 + new DateTime(2013, 1, 5).ToOADate()) / 2, result.Result); | |
| } | |
| [TestMethod] | |
| public void AverageArray() | |
| { | |
| // In the case of arrays, Average DOES NOT parse and include numeric strings, date strings, bools, unparsable strings, etc. | |
| Average average = new Average(); | |
| var date1 = new DateTime(2013, 1, 5); | |
| var date2 = new DateTime(2013, 1, 15); | |
| double value = 2000; | |
| var result = average.Execute(new FunctionArgument[] | |
| { | |
| new FunctionArgument(new FunctionArgument[] | |
| { | |
| new FunctionArgument(1000.ToString("n")), | |
| new FunctionArgument(value), | |
| new FunctionArgument(6000.ToString("n")), | |
| new FunctionArgument(true), | |
| new FunctionArgument(date1), | |
| new FunctionArgument(date2.ToString("d")), | |
| new FunctionArgument("test") | |
| }) | |
| }, ParsingContext.Create()); | |
| Assert.AreEqual((2000 + date1.ToOADate()) / 2, result.Result); | |
| } | |
| [TestMethod] | |
| [ExpectedException(typeof(ExcelErrorValueException))] | |
| public void AverageUnparsableLiteral() | |
| { | |
| // In the case of literals, any unparsable string literal results in a #VALUE. | |
| Average average = new Average(); | |
| var result = average.Execute(new FunctionArgument[] | |
| { | |
| new FunctionArgument(1000), | |
| new FunctionArgument("Test") | |
| }, ParsingContext.Create()); | |
| } | |
| } | |
| } |