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); }
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); } }
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); } }
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); } }
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); } }
public void Initialize() { _integerTypesFeatureToggle = FeatureToggleSupport.TemporarilyEnableFeature(RebarFeatureToggles.AllIntegerTypes); }