コード例 #1
0
        public ForLoopNode() : base(NodeType.FlowControl)
        {
            var boundsGroup = new EndpointGroup("Bounds");

            var controlFlowGroup = new EndpointGroup("Control Flow");

            var controlFlowInputsGroup = new EndpointGroup(controlFlowGroup);

            this.Name = "For Loop";

            LoopBodyFlow = new CodeGenListInputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "Loop Body",
                Group = controlFlowInputsGroup
            };
            this.Inputs.Add(LoopBodyFlow);

            LoopEndFlow = new CodeGenListInputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "Loop End",
                Group = controlFlowInputsGroup
            };
            this.Inputs.Add(LoopEndFlow);


            FirstIndex = new CodeGenInputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name  = "First Index",
                Group = boundsGroup
            };
            this.Inputs.Add(FirstIndex);

            LastIndex = new CodeGenInputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name  = "Last Index",
                Group = boundsGroup
            };
            this.Inputs.Add(LastIndex);

            ForLoop value = new ForLoop();

            var loopBodyChanged = LoopBodyFlow.Values.Connect().Select(_ => Unit.Default).StartWith(Unit.Default);
            var loopEndChanged  = LoopEndFlow.Values.Connect().Select(_ => Unit.Default).StartWith(Unit.Default);

            FlowIn = new CodeGenOutputViewModel <IStatement>(PortType.Execution)
            {
                Name  = "",
                Value = Observable.CombineLatest(loopBodyChanged, loopEndChanged, FirstIndex.ValueChanged, LastIndex.ValueChanged,
                                                 (bodyChange, endChange, firstI, lastI) => (BodyChange: bodyChange, EndChange: endChange, FirstI: firstI, LastI: lastI))
                        .Select(v => {
                    value.LoopBody   = new StatementSequence(LoopBodyFlow.Values.Items);
                    value.LoopEnd    = new StatementSequence(LoopEndFlow.Values.Items);
                    value.LowerBound = v.FirstI ?? new IntLiteral {
                        Value = 0
                    };
                    value.UpperBound = v.LastI ?? new IntLiteral {
                        Value = 1
                    };
                    return(value);
                }),
                Group = controlFlowGroup
            };
            this.Outputs.Add(FlowIn);

            CurrentIndex = new CodeGenOutputViewModel <ITypedExpression <int> >(PortType.Integer)
            {
                Name  = "Current Index",
                Value = Observable.Return(new VariableReference <int> {
                    LocalVariable = value.CurrentIndex
                })
            };
            this.Outputs.Add(CurrentIndex);
        }
    }
コード例 #2
0
        public void TestNestedGroups()
        {
            NodeViewModel node = new NodeViewModel();

            EndpointGroup groupA = new EndpointGroup {
                Name = "Group A"
            };
            EndpointGroup groupB = new EndpointGroup {
                Name = "Group B"
            };
            EndpointGroup groupC = new EndpointGroup(groupA)
            {
                Name = "Group C"
            };
            EndpointGroup groupD = new EndpointGroup(groupB)
            {
                Name = "Group D"
            };

            NodeInputViewModel inputC = new NodeInputViewModel {
                Group = groupC, Name = "Input C"
            };
            NodeOutputViewModel outputC = new NodeOutputViewModel {
                Group = groupC, Name = "Output C"
            };

            NodeInputViewModel inputD = new NodeInputViewModel {
                Group = groupD, Name = "Input D"
            };
            NodeOutputViewModel outputD = new NodeOutputViewModel {
                Group = groupD, Name = "Output D"
            };

            node.Inputs.Add(inputC);
            node.Inputs.Add(inputD);
            node.Outputs.Add(outputC);
            node.Outputs.Add(outputD);

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleOutputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 2);

            EndpointGroupViewModel groupAViewModel = node.VisibleEndpointGroups[0];

            Assert.AreEqual(groupA, groupAViewModel.Group);
            Assert.IsTrue(groupAViewModel.VisibleInputs.Count == 0);
            Assert.IsTrue(groupAViewModel.VisibleOutputs.Count == 0);
            Assert.IsTrue(groupAViewModel.Children.Count == 1);
            EndpointGroupViewModel groupCViewModel = groupAViewModel.Children[0];

            Assert.AreEqual(groupC, groupCViewModel.Group);
            Assert.IsTrue(groupCViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputC, groupCViewModel.VisibleInputs.Items.First());
            Assert.IsTrue(groupCViewModel.VisibleOutputs.Count == 1);
            Assert.AreEqual(outputC, groupCViewModel.VisibleOutputs.Items.First());

            EndpointGroupViewModel groupBViewModel = node.VisibleEndpointGroups[1];

            Assert.AreEqual(groupB, groupBViewModel.Group);
            Assert.IsTrue(groupBViewModel.VisibleInputs.Count == 0);
            Assert.IsTrue(groupBViewModel.VisibleOutputs.Count == 0);
            Assert.IsTrue(groupBViewModel.Children.Count == 1);
            EndpointGroupViewModel groupDViewModel = groupBViewModel.Children[0];

            Assert.AreEqual(groupD, groupDViewModel.Group);
            Assert.IsTrue(groupDViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputD, groupDViewModel.VisibleInputs.Items.First());
            Assert.IsTrue(groupDViewModel.VisibleOutputs.Count == 1);
            Assert.AreEqual(outputD, groupDViewModel.VisibleOutputs.Items.First());

            node.Inputs.Remove(inputC);
            node.Outputs.Remove(outputC);

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleOutputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 1);

            groupBViewModel = node.VisibleEndpointGroups[0];
            Assert.AreEqual(groupB, groupBViewModel.Group);
            Assert.IsTrue(groupBViewModel.VisibleInputs.Count == 0);
            Assert.IsTrue(groupBViewModel.VisibleOutputs.Count == 0);
            Assert.IsTrue(groupBViewModel.Children.Count == 1);
            groupDViewModel = groupBViewModel.Children[0];
            Assert.AreEqual(groupD, groupDViewModel.Group);
            Assert.IsTrue(groupDViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputD, groupDViewModel.VisibleInputs.Items.First());
            Assert.IsTrue(groupDViewModel.VisibleOutputs.Count == 1);
            Assert.AreEqual(outputD, groupDViewModel.VisibleOutputs.Items.First());
        }
