|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using System.Linq; | 
|  | using System.Text; | 
|  | using System.Threading.Tasks; | 
|  | using Microsoft.VisualStudio.TestTools.UnitTesting; | 
|  | using OfficeOpenXml.FormulaParsing; | 
|  | using OfficeOpenXml.FormulaParsing.Excel.Functions; | 
|  | using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; | 
|  | using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; | 
|  | using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; | 
|  | using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; | 
|  | using OfficeOpenXml.FormulaParsing.ExpressionGraph; | 
|  | using OfficeOpenXml.FormulaParsing.ExpressionGraph.FunctionCompilers; | 
|  |  | 
|  | namespace EPPlusTest.FormulaParsing.ExpressionGraph.FunctionCompilers | 
|  | { | 
|  | [TestClass] | 
|  | public class FunctionCompilerFactoryTests | 
|  | { | 
|  | #region Create Tests | 
|  | [TestMethod] | 
|  | public void CreateHandlesStandardFunctionCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new Sum(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(DefaultCompiler)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CreateHandlesSpecialIfCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new If(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(IfFunctionCompiler)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CreateHandlesSpecialIfErrorCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new IfError(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(IfErrorFunctionCompiler)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CreateHandlesSpecialIfNaCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new IfNa(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(IfNaFunctionCompiler)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CreateHandlesLookupFunctionCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new Column(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(LookupFunctionCompiler)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CreateHandlesErrorFunctionCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new IsError(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(ErrorHandlingFunctionCompiler)); | 
|  | } | 
|  |  | 
|  | [TestMethod] | 
|  | public void CreateHandlesCustomFunctionCompiler() | 
|  | { | 
|  | var functionRepository = FunctionRepository.Create(); | 
|  | functionRepository.LoadModule(new TestFunctionModule()); | 
|  | var functionCompilerFactory = new FunctionCompilerFactory(functionRepository); | 
|  | var function = new MyFunction(); | 
|  | var functionCompiler = functionCompilerFactory.Create(function); | 
|  | Assert.IsInstanceOfType(functionCompiler, typeof(MyFunctionCompiler)); | 
|  | } | 
|  | #endregion | 
|  |  | 
|  | #region Nested Classes | 
|  | public class TestFunctionModule : FunctionsModule | 
|  | { | 
|  | public TestFunctionModule() | 
|  | { | 
|  | var myFunction = new MyFunction(); | 
|  | var customCompiler = new MyFunctionCompiler(myFunction); | 
|  | base.Functions.Add(MyFunction.Name, myFunction); | 
|  | base.CustomCompilers.Add(typeof(MyFunction), customCompiler); | 
|  | } | 
|  | } | 
|  |  | 
|  | public class MyFunction : ExcelFunction | 
|  | { | 
|  | public const string Name = "MyFunction"; | 
|  | public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context) | 
|  | { | 
|  | throw new NotImplementedException(); | 
|  | } | 
|  | } | 
|  |  | 
|  | public class MyFunctionCompiler : FunctionCompiler | 
|  | { | 
|  | public MyFunctionCompiler(MyFunction function) : base(function) { } | 
|  | public override CompileResult Compile(IEnumerable<Expression> children, ParsingContext context) | 
|  | { | 
|  | throw new NotImplementedException(); | 
|  | } | 
|  | } | 
|  | #endregion | 
|  | } | 
|  | } |