public void MergedPath_Throws() { // ReSharper disable ReturnValueOfPureMethodIsNotUsed // ReSharper disable AssignNullToNotNullAttribute var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); Assert.Throws <ArgumentNullException>( () => recorder.MergedPath(null, new Dictionary <Edge <int>, GraphColor>())); Assert.Throws <ArgumentNullException>( () => recorder.MergedPath(new Edge <int>(1, 2), null)); Assert.Throws <ArgumentNullException>( () => recorder.MergedPath(null, null)); // ReSharper restore AssignNullToNotNullAttribute var edge = new Edge <int>(1, 2); Assert.Throws <KeyNotFoundException>( () => recorder.MergedPath(edge, new Dictionary <Edge <int>, GraphColor>())); // ReSharper restore ReturnValueOfPureMethodIsNotUsed }
public void MergedPath() { { var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); var graph = new AdjacencyGraph <int, Edge <int> >(); var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph); using (recorder.Attach(dfs)) { dfs.Compute(); var edge12 = new Edge <int>(1, 2); var colors = new Dictionary <Edge <int>, GraphColor> { [edge12] = GraphColor.Black }; // Not in the graph and edge marked as already used! CollectionAssert.IsEmpty(recorder.MergedPath(edge12, colors)); // Not in the graph => return the edge itself colors[edge12] = GraphColor.White; CollectionAssert.AreEqual( new[] { edge12 }, recorder.MergedPath(edge12, colors)); } } { var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); // Graph without cycle var edge12 = new Edge <int>(1, 2); var edge13 = new Edge <int>(1, 3); var edge14 = new Edge <int>(1, 4); var edge24 = new Edge <int>(2, 4); var edge31 = new Edge <int>(3, 1); var edge33 = new Edge <int>(3, 3); var edge34 = new Edge <int>(3, 4); var graph = new AdjacencyGraph <int, Edge <int> >(); graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33, edge34 }); var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph); using (recorder.Attach(dfs)) { dfs.Compute(); Dictionary <Edge <int>, GraphColor> colors = graph.Edges.ToDictionary( edge => edge, _ => GraphColor.White); CollectionAssert.AreEqual( new[] { edge12, edge24 }, recorder.MergedPath(edge24, colors)); // Already used CollectionAssert.IsEmpty(recorder.MergedPath(edge24, colors)); CollectionAssert.AreEqual( new[] { edge13, edge31 }, recorder.MergedPath(edge31, colors)); } } { var recorder = new EdgePredecessorRecorderObserver <int, Edge <int> >(); // Graph with cycle var edge12 = new Edge <int>(1, 2); var edge13 = new Edge <int>(1, 3); var edge14 = new Edge <int>(1, 4); var edge24 = new Edge <int>(2, 4); var edge31 = new Edge <int>(3, 1); var edge33 = new Edge <int>(3, 3); var edge34 = new Edge <int>(3, 4); var edge41 = new Edge <int>(4, 1); var graph = new AdjacencyGraph <int, Edge <int> >(); graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33, edge34, edge41 }); var dfs = new EdgeDepthFirstSearchAlgorithm <int, Edge <int> >(graph); using (recorder.Attach(dfs)) { dfs.Compute(); Dictionary <Edge <int>, GraphColor> colors = graph.Edges.ToDictionary( edge => edge, _ => GraphColor.White); CollectionAssert.AreEqual( new[] { edge12, edge24, edge41 }, recorder.MergedPath(edge41, colors)); // Already used CollectionAssert.IsEmpty(recorder.MergedPath(edge41, colors)); CollectionAssert.AreEqual( new[] { edge13, edge33, edge34 }, recorder.MergedPath(edge34, colors)); } } }