package uk.ac.rhul.cs.graph;
import org.junit.Test;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TarjanCutVertexFinderTest {
@Test
public void testSimple() {
Graph graph = GraphFactory.createFromEdgeList(
new int[] { 0, 1, 1, 3, 3, 4, 4, 6, 6, 5, 5, 3, 3, 2, 2, 0, 0, 3 });
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(1, cutVertices.size());
assertTrue(cutVertices.contains(3));
}
@Test
public void testSimpleRestricted() {
Graph graph = GraphFactory.createFromEdgeList(
new int[]{0, 1, 1, 3, 3, 4, 4, 6, 6, 5, 5, 3, 3, 2, 2, 0, 0, 3});
TarjanCutVertexFinder finder;
Set<Integer> cutVertices;
finder = new TarjanCutVertexFinder();
finder.setGraph(graph);
finder.restrictToSubgraph(new int[]{0, 1, 2, 3, 4});
cutVertices = finder.findCutVertices();
assertEquals(1, cutVertices.size());
assertTrue(cutVertices.contains(3));
finder = new TarjanCutVertexFinder();
finder.setGraph(graph);
finder.restrictToSubgraph(new int[]{0, 1, 3, 4, 6});
cutVertices = finder.findCutVertices();
assertEquals(2, cutVertices.size());
assertTrue(cutVertices.contains(3));
assertTrue(cutVertices.contains(4));
}
@Test
public void testSimple2() {
Graph graph = GraphFactory.createFromEdgeList(
new int[] { 0, 1, 1, 2, 2, 0, 0, 3, 3, 4 });
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(2, cutVertices.size());
assertTrue(cutVertices.contains(0));
assertTrue(cutVertices.contains(3));
}
@Test
public void testSimple2Permuted() {
Graph graph = GraphFactory.createFromEdgeList(
new int[] { 4, 3, 3, 2, 2, 4, 4, 1, 1, 0 });
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(2, cutVertices.size());
assertTrue(cutVertices.contains(1));
assertTrue(cutVertices.contains(4));
}
@Test
public void testSimple3() {
Graph graph = GraphFactory.createFromEdgeList(
new int[] { 0, 1, 1, 2, 2, 0, 1, 3, 3, 5, 5, 4, 4, 1, 1, 6 });
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(1, cutVertices.size());
assertTrue(cutVertices.contains(1));
}
@Test
public void testChain() {
Graph graph = GraphFactory.createFromEdgeList(new int[] { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5 });
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(4, cutVertices.size());
assertTrue(cutVertices.contains(1));
assertTrue(cutVertices.contains(2));
assertTrue(cutVertices.contains(3));
assertTrue(cutVertices.contains(4));
}
@Test
public void testRing() {
Graph graph = GraphFactory.createFromEdgeList(new int[]{0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 0});
assertTrue(findCutVertices(graph).isEmpty());
}
@Test
public void testFullGraph() {
Graph graph = GraphFactory.createFullGraph(5, false, false);
assertTrue(findCutVertices(graph).isEmpty());
}
@Test
public void testZachary() {
Graph graph = GraphFactory.createFamousGraph("zachary");
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(1, cutVertices.size());
assertTrue(cutVertices.contains(0));
}
@Test
public void testComplex1() {
Graph graph = GraphFactory.createFromEdgeList(new int[]{
0, 1, 0, 2, 0, 4, 0, 7, 1, 4, 1, 8, 1, 9, 3, 4, 3, 7, 4, 7,
5, 6, 5, 10, 6, 7, 6, 9, 6, 10, 7, 9
});
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(3, cutVertices.size());
assertTrue(cutVertices.contains(0));
assertTrue(cutVertices.contains(1));
assertTrue(cutVertices.contains(6));
}
@Test
public void testComplex2() {
Graph graph = GraphFactory.createFromEdgeList(new int[]{
0, 3, 0, 6, 1, 7, 1, 8, 2, 4, 2, 5, 2, 6, 2, 7, 3, 6, 4, 7, 6, 7, 7, 8
});
Set<Integer> cutVertices = findCutVertices(graph);
assertEquals(3, cutVertices.size());
assertTrue(cutVertices.contains(2));
assertTrue(cutVertices.contains(6));
assertTrue(cutVertices.contains(7));
}
private Set<Integer> findCutVertices(Graph graph) {
TarjanCutVertexFinder finder = new TarjanCutVertexFinder();
finder.setGraph(graph);
return finder.findCutVertices();
}
}