Esempio n. 1
0
        public void PanickingMethodCallWithTwoOutputsThatDoesNotPanicIntoAdd_Execute_CorrectValue()
        {
            using (FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.ParametersAndCalls))
            {
                string calleeName = "callee";
                NIType calleeType = DefineFunctionTypeWithTwoIntOuts(calleeName);
                CompilableDefinitionName calleeDefinitionName = CreateTestCompilableDefinitionName(calleeName);
                DfirRoot       calleeFunction      = calleeType.CreateFunctionFromSignature(calleeDefinitionName);
                DataAccessor   outputDataAccessor0 = DataAccessor.Create(calleeFunction.BlockDiagram, calleeFunction.DataItems[0], Direction.Input);
                DataAccessor   outputDataAccessor1 = DataAccessor.Create(calleeFunction.BlockDiagram, calleeFunction.DataItems[1], Direction.Input);
                FunctionalNode unwrap = new FunctionalNode(calleeFunction.BlockDiagram, Signatures.UnwrapOptionType);
                ConnectSomeOfIntegerToInputTerminal(unwrap.InputTerminals[0], 1);
                Wire.Create(calleeFunction.BlockDiagram, unwrap.OutputTerminals[0], outputDataAccessor0.Terminal, outputDataAccessor1.Terminal);
                DfirRoot       callerFunction = DfirRoot.Create();
                var            methodCall     = new MethodCallNode(callerFunction.BlockDiagram, calleeDefinitionName, calleeType);
                FunctionalNode add            = new FunctionalNode(callerFunction.BlockDiagram, Signatures.DefinePureBinaryFunction("Add", NITypes.Int32, NITypes.Int32));
                Wire.Create(callerFunction.BlockDiagram, methodCall.OutputTerminals[0], add.InputTerminals[0]);
                Wire.Create(callerFunction.BlockDiagram, methodCall.OutputTerminals[1], add.InputTerminals[1]);
                FunctionalNode inspect = ConnectInspectToOutputTerminal(add.OutputTerminals[2]);

                TestExecutionInstance executionInstance = CompileAndExecuteFunction(callerFunction, calleeFunction);

                byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(inspect);
                AssertByteArrayIsInt32(inspectValue, 2);
            }
        }
 public bool VisitFunctionalNode(FunctionalNode functionalNode)
 {
     functionalNode.InputTerminals.ForEach(ValidateRequiredInputTerminal);
     // TODO: for functions with more than one data type parameter, it would be better
     // to report TypeNotDetermined on an output only if all inputs that use the same
     // type parameter(s) are connected.
     if (functionalNode.InputTerminals.All(terminal => terminal.IsConnected))
     {
         Signature signature = Signatures.GetSignatureForNIType(functionalNode.Signature);
         foreach (var outputTerminalPair in functionalNode.OutputTerminals.Zip(signature.Outputs)
                  .Where(pair => !pair.Value.IsPassthrough))
         {
             VariableReference outputVariable = outputTerminalPair.Key.GetTrueVariable();
             if (outputVariable.TypeVariableReference.IsOrContainsTypeVariable)
             {
                 outputTerminalPair.Key.SetDfirMessage(Messages.TypeNotDetermined);
             }
         }
     }
     if (functionalNode.RequiredFeatureToggles.Any(feature => !FeatureToggleSupport.IsFeatureEnabled(feature)))
     {
         functionalNode.SetDfirMessage(Messages.FeatureNotEnabled);
     }
     return(true);
 }
 public bool VisitFunctionalNode(FunctionalNode functionalNode)
 {
     VisitFunctionSignatureNode(functionalNode, functionalNode.Signature);
     if (functionalNode.RequiredFeatureToggles.Any(feature => !FeatureToggleSupport.IsFeatureEnabled(feature)))
     {
         functionalNode.SetDfirMessage(Messages.FeatureNotEnabled);
     }
     return(true);
 }
Esempio n. 4
0
        public void VariantMatchStructureWithThreeCasesAndThirdElementInput_Execute_CorrectFrameExecutes()
        {
            using (FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.AllIntegerTypes))
            {
                DfirRoot function = DfirRoot.Create();
                var      variantConstructorNodeInt = new VariantConstructorNode(function.BlockDiagram, ThreeFieldVariantType, 2);
                ConnectConstantToInputTerminal(variantConstructorNodeInt.InputTerminals[0], NITypes.Int16, (short)5, false);
                VariantMatchStructure variantMatchStructure = this.CreateVariantMatchStructure(function.BlockDiagram, 3);
                Wire.Create(function.BlockDiagram, variantConstructorNodeInt.VariantOutputTerminal, variantMatchStructure.Selector.InputTerminals[0]);
                this.ConnectOutputToOutputTerminal(variantMatchStructure.Selector.OutputTerminals[2]);

                TestExecutionInstance executionInstance = CompileAndExecuteFunction(function);

                Assert.AreEqual("5", executionInstance.RuntimeServices.LastOutputValue);
            }
        }
