コード例 #1
0
ファイル: CompilerTestBase.cs プロジェクト: rebarlang/rebar
        internal OptionPatternStructure CreateOptionPatternStructure(Diagram parentDiagram)
        {
            OptionPatternStructure patternStructure = new OptionPatternStructure(parentDiagram);

            patternStructure.CreateDiagram();
            return(patternStructure);
        }
コード例 #2
0
        public void OptionPatternStructureWithUnwiredSelector_ValidateVariableUsages_RequiredTerminalUnconnectedError()
        {
            DfirRoot function = DfirRoot.Create();
            OptionPatternStructure patternStructure = CreateOptionPatternStructure(function.BlockDiagram);

            RunSemanticAnalysisUpToValidation(function);

            OptionPatternStructureSelector selector = patternStructure.Selector;

            AssertTerminalHasRequiredTerminalUnconnectedMessage(selector.InputTerminals[0]);
        }
コード例 #3
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]);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
            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);
            }
コード例 #7
0
        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());
        }
コード例 #8
0
        // 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);
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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);
        }
コード例 #12
0
 bool IDfirStructureVisitor <bool> .VisitOptionPatternStructure(OptionPatternStructure optionPatternStructure, StructureTraversalPoint traversalPoint, Diagram nestedDiagram)
 {
     return(true);
 }
コード例 #13
0
ファイル: AsyncStateGrouper.cs プロジェクト: rebarlang/rebar
        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;
            }
            }
        }