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)));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 6
0
 public static void AddText(this List <ParameterDefinition> list, string name)
 {
     list.Add(new ParameterDefinition(ParameterName.For(name), new TextParameterType()));
 }
Esempio n. 7
0
 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);
            }
        }