public void Calculate_Formula_In_Excel() { using (var ms = new MemoryStream()) { GetType().Assembly.GetManifestResourceStream("EngineX.ExcelBlockDefinitionTests_Formula.xlsx") .CopyTo(ms); var blockDefinition = new ExcelBlockDefinition("my excel"); blockDefinition.ExcelWorkbook = ms.ToArray(); blockDefinition.CellMappings["A1"] = ParameterName.For("input1"); blockDefinition.CellMappings["A2"] = ParameterName.For("input2"); blockDefinition.CellMappings["B3"] = ParameterName.For("output1"); blockDefinition.Input.AddNumeric("input1"); blockDefinition.Input.AddNumeric("input2"); blockDefinition.Output.AddNumeric("output1"); using (var calc = new Calculation(blockDefinition)) { calc.Set(new Parameter(ParameterName.For("input1"), 10)); calc.Set(new Parameter(ParameterName.For("input2"), 20)); var actual = calc.Get(ParameterName.For("output1")); Assert.Equal(30, (int)actual.Value); } } }
protected override void InnerExecute(Calculation calculation) { var expr = new Expression(Expression); expr.EvaluateParameter += ((name, args) => { args.Result = calculation.State.Get(ParameterName.For(name))?.Value.ValueForCalculation; args.HasResult = args.Result != null; }); var resultValue = expr.Evaluate(); calculation.State.Set(new Parameter(Output.First().Name, new ParameterValue(resultValue))); }
public void RunTests() { var block = new SimpleMathBlockDefinition("some math"); block.Expression = "a * b"; block.Input.AddNumeric("a"); block.Input.AddNumeric("b"); block.Output.AddNumeric("c"); block.UnitTests.Add(new UnitTestDefinition() { Description = "fails", Input = new List <Parameter>() { new(ParameterName.For("a"), 10), new(ParameterName.For("b"), 20) },
public void Runs_In_Composite() { var constants = new ConstantsBlockDefinition("constants"); constants.Output.AddNumeric("aConstant"); constants.Output.AddNumeric("bConstant"); constants.Constants.Add(new Parameter(ParameterName.For("aConstant"), 10)); constants.Constants.Add(new Parameter(ParameterName.For("bConstant"), 20)); var simpleMath = new SimpleMathBlockDefinition("calc"); simpleMath.Expression = "a + b"; simpleMath.Input.AddNumeric("a"); simpleMath.Input.AddNumeric("b"); simpleMath.Output.AddNumeric("c"); var composite = new CompositeBlockDefinition("composite"); composite.Blocks.Add(constants); composite.Blocks.Add(simpleMath); composite.Output.AddNumeric("result"); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(constants, ParameterName.For("aConstant")), To = new ParameterWire.Endpoint(simpleMath, ParameterName.For("a")) }); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(constants, ParameterName.For("bConstant")), To = new ParameterWire.Endpoint(simpleMath, ParameterName.For("b")) }); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(simpleMath, ParameterName.For("c")), To = new ParameterWire.Endpoint(composite, ParameterName.For("result")) }); var calc = new Calculation(composite); var actual = calc.Get(ParameterName.For("result")).Value; Assert.Equal(30, (int)actual); }
public void SimpleMathBlockDefinition_Correct() { var definition = new SimpleMathBlockDefinition("my calculator") { Expression = "a + b" }; definition.Input.AddNumeric("a"); definition.Input.AddNumeric("b"); definition.Output.AddNumeric("c"); definition.Validate(); var instance = new Calculation(definition); instance.Set(new Parameter(ParameterName.For("a"), 10)); instance.Set(new Parameter(ParameterName.For("b"), 20)); Assert.Equal(30, (int)instance.Get(ParameterName.For("c")).Value); }
public static void AddText(this List <ParameterDefinition> list, string name) { list.Add(new ParameterDefinition(ParameterName.For(name), new TextParameterType())); }
public static ParameterName AddNumeric(this List <ParameterDefinition> list, string name) { list.Add(new ParameterDefinition(ParameterName.For(name), new NumericParameterType())); return(ParameterName.For(name)); }
public void Two_SimpleMathBlocks_Sequential_Correct() { var firstBlock = new SimpleMathBlockDefinition("first") { Expression = "a + b" }; firstBlock.Input.AddNumeric("a"); firstBlock.Input.AddNumeric("b"); firstBlock.Output.AddNumeric("c"); var secondBlock = new SimpleMathBlockDefinition("second") { Expression = "c * c" }; secondBlock.Input.AddNumeric("a"); secondBlock.Input.AddNumeric("c"); secondBlock.Output.AddNumeric("r"); var composite = new CompositeBlockDefinition("Composite"); composite.Blocks.Add(firstBlock); composite.Blocks.Add(secondBlock); composite.Input.AddNumeric("input1"); composite.Output.AddNumeric("result"); composite.Validate(); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(secondBlock, ParameterName.For("r")), To = new ParameterWire.Endpoint(composite, ParameterName.For("result")) }); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(composite, ParameterName.For("input1")), To = new ParameterWire.Endpoint(firstBlock, ParameterName.For("a")) }); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(composite, ParameterName.For("input1")), To = new ParameterWire.Endpoint(firstBlock, ParameterName.For("b")) }); composite.Wires.Add(new ParameterWire() { From = new ParameterWire.Endpoint(firstBlock, ParameterName.For("c")), To = new ParameterWire.Endpoint(secondBlock, ParameterName.For("c")) }); composite.Validate(); // Sequential composite.ExecutionOrder = ExecutionOrder.Sequential; using (var calculation = new Calculation(composite)) { calculation.Set(new Parameter(ParameterName.For("input1"), 5)); Assert.False(calculation.IsCalculated); var actual = calculation.Get(ParameterName.For("result")).Value; Assert.Equal(100, (int)actual); Assert.True(calculation.IsCalculated); } }