|  | using System; | 
|  | using System.Text; | 
|  | using System.Collections.Generic; | 
|  | using System.Linq; | 
|  | using Microsoft.VisualStudio.TestTools.UnitTesting; | 
|  | using OfficeOpenXml.FormulaParsing; | 
|  | using EPPlusTest.FormulaParsing.TestHelpers; | 
|  | using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; | 
|  | using OfficeOpenXml; | 
|  |  | 
|  | namespace EPPlusTest.Excel.Functions | 
|  | { | 
|  | [TestClass] | 
|  | public class LogicalFunctionsTests | 
|  | { | 
|  | private ParsingContext _parsingContext = ParsingContext.Create(); | 
|  |  | 
|  | [TestMethod] | 
|  | public void IfShouldReturnCorrectResult() | 
|  | { | 
|  | var func = new If(); | 
|  | var args = FunctionsHelper.CreateArgs(true, "A", "B"); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.AreEqual("A", result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void NotShouldReturnFalseIfArgumentIsTrue() | 
|  | { | 
|  | var func = new Not(); | 
|  | var args = FunctionsHelper.CreateArgs(true); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsFalse((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void NotShouldReturnTrueIfArgumentIs0() | 
|  | { | 
|  | var func = new Not(); | 
|  | var args = FunctionsHelper.CreateArgs(0); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsTrue((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void NotShouldReturnFalseIfArgumentIs1() | 
|  | { | 
|  | var func = new Not(); | 
|  | var args = FunctionsHelper.CreateArgs(1); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsFalse((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void NotShouldHandleExcelReference() | 
|  | { | 
|  | using(var package = new ExcelPackage()) | 
|  | { | 
|  | var sheet = package.Workbook.Worksheets.Add("sheet1"); | 
|  | sheet.Cells["A1"].Value = false; | 
|  | sheet.Cells["A2"].Formula = "NOT(A1)"; | 
|  | sheet.Calculate(); | 
|  | Assert.IsTrue((bool)sheet.Cells["A2"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AndShouldReturnTrueIfAllArgumentsAreTrue() | 
|  | { | 
|  | var func = new And(); | 
|  | var args = FunctionsHelper.CreateArgs(true, true, true); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsTrue((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AndShouldReturnTrueIfAllArgumentsAreTrueOr1() | 
|  | { | 
|  | var func = new And(); | 
|  | var args = FunctionsHelper.CreateArgs(true, true, 1, true, 1); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsTrue((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AndShouldReturnFalseIfOneArgumentIsFalse() | 
|  | { | 
|  | var func = new And(); | 
|  | var args = FunctionsHelper.CreateArgs(true, false, true); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsFalse((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void AndShouldReturnFalseIfOneArgumentIs0() | 
|  | { | 
|  | var func = new And(); | 
|  | var args = FunctionsHelper.CreateArgs(true, 0, true); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsFalse((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void OrShouldReturnTrueIfOneArgumentIsTrue() | 
|  | { | 
|  | var func = new Or(); | 
|  | var args = FunctionsHelper.CreateArgs(true, false, false); | 
|  | var result = func.Execute(args, _parsingContext); | 
|  | Assert.IsTrue((bool)result.Result); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void IfErrorShouldReturnSecondArgIfCriteriaEvaluatesAsAnError() | 
|  | { | 
|  | using (var package = new ExcelPackage()) | 
|  | { | 
|  | var s1 = package.Workbook.Worksheets.Add("test"); | 
|  | s1.Cells["A1"].Formula = "IFERROR(0/0, \"hello\")"; | 
|  | s1.Calculate(); | 
|  | Assert.AreEqual("hello", s1.Cells["A1"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void IfErrorShouldReturnSecondArgIfCriteriaEvaluatesAsAnError2() | 
|  | { | 
|  | using (var package = new ExcelPackage()) | 
|  | { | 
|  | var s1 = package.Workbook.Worksheets.Add("test"); | 
|  | s1.Cells["A1"].Formula = "IFERROR(A2, \"hello\")"; | 
|  | s1.Cells["A2"].Formula = "23/0"; | 
|  | s1.Calculate(); | 
|  | Assert.AreEqual("hello", s1.Cells["A1"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void IfErrorShouldReturnResultOfFormulaIfNoError() | 
|  | { | 
|  | using (var package = new ExcelPackage()) | 
|  | { | 
|  | var s1 = package.Workbook.Worksheets.Add("test"); | 
|  | s1.Cells["A1"].Formula = "IFERROR(A2, \"hello\")"; | 
|  | s1.Cells["A2"].Value = "hi there"; | 
|  | s1.Calculate(); | 
|  | Assert.AreEqual("hi there", s1.Cells["A1"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void IfNaShouldReturnSecondArgIfCriteriaEvaluatesAsAnError2() | 
|  | { | 
|  | using (var package = new ExcelPackage()) | 
|  | { | 
|  | var s1 = package.Workbook.Worksheets.Add("test"); | 
|  | s1.Cells["A1"].Formula = "IFERROR(A2, \"hello\")"; | 
|  | s1.Cells["A2"].Value = ExcelErrorValue.Create(eErrorType.NA); | 
|  | s1.Calculate(); | 
|  | Assert.AreEqual("hello", s1.Cells["A1"].Value); | 
|  | } | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void IfNaShouldReturnResultOfFormulaIfNoError() | 
|  | { | 
|  | using (var package = new ExcelPackage()) | 
|  | { | 
|  | var s1 = package.Workbook.Worksheets.Add("test"); | 
|  | s1.Cells["A1"].Formula = "IFNA(A2, \"hello\")"; | 
|  | s1.Cells["A2"].Value = "hi there"; | 
|  | s1.Calculate(); | 
|  | Assert.AreEqual("hi there", s1.Cells["A1"].Value); | 
|  | } | 
|  | } | 
|  | } | 
|  | } |