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