|  | using System; | 
|  | using System.Text; | 
|  | using System.Collections.Generic; | 
|  | using System.Linq; | 
|  | using Microsoft.VisualStudio.TestTools.UnitTesting; | 
|  | using OfficeOpenXml.FormulaParsing; | 
|  | using Rhino.Mocks; | 
|  | using OfficeOpenXml; | 
|  |  | 
|  | namespace EPPlusTest.FormulaParsing.IntegrationTests.BuiltInFunctions | 
|  | { | 
|  | [TestClass] | 
|  | public class MathFunctionsTests : FormulaParserTestBase | 
|  | { | 
|  | [TestInitialize] | 
|  | public void Setup() | 
|  | { | 
|  | var excelDataProvider = MockRepository.GenerateStub<ExcelDataProvider>(); | 
|  | _parser = new FormulaParser(excelDataProvider); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void PowerShouldReturnCorrectResult() | 
|  | { | 
|  | var result = _parser.Parse("Power(3, 3)"); | 
|  | Assert.AreEqual(27d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SqrtShouldReturnCorrectResult() | 
|  | { | 
|  | var result = _parser.Parse("sqrt(9)"); | 
|  | Assert.AreEqual(3d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void PiShouldReturnCorrectResult() | 
|  | { | 
|  | var expectedValue = (double)Math.Round(Math.PI, 14); | 
|  | var result = _parser.Parse("Pi()"); | 
|  | Assert.AreEqual(expectedValue, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CeilingShouldReturnCorrectResult() | 
|  | { | 
|  | var expectedValue = 22.4d; | 
|  | var result = _parser.Parse("ceiling(22.35, 0.1)"); | 
|  | Assert.AreEqual(expectedValue, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void FloorShouldReturnCorrectResult() | 
|  | { | 
|  | var expectedValue = 22.3d; | 
|  | var result = _parser.Parse("Floor(22.35, 0.1)"); | 
|  | Assert.AreEqual(expectedValue, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SumShouldReturnCorrectResultWithInts() | 
|  | { | 
|  | var result = _parser.Parse("sum(1, 2)"); | 
|  | Assert.AreEqual(3d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SumShouldReturnCorrectResultWithDecimals() | 
|  | { | 
|  | var result = _parser.Parse("sum(1,2.5)"); | 
|  | Assert.AreEqual(3.5d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SumShouldReturnCorrectResultWithEnumerable() | 
|  | { | 
|  | var result = _parser.Parse("sum({1;2;3;-1}, 2.5)"); | 
|  | Assert.AreEqual(7.5d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SumsqShouldReturnCorrectResultWithEnumerable() | 
|  | { | 
|  | var result = _parser.Parse("sumsq({2;3})"); | 
|  | Assert.AreEqual(13d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SumIfShouldReturnCorrectResult() | 
|  | { | 
|  | var result = _parser.Parse("sumIf({1;2;3;2}, 2)"); | 
|  | Assert.AreEqual(4d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SubtotalShouldNegateExpression() | 
|  | { | 
|  | var result = _parser.Parse("-subtotal(2;{1;2})"); | 
|  | Assert.AreEqual(-2d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void StdevShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("stdev(1;2;3;4)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void StdevPShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("stdevp(2,3,4)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void ExpShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("exp(4)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void MaxShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Max(4, 5)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void MaxaShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Maxa(4, 5)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void MinShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("min(4, 5)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void MinaShouldCalculateStringAs0() | 
|  | { | 
|  | using (var pck = new ExcelPackage()) | 
|  | { | 
|  | var sheet = pck.Workbook.Worksheets.Add("test"); | 
|  | sheet.Cells["A1"].Value = 1; | 
|  | sheet.Cells["B2"].Value = "a"; | 
|  | sheet.Cells["A5"].Formula = "MINA(A1:B4)"; | 
|  | sheet.Calculate(); | 
|  | Assert.AreEqual(0d, sheet.Cells["A5"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AverageShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Average(2, 2, 2)"); | 
|  | Assert.AreEqual(2d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AverageShouldReturnDiv0IfEmptyCell() | 
|  | { | 
|  | using(var pck = new ExcelPackage()) | 
|  | { | 
|  | var ws = pck.Workbook.Worksheets.Add("test"); | 
|  | ws.Cells["A2"].Formula = "AVERAGE(A1)"; | 
|  | ws.Calculate(); | 
|  | Assert.AreEqual("#DIV/0!", ws.Cells["A2"].Value.ToString()); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void RoundShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Round(2.2, 0)"); | 
|  | Assert.AreEqual(2d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void RounddownShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Rounddown(2.99, 1)"); | 
|  | Assert.AreEqual(2.9d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void RoundupShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Roundup(2.99, 1)"); | 
|  | Assert.AreEqual(3d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SqrtPiShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("SqrtPi(2.2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void IntShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Int(2.9)"); | 
|  | Assert.AreEqual(2, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void RandShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Rand()"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void RandBetweenShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("RandBetween(1,2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CountShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Count(1,2,2,\"4\")"); | 
|  | Assert.AreEqual(4d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CountAShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("CountA(1,2,2,\"\", \"a\")"); | 
|  | Assert.AreEqual(4d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CountIfShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("CountIf({1;2;2;\"\"}, \"2\")"); | 
|  | Assert.AreEqual(2d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void VarShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Var(1,2,3)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void VarPShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("VarP(1,2,3)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void ModShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Mod(5,2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SubtotalShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Subtotal(1, 10, 20)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void TruncShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Trunc(1.2345)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void ProductShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Product(1,2,3)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CosShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Cos(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CoshShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Cosh(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SinShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Sin(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void SinhShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Sinh(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void TanShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Tan(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AtanShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Atan(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void Atan2ShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Atan2(2,1)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void TanhShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Tanh(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void LogShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Log(2, 2)"); | 
|  | Assert.AreEqual(1d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void Log10ShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Log10(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void LnShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Ln(2)"); | 
|  | Assert.IsInstanceOfType(result, typeof(double)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void FactShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Fact(0)"); | 
|  | Assert.AreEqual(1d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void QuotientShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Quotient(5;2)"); | 
|  | Assert.AreEqual(2, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void MedianShouldReturnAResult() | 
|  | { | 
|  | var result = _parser.Parse("Median(1;2;3)"); | 
|  | Assert.AreEqual(2d, result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CountBlankShouldCalculateEmptyCells() | 
|  | { | 
|  | using (var pck = new ExcelPackage()) | 
|  | { | 
|  | var sheet = pck.Workbook.Worksheets.Add("test"); | 
|  | sheet.Cells["A1"].Value = 1; | 
|  | sheet.Cells["B2"].Value = string.Empty; | 
|  | sheet.Cells["A5"].Formula = "COUNTBLANK(A1:B4)"; | 
|  | sheet.Calculate(); | 
|  | Assert.AreEqual(7, sheet.Cells["A5"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void DegreesShouldReturnCorrectResult() | 
|  | { | 
|  | var result = _parser.Parse("DEGREES(0.5)"); | 
|  | var rounded = Math.Round((double)result, 3); | 
|  | Assert.AreEqual(28.648, rounded); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AverateIfsShouldCaluclateResult() | 
|  | { | 
|  | using (var pck = new ExcelPackage()) | 
|  | { | 
|  | var sheet = pck.Workbook.Worksheets.Add("test"); | 
|  | sheet.Cells["F4"].Value = 1; | 
|  | sheet.Cells["F5"].Value = 2; | 
|  | sheet.Cells["F6"].Formula = "2 + 2"; | 
|  | sheet.Cells["F7"].Value = 4; | 
|  | sheet.Cells["F8"].Value = 5; | 
|  |  | 
|  | sheet.Cells["H4"].Value = 3; | 
|  | sheet.Cells["H5"].Value = 3; | 
|  | sheet.Cells["H6"].Formula = "2 + 2"; | 
|  | sheet.Cells["H7"].Value = 4; | 
|  | sheet.Cells["H8"].Value = 5; | 
|  |  | 
|  | sheet.Cells["I4"].Value = 2; | 
|  | sheet.Cells["I5"].Value = 3; | 
|  | sheet.Cells["I6"].Formula = "2 + 2"; | 
|  | sheet.Cells["I7"].Value = 5; | 
|  | sheet.Cells["I8"].Value = 1; | 
|  |  | 
|  | sheet.Cells["H9"].Formula = "AVERAGEIFS(F4:F8;H4:H8;\">3\";I4:I8;\"<5\")"; | 
|  | sheet.Calculate(); | 
|  | Assert.AreEqual(4.5d, sheet.Cells["H9"].Value); | 
|  | } | 
|  | } | 
|  | } | 
|  | } |