blob: 9bf3acf27da51e9349e5880084c750968a93dc08 [file] [log] [blame]
tom0633d682014-09-10 12:10:03 -07001package org.onlab.graph;
2
3import org.junit.Test;
4
5import static com.google.common.collect.ImmutableSet.of;
6import static org.junit.Assert.assertEquals;
7import static org.onlab.graph.TarjanGraphSearch.SCCResult;
8
9/**
10 * Tarjan graph search tests.
11 */
12public class TarjanGraphSearchTest extends GraphTest {
13
14 private void validate(SCCResult<TestVertex, TestEdge> result, int cc) {
15 System.out.println("Cluster count: " + result.clusterVertexes().size());
16 System.out.println("Clusters: " + result.clusterVertexes());
17 assertEquals("incorrect cluster count", cc, result.clusterCount());
18 }
19
20 private void validate(SCCResult<TestVertex, TestEdge> result,
21 int i, int vc, int ec) {
22 assertEquals("incorrect cluster count", vc, result.clusterVertexes().get(i).size());
23 assertEquals("incorrect edge count", ec, result.clusterEdges().get(i).size());
24 }
25
26 @Test
27 public void basic() {
28 graph = new AdjacencyListsGraph<>(vertexes(), edges());
29 TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
30 SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
31 validate(result, 6);
32 }
33
34 @Test
35 public void singleCluster() {
36 graph = new AdjacencyListsGraph<>(vertexes(),
37 of(new TestEdge(A, B, 1),
38 new TestEdge(B, C, 1),
39 new TestEdge(C, D, 1),
40 new TestEdge(D, E, 1),
41 new TestEdge(E, F, 1),
42 new TestEdge(F, G, 1),
43 new TestEdge(G, H, 1),
44 new TestEdge(H, A, 1)));
45
46 TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
47 SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
48 validate(result, 1);
49 validate(result, 0, 8, 8);
50 }
51
52 @Test
53 public void twoUnconnectedCluster() {
54 graph = new AdjacencyListsGraph<>(vertexes(),
55 of(new TestEdge(A, B, 1),
56 new TestEdge(B, C, 1),
57 new TestEdge(C, D, 1),
58 new TestEdge(D, A, 1),
59 new TestEdge(E, F, 1),
60 new TestEdge(F, G, 1),
61 new TestEdge(G, H, 1),
62 new TestEdge(H, E, 1)));
63 TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
64 SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
65 validate(result, 2);
66 validate(result, 0, 4, 4);
67 validate(result, 1, 4, 4);
68 }
69
70 @Test
71 public void twoWeaklyConnectedClusters() {
72 graph = new AdjacencyListsGraph<>(vertexes(),
73 of(new TestEdge(A, B, 1),
74 new TestEdge(B, C, 1),
75 new TestEdge(C, D, 1),
76 new TestEdge(D, A, 1),
77 new TestEdge(E, F, 1),
78 new TestEdge(F, G, 1),
79 new TestEdge(G, H, 1),
80 new TestEdge(H, E, 1),
81 new TestEdge(B, E, 1)));
82 TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
83 SCCResult<TestVertex, TestEdge> result = gs.search(graph, null);
84 validate(result, 2);
85 validate(result, 0, 4, 4);
86 validate(result, 1, 4, 4);
87 }
88
89 @Test
90 public void twoClustersConnectedWithIgnoredEdges() {
91 graph = new AdjacencyListsGraph<>(vertexes(),
92 of(new TestEdge(A, B, 1),
93 new TestEdge(B, C, 1),
94 new TestEdge(C, D, 1),
95 new TestEdge(D, A, 1),
96 new TestEdge(E, F, 1),
97 new TestEdge(F, G, 1),
98 new TestEdge(G, H, 1),
99 new TestEdge(H, E, 1),
100 new TestEdge(B, E, -1),
101 new TestEdge(E, B, -1)));
102
103 TarjanGraphSearch<TestVertex, TestEdge> gs = new TarjanGraphSearch<>();
104 SCCResult<TestVertex, TestEdge> result = gs.search(graph, weight);
105 validate(result, 2);
106 validate(result, 0, 4, 4);
107 validate(result, 1, 4, 4);
108 }
109
110}