Esempio n. 5
0
        public void PanickingMethodCallWithNoParametersThatDoesNotPanic_Execute_RuntimeDoesNotRegisterPanic()
        {
            using (FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.ParametersAndCalls))
            {
                string calleeName = "callee";
                NIType calleeType = calleeName.DefineMethodType().CreateType();
                CompilableDefinitionName calleeDefinitionName = CreateTestCompilableDefinitionName(calleeName);
                DfirRoot calleeFunction = calleeType.CreateFunctionFromSignature(calleeDefinitionName);
                CreateNonPanickingUnwrapOption(calleeFunction.BlockDiagram);
                DfirRoot callerFunction = DfirRoot.Create();
                var      methodCall     = new MethodCallNode(callerFunction.BlockDiagram, calleeDefinitionName, calleeType);

                TestExecutionInstance executionInstance = CompileAndExecuteFunction(callerFunction, calleeFunction);

                Assert.IsFalse(executionInstance.RuntimeServices.PanicOccurred);
            }
        }
Esempio n. 6
0
        public void VectorIntoStringFromByteSlice_Execute_CorrectStringResult()
        {
            using (FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.AllIntegerTypes))
            {
                DfirRoot function         = DfirRoot.Create();
                var      initializeVector = new FunctionalNode(function.BlockDiagram, Signatures.VectorInitializeType);
                ConnectConstantToInputTerminal(initializeVector.InputTerminals[0], NITypes.UInt8, (byte)97, false);
                ConnectConstantToInputTerminal(initializeVector.InputTerminals[1], NITypes.Int32, 3, false);
                var vectorToSlice = new FunctionalNode(function.BlockDiagram, Signatures.VectorToSliceType);
                Wire.Create(function.BlockDiagram, initializeVector.OutputTerminals[0], vectorToSlice.InputTerminals[0]);
                var stringFromByteSlice = new FunctionalNode(function.BlockDiagram, Signatures.StringFromByteSliceType);
                Wire.Create(function.BlockDiagram, vectorToSlice.OutputTerminals[0], stringFromByteSlice.InputTerminals[0]);
                var output = new FunctionalNode(function.BlockDiagram, Signatures.OutputType);
                Wire.Create(function.BlockDiagram, stringFromByteSlice.OutputTerminals[1], output.InputTerminals[0]);

                TestExecutionInstance executionInstance = CompileAndExecuteFunction(function);

                Assert.AreEqual("aaa", executionInstance.RuntimeServices.LastOutputValue);
            }
        }
Esempio n. 7
0
        public void PanickingMethodCallWithInputAndOutputThatPanicsIntoOutput_Execute_NoOutputValue()
        {
            using (FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.ParametersAndCalls))
            {
                string calleeName = "callee";
                NIType calleeType = DefineFunctionTypeWithOptionIntInAndIntOut(calleeName);
                CompilableDefinitionName calleeDefinitionName = CreateTestCompilableDefinitionName(calleeName);
                DfirRoot       calleeFunction     = calleeType.CreateFunctionFromSignature(calleeDefinitionName);
                DataAccessor   inputDataAccessor  = DataAccessor.Create(calleeFunction.BlockDiagram, calleeFunction.DataItems[0], Direction.Output);
                DataAccessor   outputDataAccessor = DataAccessor.Create(calleeFunction.BlockDiagram, calleeFunction.DataItems[1], Direction.Input);
                FunctionalNode unwrap             = new FunctionalNode(calleeFunction.BlockDiagram, Signatures.UnwrapOptionType);
                Wire.Create(calleeFunction.BlockDiagram, inputDataAccessor.Terminal, unwrap.InputTerminals[0]);
                Wire.Create(calleeFunction.BlockDiagram, unwrap.OutputTerminals[0], outputDataAccessor.Terminal);
                DfirRoot       callerFunction = DfirRoot.Create();
                var            methodCall     = new MethodCallNode(callerFunction.BlockDiagram, calleeDefinitionName, calleeType);
                FunctionalNode noneInteger    = CreateNoneOfOptionIntegerType(callerFunction.BlockDiagram);
                Wire.Create(callerFunction.BlockDiagram, noneInteger.OutputTerminals[0], methodCall.InputTerminals[0]);
                ConnectOutputToOutputTerminal(methodCall.OutputTerminals[0]);

                TestExecutionInstance executionInstance = CompileAndExecuteFunction(callerFunction, calleeFunction);

                AssertNoOutput(executionInstance);
            }
        }
Esempio n. 8
0
 public void Initialize()
 {
     _integerTypesFeatureToggle = FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.AllIntegerTypes);
 }