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