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);
        }
Example #2
0
        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));
        }
Example #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);
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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());
        }
Example #8
0
        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);
 }
Example #10
0
        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)
 {
 }