internal OptionPatternStructure CreateOptionPatternStructure(Diagram parentDiagram) { OptionPatternStructure patternStructure = new OptionPatternStructure(parentDiagram); patternStructure.CreateDiagram(); return(patternStructure); }
public void OptionPatternStructureWithUnwiredSelector_ValidateVariableUsages_RequiredTerminalUnconnectedError() { DfirRoot function = DfirRoot.Create(); OptionPatternStructure patternStructure = CreateOptionPatternStructure(function.BlockDiagram); RunSemanticAnalysisUpToValidation(function); OptionPatternStructureSelector selector = patternStructure.Selector; AssertTerminalHasRequiredTerminalUnconnectedMessage(selector.InputTerminals[0]); }
public void OptionPatternStructureWithOutputTunnelUnwiredOnAnyDiagram_ValidateVariableUsages_RequiredTerminalUnconnectedError() { DfirRoot function = DfirRoot.Create(); OptionPatternStructure patternStructure = CreateOptionPatternStructure(function.BlockDiagram); Tunnel outputTunnel = CreateOutputTunnel(patternStructure); ConnectConstantToInputTerminal(outputTunnel.InputTerminals[0], NITypes.Int32, false); RunSemanticAnalysisUpToValidation(function); AssertTerminalHasRequiredTerminalUnconnectedMessage(outputTunnel.InputTerminals[1]); }
public void OptionPatternStructureSelectorWiredToInspectOnSomeValueDiagram_Execute_CorrectValue() { DfirRoot function = DfirRoot.Create(); OptionPatternStructure patternStructure = CreateOptionPatternStructureWithOptionValueWiredToSelector(function.BlockDiagram, 1); FunctionalNode someInspectNode = new FunctionalNode(patternStructure.Diagrams[0], Signatures.InspectType); Wire.Create(patternStructure.Diagrams[0], patternStructure.Selector.OutputTerminals[0], someInspectNode.InputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(someInspectNode); AssertByteArrayIsInt32(inspectValue, 1); }
private DfirRoot CreateOptionPatternStructureWithOutputTunnelAndInspect(bool selectorValueIsSome, int someDiagramTunnelValue, int noneDiagramTunnelValue) { DfirRoot function = DfirRoot.Create(); OptionPatternStructure patternStructure = CreateOptionPatternStructureWithOptionValueWiredToSelector( function.BlockDiagram, selectorValueIsSome ? (int?)0 : null); Tunnel outputTunnel = CreateOutputTunnel(patternStructure); ConnectConstantToInputTerminal(outputTunnel.InputTerminals[0], NITypes.Int32, someDiagramTunnelValue, false); ConnectConstantToInputTerminal(outputTunnel.InputTerminals[1], NITypes.Int32, noneDiagramTunnelValue, false); ConnectInspectToOutputTerminal(outputTunnel.OutputTerminals[0]); return(function); }
public OptionPatternStructureWithInspectOnEachDiagramTest(OptionPatternStructureExecutionTests test, bool selectorValueIsSome) { _test = test; _function = DfirRoot.Create(); OptionPatternStructure patternStructure = _test.CreateOptionPatternStructureWithOptionValueWiredToSelector( _function.BlockDiagram, selectorValueIsSome ? (int?)0 : null); _someInspectNode = new FunctionalNode(patternStructure.Diagrams[0], Signatures.InspectType); _test.ConnectConstantToInputTerminal(_someInspectNode.InputTerminals[0], NITypes.Int32, 1, false); _noneInspectNode = new FunctionalNode(patternStructure.Diagrams[1], Signatures.InspectType); _test.ConnectConstantToInputTerminal(_noneInspectNode.InputTerminals[0], NITypes.Int32, 1, false); }
public void OptionPatternStructureWithOptionValueConnectedToSelector_SetVariableTypes_SelectorInnerTerminalOnSomeDiagramHasOptionInnerType() { DfirRoot function = DfirRoot.Create(); OptionPatternStructure patternStructure = CreateOptionPatternStructure(function.BlockDiagram); FunctionalNode someConstructor = new FunctionalNode(function.BlockDiagram, Signatures.SomeConstructorType); Wire.Create(function.BlockDiagram, someConstructor.OutputTerminals[0], patternStructure.Selector.InputTerminals[0]); ConnectConstantToInputTerminal(someConstructor.InputTerminals[0], NITypes.Int32, false); RunSemanticAnalysisUpToSetVariableTypes(function); VariableReference innerSelectorVariable = patternStructure.Selector.OutputTerminals[0].GetTrueVariable(); Assert.IsTrue(innerSelectorVariable.Type.IsInt32()); }
// Failing because the OptionPatternStructure doesn't correctly skip its interior after a panic // [TestMethod] public void PanickingUnwrapOptionIntoUnwrapOptionStructure_Execute_StructureDoesNotExecute() { DfirRoot function = DfirRoot.Create(); FunctionalNode unwrap = CreatePanickingUnwrapOption(function.BlockDiagram); OptionPatternStructure optionPatternStructure = CreateOptionPatternStructure(function.BlockDiagram); ConnectSomeOfIntegerToInputTerminal(optionPatternStructure.Selector.InputTerminals[0], 0); Tunnel inputTunnel = CreateInputTunnel(optionPatternStructure); Wire.Create(function.BlockDiagram, unwrap.OutputTerminals[0], inputTunnel.InputTerminals[0]); ConnectOutputToOutputTerminal(inputTunnel.OutputTerminals[0]); ConnectOutputToOutputTerminal(inputTunnel.OutputTerminals[1]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); AssertNoOutput(executionInstance); }
public void PanickingUnwrapOptionInsideOptionPatternStructureDiagram_Execute_DownstreamOfStructureDoesNotExecute() { DfirRoot function = DfirRoot.Create(); OptionPatternStructure optionPatternStructure = CreateOptionPatternStructure(function.BlockDiagram); ConnectSomeOfIntegerToInputTerminal(optionPatternStructure.Selector.InputTerminals[0], 0); Diagram someDiagram = optionPatternStructure.Diagrams[0]; FunctionalNode unwrap = CreatePanickingUnwrapOption(someDiagram); Tunnel outputTunnel = CreateOutputTunnel(optionPatternStructure); Wire.Create(someDiagram, unwrap.OutputTerminals[0], outputTunnel.InputTerminals[0]); ConnectConstantToInputTerminal(outputTunnel.InputTerminals[1], NITypes.Int32, 1, false); ConnectOutputToOutputTerminal(outputTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); AssertNoOutput(executionInstance); }
public void OptionPatternStructureWithInputTunnel_Execute_InputTunnelValueCorrectlyTransferred() { DfirRoot function = DfirRoot.Create(); OptionPatternStructure optionPatternStructure = CreateOptionPatternStructure(function.BlockDiagram); var someConstructor = new FunctionalNode(function.BlockDiagram, Signatures.SomeConstructorType); Wire.Create(function.BlockDiagram, someConstructor.OutputTerminals[0], optionPatternStructure.Selector.InputTerminals[0]); ConnectConstantToInputTerminal(someConstructor.InputTerminals[0], NITypes.Int32, 0, false); Tunnel inputTunnel = CreateInputTunnel(optionPatternStructure); ConnectConstantToInputTerminal(inputTunnel.InputTerminals[0], NITypes.Int32, 5, false); var output = new FunctionalNode(optionPatternStructure.Diagrams[0], Signatures.OutputType); Wire.Create(optionPatternStructure.Diagrams[0], inputTunnel.OutputTerminals[0], output.InputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); Assert.AreEqual("5", executionInstance.RuntimeServices.LastOutputValue); }
private OptionPatternStructure CreateOptionPatternStructureWithOptionValueWiredToSelector(Diagram parentDiagram, int?selectorValue) { OptionPatternStructure patternStructure = CreateOptionPatternStructure(parentDiagram); FunctionalNode someConstructor = new FunctionalNode(parentDiagram, Signatures.SomeConstructorType); if (selectorValue != null) { Wire.Create(parentDiagram, someConstructor.OutputTerminals[0], patternStructure.Selector.InputTerminals[0]); ConnectConstantToInputTerminal(someConstructor.InputTerminals[0], NITypes.Int32, selectorValue, false); } else { ConnectConstantToInputTerminal(someConstructor.InputTerminals[0], NITypes.Int32, 0, false); FunctionalNode assign = new FunctionalNode(parentDiagram, Signatures.AssignType); Wire optionValueWire = Wire.Create(parentDiagram, someConstructor.OutputTerminals[0], assign.InputTerminals[0]); optionValueWire.SetWireBeginsMutableVariable(true); FunctionalNode noneConstructor = new FunctionalNode(parentDiagram, Signatures.NoneConstructorType); Wire.Create(parentDiagram, noneConstructor.OutputTerminals[0], assign.InputTerminals[1]); Wire.Create(parentDiagram, assign.OutputTerminals[0], patternStructure.Selector.InputTerminals[0]); } return(patternStructure); }
bool IDfirStructureVisitor <bool> .VisitOptionPatternStructure(OptionPatternStructure optionPatternStructure, StructureTraversalPoint traversalPoint, Diagram nestedDiagram) { return(true); }
private void VisitOptionPatternStructure(OptionPatternStructure optionPatternStructure, Diagram diagram, StructureTraversalPoint traversalPoint) { var predecessors = new HashSet <AsyncStateGroup>(); switch (traversalPoint) { case StructureTraversalPoint.BeforeLeftBorderNodes: { predecessors.AddRange(GetStructureBorderNodePredecessorGroups( optionPatternStructure, optionPatternStructure.ParentDiagram, Direction.Input)); AsyncStateGroup structureInitialGroup = GetGroupJoinOfPredecessorGroups( $"optionPatternStructure{optionPatternStructure.UniqueId}_initialGroup", optionPatternStructure.ParentDiagram, predecessors); _structureInitialGroups[optionPatternStructure] = structureInitialGroup; AsyncStateGroup structureInputBorderNodeGroup = CreateGroupThatConditionallySchedulesSuccessors( $"optionPatternStructure{optionPatternStructure.UniqueId}_inputBNGroup", optionPatternStructure.ParentDiagram); AddUnconditionalSuccessorGroup(structureInitialGroup, structureInputBorderNodeGroup); _structureInputBorderNodeGroups[optionPatternStructure] = structureInputBorderNodeGroup; AddVisitationToGroup( structureInputBorderNodeGroup, new StructureVisitation(optionPatternStructure, null, StructureTraversalPoint.BeforeLeftBorderNodes)); AsyncStateGroup structureTerminalGroup = CreateGroupThatUnconditionallySchedulesSuccessors( $"optionPatternStructure{optionPatternStructure.UniqueId}_terminalGroup", optionPatternStructure.ParentDiagram); structureTerminalGroup.SignaledConditionally = true; _nodeGroups[optionPatternStructure] = structureTerminalGroup; _structureOutputBorderNodeGroups[optionPatternStructure] = structureTerminalGroup; break; } case StructureTraversalPoint.AfterLeftBorderNodesAndBeforeDiagram: { AsyncStateGroup structureInputBorderNodeGroup = _structureInputBorderNodeGroups[optionPatternStructure]; AsyncStateGroup diagramInitialGroup = CreateGroupThatUnconditionallySchedulesSuccessors( $"diagram{diagram.UniqueId}_initialGroup", diagram); diagramInitialGroup.BeginsAsDiagramInitialGroup = true; _diagramInitialGroups[diagram] = diagramInitialGroup; AddConditionalSuccessorGroups(structureInputBorderNodeGroup, new HashSet <AsyncStateGroup>() { diagramInitialGroup }); AddVisitationToGroup( diagramInitialGroup, new StructureVisitation(optionPatternStructure, diagram, StructureTraversalPoint.AfterLeftBorderNodesAndBeforeDiagram)); break; } case StructureTraversalPoint.AfterDiagram: { predecessors.AddRange(GetStructureBorderNodePredecessorGroups( optionPatternStructure, diagram, Direction.Output)); foreach (Node node in diagram.Nodes) { if (!node.GetDownstreamNodesSameDiagram(false).Any()) { predecessors.Add(_nodeGroups[node]); } } AsyncStateGroup diagramTerminalGroup = GetGroupJoinOfPredecessorGroups( $"diagram{diagram.UniqueId}_terminalGroup", diagram, predecessors); AsyncStateGroup structureTerminalGroup = _nodeGroups[optionPatternStructure]; AddUnconditionalSuccessorGroup(diagramTerminalGroup, structureTerminalGroup); AddVisitationToGroup( diagramTerminalGroup, new StructureVisitation(optionPatternStructure, diagram, StructureTraversalPoint.AfterDiagram)); break; } } }