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); } }
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()); }
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)); }
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); }