public static VariantMatchStructure CreateVariantMatchStructure(this CompilerTestBase test, Diagram parentDiagram, int diagramCount) { var variantMatchStructure = new VariantMatchStructure(parentDiagram); for (int i = 0; i < diagramCount - 1; ++i) { variantMatchStructure.CreateDiagram(); } return(variantMatchStructure); }
public void VariantMatchStructureWithNonVariantSelectorInput_ValidateVariableUsages_SelectorInputHasErrorMessage() { DfirRoot function = DfirRoot.Create(); VariantMatchStructure variantMatchStructure = this.CreateVariantMatchStructure(function.BlockDiagram, 2); ConnectConstantToInputTerminal(variantMatchStructure.Selector.InputTerminals[0], NITypes.Int32, false); RunSemanticAnalysisUpToValidation(function); Assert.IsTrue(variantMatchStructure.Selector.InputTerminals[0].GetDfirMessages().Any(message => message.Descriptor == Messages.TypeIsNotVariantTypeDescriptor)); }
private static IEnumerable <string> GetCaseNames(VariantMatchStructure variantMatchStructure) { int diagramCount = variantMatchStructure.NestedDiagrams.Count(); NIType variantType = variantMatchStructure.Type; if (variantType.IsUnion()) { IEnumerable <NIType> variantFields = variantType.GetFields(); if (variantFields.HasExactly(diagramCount)) { return(variantFields.Select(f => f.GetName())); } } return(string.Empty.Repeat(diagramCount)); }
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 VariantMatchStructureWithTwoCasesAndSecondElementInput_Execute_CorrectFrameExecutes() { DfirRoot function = DfirRoot.Create(); var variantConstructorNodeInt = new VariantConstructorNode(function.BlockDiagram, VariantType, 1); ConnectConstantToInputTerminal(variantConstructorNodeInt.InputTerminals[0], NITypes.Boolean, true, false); VariantMatchStructure variantMatchStructure = this.CreateVariantMatchStructure(function.BlockDiagram, 2); Wire.Create(function.BlockDiagram, variantConstructorNodeInt.VariantOutputTerminal, variantMatchStructure.Selector.InputTerminals[0]); this.ConnectOutputToOutputTerminal(variantMatchStructure.Selector.OutputTerminals[0]); this.ConnectOutputToOutputTerminal(variantMatchStructure.Selector.OutputTerminals[1]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); Assert.AreEqual("true", executionInstance.RuntimeServices.LastOutputValue); }
public void VariantMatchStructureWithInputTunnel_Execute_InputTunnelValueCorrectlyTransferred() { DfirRoot function = DfirRoot.Create(); var variantConstructorNodeInt = new VariantConstructorNode(function.BlockDiagram, VariantType, 0); ConnectConstantToInputTerminal(variantConstructorNodeInt.InputTerminals[0], NITypes.Int32, 5, false); VariantMatchStructure variantMatchStructure = this.CreateVariantMatchStructure(function.BlockDiagram, 2); Wire.Create(function.BlockDiagram, variantConstructorNodeInt.VariantOutputTerminal, variantMatchStructure.Selector.InputTerminals[0]); Tunnel inputTunnel = CreateInputTunnel(variantMatchStructure); ConnectConstantToInputTerminal(inputTunnel.InputTerminals[0], NITypes.Int32, 5, false); this.ConnectOutputToOutputTerminal(inputTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); Assert.AreEqual("5", executionInstance.RuntimeServices.LastOutputValue); }
public void VariantMatchStructureWithVariantInput_SetVariableTypes_CorrectFieldTypesSetOnSelectorInnerTerminals() { DfirRoot function = DfirRoot.Create(); var variantConstructorNode = new VariantConstructorNode(function.BlockDiagram, VariantType, 0); ConnectConstantToInputTerminal(variantConstructorNode.InputTerminals[0], NITypes.Int32, false); VariantMatchStructure variantMatchStructure = this.CreateVariantMatchStructure(function.BlockDiagram, 2); Wire.Create(function.BlockDiagram, variantConstructorNode.VariantOutputTerminal, variantMatchStructure.Selector.InputTerminals[0]); RunSemanticAnalysisUpToSetVariableTypes(function); VariableReference selectorInnerVariable0 = variantMatchStructure.Selector.OutputTerminals[0].GetTrueVariable(); Assert.IsTrue(selectorInnerVariable0.Type.IsInt32()); VariableReference selectorInnerVariable1 = variantMatchStructure.Selector.OutputTerminals[1].GetTrueVariable(); Assert.IsTrue(selectorInnerVariable1.Type.IsBoolean()); }
public void VariantMatchStructureWithOutputTunnelAndSecondFieldInputValue_Execute_OutputTunnelHasCorrectValue() { DfirRoot function = DfirRoot.Create(); var variantConstructorNodeInt = new VariantConstructorNode(function.BlockDiagram, VariantType, 1); ConnectConstantToInputTerminal(variantConstructorNodeInt.InputTerminals[0], NITypes.Boolean, true, false); VariantMatchStructure variantMatchStructure = this.CreateVariantMatchStructure(function.BlockDiagram, 2); Wire.Create(function.BlockDiagram, variantConstructorNodeInt.VariantOutputTerminal, variantMatchStructure.Selector.InputTerminals[0]); Tunnel outputTunnel = CreateOutputTunnel(variantMatchStructure); ConnectConstantToInputTerminal(outputTunnel.InputTerminals[0], NITypes.Int32, 5, false); ConnectConstantToInputTerminal(outputTunnel.InputTerminals[1], NITypes.Int32, 6, false); this.ConnectOutputToOutputTerminal(outputTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); Assert.AreEqual("6", executionInstance.RuntimeServices.LastOutputValue); }
bool IDfirStructureVisitor <bool> .VisitVariantMatchStructure(VariantMatchStructure variantMatchStructure, StructureTraversalPoint traversalPoint, Diagram nestedDiagram) { return(true); }
private void VisitVariantMatchStructure(VariantMatchStructure variantMatchStructure, Diagram diagram, StructureTraversalPoint traversalPoint) { var predecessors = new HashSet <AsyncStateGroup>(); switch (traversalPoint) { case StructureTraversalPoint.BeforeLeftBorderNodes: { predecessors.AddRange(GetStructureBorderNodePredecessorGroups( variantMatchStructure, variantMatchStructure.ParentDiagram, Direction.Input)); AsyncStateGroup structureInitialGroup = GetGroupJoinOfPredecessorGroups( $"variantMatchStructure{variantMatchStructure.UniqueId}_initialGroup", variantMatchStructure.ParentDiagram, predecessors); _structureInitialGroups[variantMatchStructure] = structureInitialGroup; AsyncStateGroup structureInputBorderNodeGroup = CreateGroupThatConditionallySchedulesSuccessors( $"variantMatchStructure{variantMatchStructure.UniqueId}_inputBNGroup", variantMatchStructure.ParentDiagram); AddUnconditionalSuccessorGroup(structureInitialGroup, structureInputBorderNodeGroup); _structureInputBorderNodeGroups[variantMatchStructure] = structureInputBorderNodeGroup; AddVisitationToGroup( structureInputBorderNodeGroup, new StructureVisitation(variantMatchStructure, null, StructureTraversalPoint.BeforeLeftBorderNodes)); AsyncStateGroup structureTerminalGroup = CreateGroupThatUnconditionallySchedulesSuccessors( $"variantMatchStructure{variantMatchStructure.UniqueId}_terminalGroup", variantMatchStructure.ParentDiagram); structureTerminalGroup.SignaledConditionally = true; _nodeGroups[variantMatchStructure] = structureTerminalGroup; _structureOutputBorderNodeGroups[variantMatchStructure] = structureTerminalGroup; break; } case StructureTraversalPoint.AfterLeftBorderNodesAndBeforeDiagram: { AsyncStateGroup structureInputBorderNodeGroup = _structureInputBorderNodeGroups[variantMatchStructure]; AsyncStateGroup diagramInitialGroup = CreateGroupThatUnconditionallySchedulesSuccessors( $"diagram{diagram.UniqueId}_initialGroup", diagram); diagramInitialGroup.BeginsAsDiagramInitialGroup = true; _diagramInitialGroups[diagram] = diagramInitialGroup; AddConditionalSuccessorGroups(structureInputBorderNodeGroup, new HashSet <AsyncStateGroup>() { diagramInitialGroup }); AddVisitationToGroup( diagramInitialGroup, new StructureVisitation(variantMatchStructure, diagram, StructureTraversalPoint.AfterLeftBorderNodesAndBeforeDiagram)); break; } case StructureTraversalPoint.AfterDiagram: { predecessors.AddRange(GetStructureBorderNodePredecessorGroups( variantMatchStructure, 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[variantMatchStructure]; AddUnconditionalSuccessorGroup(diagramTerminalGroup, structureTerminalGroup); AddVisitationToGroup( diagramTerminalGroup, new StructureVisitation(variantMatchStructure, diagram, StructureTraversalPoint.AfterDiagram)); break; } } }
public VariantMatchStructureEditor(VariantMatchStructure model) : base(model) { }