コード例 #3
0
        public void TestGroupedEndpoints()
        {
            NodeViewModel node = new NodeViewModel();

            EndpointGroup groupA = new EndpointGroup();
            EndpointGroup groupB = new EndpointGroup();

            NodeInputViewModel inputA1 = new NodeInputViewModel {
                Group = groupA
            };
            NodeInputViewModel inputA2 = new NodeInputViewModel {
                Group = groupA
            };
            NodeOutputViewModel outputA1 = new NodeOutputViewModel {
                Group = groupA
            };
            NodeOutputViewModel outputA2 = new NodeOutputViewModel {
                Group = groupA
            };

            NodeInputViewModel inputB1 = new NodeInputViewModel {
                Group = groupB
            };
            NodeInputViewModel inputB2 = new NodeInputViewModel {
                Group = groupB
            };
            NodeOutputViewModel outputB1 = new NodeOutputViewModel {
                Group = groupB
            };
            NodeOutputViewModel outputB2 = new NodeOutputViewModel {
                Group = groupB
            };

            node.Inputs.Add(inputB1);

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 1);
            EndpointGroupViewModel groupBViewModel = node.VisibleEndpointGroups[0];

            Assert.IsTrue(groupBViewModel.Group == groupB);
            Assert.IsTrue(groupBViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputB1, groupBViewModel.VisibleInputs.Items.First());

            node.Outputs.Add(outputB2);

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 1);
            groupBViewModel = node.VisibleEndpointGroups[0];
            Assert.IsTrue(groupBViewModel.Group == groupB);
            Assert.IsTrue(groupBViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputB1, groupBViewModel.VisibleInputs.Items.First());
            Assert.IsTrue(groupBViewModel.VisibleOutputs.Count == 1);
            Assert.AreEqual(outputB2, groupBViewModel.VisibleOutputs.Items.First());

            node.Inputs.AddRange(new [] { inputA1, inputB2, inputA2 });
            node.Outputs.AddRange(new [] { outputB1, outputA1, outputA2 });

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 2);
            groupBViewModel = node.VisibleEndpointGroups[0];
            Assert.IsTrue(groupBViewModel.Group == groupB);
            Assert.IsTrue(groupBViewModel.VisibleInputs.Count == 2);
            Assert.AreEqual(inputB1, groupBViewModel.VisibleInputs.Items.First());
            Assert.AreEqual(inputB2, groupBViewModel.VisibleInputs.Items.ElementAt(1));
            Assert.IsTrue(groupBViewModel.VisibleOutputs.Count == 2);
            Assert.AreEqual(outputB2, groupBViewModel.VisibleOutputs.Items.First());
            Assert.AreEqual(outputB1, groupBViewModel.VisibleOutputs.Items.ElementAt(1));

            EndpointGroupViewModel groupAViewModel = node.VisibleEndpointGroups[1];

            Assert.IsTrue(groupAViewModel.Group == groupA);
            Assert.IsTrue(groupAViewModel.VisibleInputs.Count == 2);
            Assert.AreEqual(inputA1, groupAViewModel.VisibleInputs.Items.First());
            Assert.AreEqual(inputA2, groupAViewModel.VisibleInputs.Items.ElementAt(1));
            Assert.IsTrue(groupAViewModel.VisibleOutputs.Count == 2);
            Assert.AreEqual(outputA1, groupAViewModel.VisibleOutputs.Items.First());
            Assert.AreEqual(outputA2, groupAViewModel.VisibleOutputs.Items.ElementAt(1));

            node.Inputs.Remove(inputB1);

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 2);
            groupBViewModel = node.VisibleEndpointGroups[0];
            Assert.IsTrue(groupBViewModel.Group == groupB);
            Assert.IsTrue(groupBViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputB2, groupBViewModel.VisibleInputs.Items.First());
            Assert.IsTrue(groupBViewModel.VisibleOutputs.Count == 2);
            Assert.AreEqual(outputB2, groupBViewModel.VisibleOutputs.Items.First());
            Assert.AreEqual(outputB1, groupBViewModel.VisibleOutputs.Items.ElementAt(1));

            groupAViewModel = node.VisibleEndpointGroups[1];
            Assert.IsTrue(groupAViewModel.Group == groupA);
            Assert.IsTrue(groupAViewModel.VisibleInputs.Count == 2);
            Assert.AreEqual(inputA1, groupAViewModel.VisibleInputs.Items.First());
            Assert.AreEqual(inputA2, groupAViewModel.VisibleInputs.Items.ElementAt(1));
            Assert.IsTrue(groupAViewModel.VisibleOutputs.Count == 2);
            Assert.AreEqual(outputA1, groupAViewModel.VisibleOutputs.Items.First());
            Assert.AreEqual(outputA2, groupAViewModel.VisibleOutputs.Items.ElementAt(1));

            node.Inputs.Remove(inputB2);
            node.Outputs.RemoveMany(new [] { outputB1, outputB1 });

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 1);

            groupAViewModel = node.VisibleEndpointGroups[0];
            Assert.IsTrue(groupAViewModel.Group == groupA);
            Assert.IsTrue(groupAViewModel.VisibleInputs.Count == 2);
            Assert.AreEqual(inputA1, groupAViewModel.VisibleInputs.Items.First());
            Assert.AreEqual(inputA2, groupAViewModel.VisibleInputs.Items.ElementAt(1));
            Assert.IsTrue(groupAViewModel.VisibleOutputs.Count == 2);
            Assert.AreEqual(outputA1, groupAViewModel.VisibleOutputs.Items.First());
            Assert.AreEqual(outputA2, groupAViewModel.VisibleOutputs.Items.ElementAt(1));
        }
