public void StructConstructorContainingDroppableType_Execute_DroppableValueDropped()
        {
            DfirRoot       function = DfirRoot.Create();
            var            structConstructorNode = new StructConstructorNode(function.BlockDiagram, FakeDropStructType);
            FunctionalNode fakeDrop = CreateFakeDropWithId(function.BlockDiagram, 1);

            Wire.Create(function.BlockDiagram, fakeDrop.OutputTerminals[0], structConstructorNode.InputTerminals[0]);

            TestExecutionInstance executionInstance = CompileAndExecuteFunction(function);

            Assert.IsTrue(executionInstance.RuntimeServices.DroppedFakeDropIds.Contains(1));
        }
        bool IDfirNodeVisitor <bool> .VisitStructConstructorNode(StructConstructorNode structConstructorNode)
        {
            NIType structType = structConstructorNode.Type;

            foreach (var pair in structConstructorNode.InputTerminals.Zip(structType.GetFields()))
            {
                Terminal inputTerminal = pair.Key;
                _nodeFacade[inputTerminal] = new SimpleTerminalFacade(
                    inputTerminal,
                    _typeVariableSet.CreateTypeVariableReferenceFromNIType(pair.Value.GetDataType()));
            }
            _nodeFacade[structConstructorNode.OutputTerminals[0]] = new SimpleTerminalFacade(
                structConstructorNode.OutputTerminals[0],
                _typeVariableSet.CreateTypeVariableReferenceFromNIType(structType));
            return(true);
        }
Exemple #3
0
        public void StructConstructorIntoStructFieldAccessorWithNullFieldName_SetVariableTypes_VoidFieldVariableType()
        {
            DfirRoot function = DfirRoot.Create();
            var      structConstructorNode = new StructConstructorNode(function.BlockDiagram, StructType);

            ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[0], NITypes.Int32, false);
            ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[1], NITypes.Boolean, false);
            var structFieldAccessor = new StructFieldAccessorNode(function.BlockDiagram, new string[] { null });

            Wire.Create(function.BlockDiagram, structConstructorNode.OutputTerminals[0], structFieldAccessor.StructInputTerminal);

            RunSemanticAnalysisUpToSetVariableTypes(function);

            VariableReference fieldVariable = structFieldAccessor.OutputTerminals[0].GetTrueVariable();

            Assert.IsTrue(fieldVariable.Type.GetReferentType().IsVoid());
        }
Exemple #4
0
        public void UnconsumedStructVariable_AutomaticNodeInsertion_StructIsDecomposedAndElementsAreDropped()
        {
            DfirRoot function        = DfirRoot.Create();
            var      constructorNode = new StructConstructorNode(function.BlockDiagram, StructType);
            Constant constant        = Constant.Create(function.BlockDiagram, string.Empty, DataTypes.StringSliceType.CreateImmutableReference());
            var      stringFromSlice = new FunctionalNode(function.BlockDiagram, Signatures.StringFromSliceType);

            Wire.Create(function.BlockDiagram, constant.OutputTerminal, stringFromSlice.InputTerminals[0]);
            Wire.Create(function.BlockDiagram, stringFromSlice.OutputTerminals[1], constructorNode.InputTerminals[0]);

            RunCompilationUpToAutomaticNodeInsertion(function);

            DecomposeStructNode decomposeStruct = AssertDiagramContainsNodeWithSources <DecomposeStructNode>(function.BlockDiagram, constructorNode.OutputTerminals[0]);

            Assert.AreEqual(StructType, decomposeStruct.Type);
            DropNode dropNode = AssertDiagramContainsNodeWithSources <DropNode>(function.BlockDiagram, decomposeStruct.OutputTerminals[0]);

            AssertDropInputVariableHasType(dropNode, NITypes.String);
        }
        public void StructConstructorIntoStructFieldAccessor_Execute_FieldValuesAccessed()
        {
            DfirRoot function = DfirRoot.Create();
            var      structConstructorNode = new StructConstructorNode(function.BlockDiagram, StructType);

            ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[0], NITypes.Int32, 5, false);
            ConnectConstantToInputTerminal(structConstructorNode.InputTerminals[1], NITypes.Boolean, true, false);
            var structFieldAccessor = new StructFieldAccessorNode(function.BlockDiagram, new string[] { "_0", "_1" });

            Wire.Create(function.BlockDiagram, structConstructorNode.OutputTerminals[0], structFieldAccessor.StructInputTerminal);
            FunctionalNode inspect0 = ConnectInspectToOutputTerminal(structFieldAccessor.OutputTerminals[0]);
            FunctionalNode inspect1 = ConnectInspectToOutputTerminal(structFieldAccessor.OutputTerminals[1]);

            TestExecutionInstance executionInstance = CompileAndExecuteFunction(function);

            byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(inspect0);
            AssertByteArrayIsInt32(inspectValue, 5);
            inspectValue = executionInstance.GetLastValueFromInspectNode(inspect1);
            AssertByteArrayIsBoolean(inspectValue, true);
        }
        public void VisitConstructor(Constructor constructor)
        {
            NIType dependencyType = constructor.Type;

            if (dependencyType.IsValueClass() && dependencyType.GetFields().Count() > 0)
            {
                var structConstructorNode = new StructConstructorNode(_currentDiagram, dependencyType);
                _map.AddMapping(constructor, structConstructorNode);
                _map.MapTerminalsInOrder(constructor, structConstructorNode);
                return;
            }
            else if (dependencyType.IsUnion())
            {
                int index = 0;
                {
                    var    input     = (ConstructorTerminal)constructor.InputTerminals.First();
                    string fieldName = input.FieldName;
                    int    current   = 0;
                    foreach (NIType field in dependencyType.GetFields())
                    {
                        if (field.GetName() == fieldName)
                        {
                            index = current;
                            break;
                        }
                        ++current;
                    }
                }

                var variantConstructorNode = new VariantConstructorNode(_currentDiagram, dependencyType, index);
                _map.AddMapping(constructor, variantConstructorNode);
                _map.MapTerminalsInOrder(constructor, variantConstructorNode);
                return;
            }
            else
            {
                Constant constant = Constant.CreateConstantWithDefaultValue(_currentDiagram, dependencyType);
                _map.AddMapping(constructor, constant);
                _map.MapTerminalsInOrder(constructor, constant);
            }
        }
 public bool VisitStructConstructorNode(StructConstructorNode structConstructorNode)
 {
     structConstructorNode.InputTerminals.ForEach(ValidateRequiredInputTerminal);
     return(true);
 }
 bool IDfirNodeVisitor <bool> .VisitStructConstructorNode(StructConstructorNode structConstructorNode)
 {
     structConstructorNode.InputTerminals.ForEach(MarkTrueVariableOfTerminalConsumed);
     MarkFacadeVariableOfTerminalLive(structConstructorNode.OutputTerminals[0]);
     return(true);
 }
 bool IDfirNodeVisitor <bool> .VisitStructConstructorNode(StructConstructorNode structConstructorNode)
 {
     structConstructorNode.UnifyNodeInputTerminalTypes(_typeUnificationResults);
     return(true);
 }