Exemple #1
0
        public void CanDisconnectAllTopologyNodes()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();
                var c = topoDB.CreateNode();

                for (int i = 0; i < 3; ++i)
                {
                    OutputPort outPort = k_OutputPorts[i];
                    InputPort  inPort  = k_InputPorts[i];

                    topoDB.Connect(b, outPort, a, inPort);
                    topoDB.Connect(c, outPort, b, inPort);

                    Assert.AreEqual(0, topoDB.GetOutputs(a)[outPort].Count());
                    Assert.AreEqual(1, topoDB.GetInputs(a)[inPort].Count());
                    Assert.AreEqual(1, topoDB.GetOutputs(b)[outPort].Count());
                    Assert.AreEqual(1, topoDB.GetInputs(b)[inPort].Count());
                    Assert.AreEqual(1, topoDB.GetOutputs(c)[outPort].Count());
                    Assert.AreEqual(0, topoDB.GetInputs(c)[inPort].Count());
                }

                topoDB.DisconnectAll(b);

                foreach (var node in new[] { a, b, c })
                {
                    var inputs         = topoDB.GetInputs(node);
                    var inputPortCount = inputs.GetEnumerator().Count();
                    for (int i = 0; i < inputPortCount; ++i)
                    {
                        Assert.AreEqual(0, inputs[k_InputPorts[i]].Count());
                    }

                    var outputs         = topoDB.GetOutputs(node);
                    var outputPortCount = outputs.GetEnumerator().Count();
                    for (int i = 0; i < outputPortCount; ++i)
                    {
                        Assert.AreEqual(0, outputs[k_OutputPorts[i]].Count());
                    }
                }
            }
        }
Exemple #2
0
        public void CanWalk_InputsAndOutputs_ForSinglyConnected()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();
                var c = topoDB.CreateNode();

                topoDB.Connect(b, k_OutputPorts[0], a, k_InputPorts[0]);
                topoDB.Connect(c, k_OutputPorts[0], a, k_InputPorts[2]);

                Assert.AreEqual(b, topoDB.GetInputs(a).GetNthConnection(k_InputPorts[0], 0));
                Assert.AreEqual(0, topoDB.GetInputs(a)[k_InputPorts[1]].Count());
                Assert.AreEqual(c, topoDB.GetInputs(a).GetNthConnection(k_InputPorts[2], 0));

                Assert.AreEqual(a, topoDB.GetOutputs(c).GetNthConnection(k_OutputPorts[0], 0));
                Assert.AreEqual(a, topoDB.GetOutputs(b).GetNthConnection(k_OutputPorts[0], 0));
            }
        }
Exemple #3
0
        public void CanCreateDirectedCyclicGraph_AndWalkInCircles()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();

                topoDB.Connect(a, k_OutputPorts[0], b, k_InputPorts[0]);
                topoDB.Connect(b, k_OutputPorts[0], a, k_InputPorts[0]);

                for (int i = 0; i < 100; ++i)
                {
                    var temp = topoDB.GetOutputs(a).GetNthConnection(k_OutputPorts[0], 0);
                    Assert.AreEqual(b, temp);
                    Assert.AreEqual(a, topoDB.GetInputs(b).GetNthConnection(k_InputPorts[0], 0));
                    b = a;
                    a = temp;
                }
            }
        }
Exemple #4
0
        [Test] public void CanWalk_InputsAndOutputs_ForDoublyConnectedInput()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();
                var c = topoDB.CreateNode();

                topoDB.Connect(b, k_OutputPorts[0], a, k_InputPorts[0]);
                topoDB.Connect(c, k_OutputPorts[0], a, k_InputPorts[0]);

                var filteredPorts = topoDB.GetInputs(a)[k_InputPorts[0]];

                foreach (var node in filteredPorts)
                {
                    Assert.That(node, Is.EqualTo(b).Or.EqualTo(c));
                }

                Assert.AreEqual(a, topoDB.GetOutputs(c).GetNthConnection(k_OutputPorts[0], 0));
                Assert.AreEqual(a, topoDB.GetOutputs(b).GetNthConnection(k_OutputPorts[0], 0));
            }
        }
Exemple #5
0
        public void CanWalkNodesThroughConnections()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();

                topoDB.Connect(a, k_OutputPorts[0], b, k_InputPorts[0]);

                Assert.AreEqual(b, topoDB.GetOutputs(a).GetNthConnection(k_OutputPorts[0], 0));
                Assert.AreEqual(a, topoDB.GetInputs(b).GetNthConnection(k_InputPorts[0], 0));
            }
        }
Exemple #6
0
        public void CanConnectTwoEdges_ToOnePort()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();
                var c = topoDB.CreateNode();

                topoDB.Connect(a, k_OutputPorts[0], b, k_InputPorts[0]);
                topoDB.Connect(a, k_OutputPorts[0], c, k_InputPorts[0]);

                // TODO: Fix: Topology is not stable with regards to insertion order.

                Assert.AreEqual(c, topoDB.GetOutputs(a).GetNthConnection(k_OutputPorts[0], 0));
                Assert.AreEqual(b, topoDB.GetOutputs(a).GetNthConnection(k_OutputPorts[0], 1));

                var byPort = topoDB.GetOutputs(a)[k_OutputPorts[0]];
                byPort.MoveNext();
                Assert.AreEqual(c, byPort.Current);
                byPort.MoveNext();
                Assert.AreEqual(b, byPort.Current);
            }
        }
