public void SimpleMathBlockDefinition_No_Expression()
 {
     Assert.Throws <Exception>(() =>
     {
         var definition = new SimpleMathBlockDefinition("my calculator")
         {
             Expression = ""
         };
         definition.Validate();
     });
 }
 public void SimpleMathBlockDefinition_Invalid_Output()
 {
     Assert.Throws <Exception>(() =>
     {
         var definition = new SimpleMathBlockDefinition("my calculator")
         {
             Expression = "a + b"
         };
         definition.Output.AddNumeric("x");
         definition.Output.AddNumeric("y");
         definition.Validate();
     });
 }
        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 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);
            }
        }