コード例 #4
0
        public void TestCollapseWithGroups()
        {
            NodeViewModel node = new NodeViewModel();

            EndpointGroup groupA = new EndpointGroup {
                Name = "Group A"
            };
            EndpointGroup groupB = new EndpointGroup {
                Name = "Group B"
            };
            EndpointGroup groupC = new EndpointGroup(groupA)
            {
                Name = "Group C"
            };
            EndpointGroup groupD = new EndpointGroup(groupB)
            {
                Name = "Group D"
            };

            NodeInputViewModel inputC = new NodeInputViewModel {
                Group = groupC, Name = "Input C"
            };
            NodeOutputViewModel outputC = new NodeOutputViewModel {
                Group = groupC, Name = "Output C"
            };

            NodeInputViewModel inputD = new NodeInputViewModel {
                Group = groupD, Name = "Input D"
            };
            NodeOutputViewModel outputD = new NodeOutputViewModel {
                Group = groupD, Name = "Output D"
            };

            node.Inputs.Add(inputC);
            node.Inputs.Add(inputD);
            node.Outputs.Add(outputC);
            node.Outputs.Add(outputD);

            var network = new NetworkViewModel();

            network.Nodes.Add(node);
            network.Connections.Add(network.ConnectionFactory(inputC, new NodeOutputViewModel()));

            node.IsCollapsed = true;

            Assert.IsTrue(node.VisibleInputs.Count == 0);
            Assert.IsTrue(node.VisibleOutputs.Count == 0);
            Assert.IsTrue(node.VisibleEndpointGroups.Count == 1);

            EndpointGroupViewModel groupAViewModel = node.VisibleEndpointGroups[0];

            Assert.AreEqual(groupA, groupAViewModel.Group);
            Assert.IsTrue(groupAViewModel.VisibleInputs.Count == 0);
            Assert.IsTrue(groupAViewModel.VisibleOutputs.Count == 0);
            Assert.IsTrue(groupAViewModel.Children.Count == 1);
            EndpointGroupViewModel groupCViewModel = groupAViewModel.Children[0];

            Assert.AreEqual(groupC, groupCViewModel.Group);
            Assert.IsTrue(groupCViewModel.VisibleInputs.Count == 1);
            Assert.AreEqual(inputC, groupCViewModel.VisibleInputs.Items.First());
            Assert.IsTrue(groupCViewModel.VisibleOutputs.Count == 0);
        }