Exemple #7
0
        public void CanChainWalk_ForwardsAndBackwards()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();
                var c = topoDB.CreateNode();

                topoDB.Connect(b, k_OutputPorts[0], a, k_InputPorts[0]);
                topoDB.Connect(c, k_OutputPorts[0], b, k_InputPorts[0]);

                Assert.AreEqual(
                    a,
                    topoDB.GetOutputs(topoDB.GetOutputs(c).GetNthConnection(k_OutputPorts[0], 0))
                    .GetNthConnection(k_OutputPorts[0], 0)
                    );

                Assert.AreEqual(
                    c,
                    topoDB.GetInputs(topoDB.GetInputs(a).GetNthConnection(k_InputPorts[0], 0))
                    .GetNthConnection(k_InputPorts[0], 0)
                    );
            }
        }
Exemple #8
0
        public void CanDisconnectTopologyNodes()
        {
            using (var topoDB = new TopologyTestDatabase(Allocator.Persistent))
            {
                var a = topoDB.CreateNode();
                var b = topoDB.CreateNode();

                Assert.AreEqual(0, topoDB.GetOutputs(a)[k_OutputPorts[0]].Count());
                Assert.AreEqual(0, topoDB.GetInputs(b)[k_InputPorts[0]].Count());

                topoDB.Connect(a, k_OutputPorts[0], b, k_InputPorts[0]);

                Assert.AreEqual(1, topoDB.GetOutputs(a)[k_OutputPorts[0]].Count());
                Assert.AreEqual(1, topoDB.GetInputs(b)[k_InputPorts[0]].Count());

                topoDB.Disconnect(a, k_OutputPorts[0], b, k_InputPorts[0]);

                Assert.AreEqual(0, topoDB.GetOutputs(a)[k_OutputPorts[0]].Count());
                Assert.AreEqual(0, topoDB.GetInputs(b)[k_InputPorts[0]].Count());
            }
        }
Exemple #9
0
            public void CreateTestDAG()
            {
                /*  DAG test diagram.
                 *  Flow from left to right.
                 *
                 *  A ---------------- B (1)
                 *  A -------- C ----- B (2)
                 *           /   \
                 *  A - B - B      C = C (3)
                 *           \   /
                 *  A -------- C ----- B (4)
                 *  A                    (5)
                 *
                 *  Contains nodes not connected anywhere.
                 *  Contains multiple children (tree), and multiple parents (DAG).
                 *  Contains multiple connected components.
                 *  Contains diamond.
                 *  Contains more than one connection between the same nodes.
                 *  Contains opportunities for batching, and executing paths in series.
                 *  Contains multiple connections from the same output.
                 */

                var Leaves = new Node[5];

                // Part (1) of the graph.
                Leaves[0] = CreateAndAddNewNode();
                var b1 = CreateAndAddNewNode();

                TestDatabase.Connect(Leaves[0], k_OutputOne, b1, k_InputOne);

                // Part (2) of the graph.
                Leaves[1] = CreateAndAddNewNode();
                var c2 = CreateAndAddNewNode();
                var b2 = CreateAndAddNewNode();

                TestDatabase.Connect(Leaves[1], k_OutputOne, c2, k_InputOne);
                TestDatabase.Connect(c2, k_OutputOne, b2, k_InputOne);

                // Part (4) of the graph.
                Leaves[3] = CreateAndAddNewNode();
                var c4 = CreateAndAddNewNode();
                var b4 = CreateAndAddNewNode();

                TestDatabase.Connect(Leaves[3], k_OutputOne, c4, k_InputOne);
                TestDatabase.Connect(c4, k_OutputOne, b4, k_InputOne);

                // Part (3) of the graph.
                Leaves[2] = CreateAndAddNewNode();
                var b3_1 = CreateAndAddNewNode();
                var b3_2 = CreateAndAddNewNode();
                var c3_1 = CreateAndAddNewNode();
                var c3_2 = CreateAndAddNewNode();

                TestDatabase.Connect(Leaves[2], k_OutputOne, b3_1, k_InputOne);
                TestDatabase.Connect(b3_1, k_OutputOne, b3_2, k_InputOne);
                TestDatabase.Connect(b3_2, k_OutputOne, c2, k_InputTwo);
                TestDatabase.Connect(b3_2, k_OutputOne, c4, k_InputTwo);

                TestDatabase.Connect(c2, k_OutputOne, c3_1, k_InputOne);
                TestDatabase.Connect(c4, k_OutputOne, c3_1, k_InputTwo);

                TestDatabase.Connect(c3_1, k_OutputOne, c3_2, k_InputOne);
                TestDatabase.Connect(c3_1, k_OutputOne, c3_2, k_InputTwo);

                // Part (5) of the graph.
                Leaves[4] = CreateAndAddNewNode();
            }