View Javadoc
1   package edu.uci.ics.jung.algorithms.metrics;
2   
3   import junit.framework.TestCase;
4   import edu.uci.ics.jung.algorithms.metrics.TriadicCensus;
5   import edu.uci.ics.jung.graph.DirectedGraph;
6   import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
7   
8   public class TestTriad extends TestCase {
9   
10  	public void testConfigurationFromPaper() {
11  		DirectedGraph<Character,Number> g = new DirectedSparseMultigraph<Character,Number>();
12  		char u = 'u';
13  		g.addVertex(u);
14  		char v = 'v';
15  		g.addVertex(v);
16  		char w = 'w';
17  		g.addVertex(w);
18  		g.addEdge(0, w, u);
19  		g.addEdge(1, u, v);
20  		g.addEdge(2, v, u);
21  
22  		assertEquals(35, TriadicCensus.<Character,Number>triCode(g, u, v, w));
23  		assertEquals(7, TriadicCensus.triType(35));
24  		assertEquals("111D", TriadicCensus.TRIAD_NAMES[7]);
25  
26  		assertEquals(7, TriadicCensus.triType(TriadicCensus.<Character,Number>triCode(g, u, w, v)));
27  		assertEquals(7, TriadicCensus.triType(TriadicCensus.<Character,Number>triCode(g, v, u, w)));
28  
29          long[] counts = TriadicCensus.getCounts(g);
30  
31  		for (int i = 1; i <= 16; i++) {
32  			if (i == 7) {
33                  assertEquals(1, counts[i]);
34  			} else {
35                  assertEquals(0, counts[i]);
36  			}
37  		}
38  	}
39  
40  	public void testFourVertexGraph() {
41  		// we'll set up a graph of
42  		// t->u
43  		// u->v
44  		// and that's it.
45  		// total count:
46  		// 2: 1(t, u, w)(u, v, w)
47  		// 6: 1(t, u, v)
48  		// 1: 1(u, v, w)
49  		DirectedGraph<Character,Number> g = new DirectedSparseMultigraph<Character,Number>();
50  		char u = 'u';
51  		g.addVertex(u);
52  		char v = 'v';
53  		g.addVertex(v);
54  		char w = 'w';
55  		g.addVertex(w);
56  		char t = 't';
57  		g.addVertex(t);
58  		
59  		g.addEdge(0, t, u );
60  		g.addEdge(1, u, v );
61  				
62          long[] counts = TriadicCensus.getCounts(g);
63  		for (int i = 1; i <= 16; i++) {
64  			if( i == 2 ) {
65                  assertEquals("On " + i, 2, counts[i]);              
66  			} else if (i == 6 || i == 1  ) {
67                  assertEquals("On " + i, 1, counts[i]);
68  			} else {
69                  assertEquals(0, counts[i]);
70  			}
71  		}
72  		
73  		// now let's tweak to 
74  		// t->u, u->v, v->t
75  		// w->u, v->w
76  		g.addEdge(2, v, t );
77  		g.addEdge(3, w, u );
78  		g.addEdge(4, v, w );
79  
80  		// that's two 030Cs. it's a 021D (v-t, v-w) and an 021U (t-u, w-u)
81          counts = TriadicCensus.getCounts(g);
82  
83  		for (int i = 1; i <= 16; i++) {
84  			if( i == 10 /* 030C */ ) {
85                  assertEquals("On " + i, 2, counts[i]);              
86  			} else if (i == 4 || i == 5  ) {
87                  assertEquals("On " + i, 1, counts[i]);
88  			} else {
89                  assertEquals("On " + i , 0, counts[i]);
90  			}
91  		}
92  	}
93  	
94  	public void testThreeDotsThreeDashes() {
95  		DirectedGraph<Character,Number> g = new DirectedSparseMultigraph<Character,Number>();
96  		char u = 'u';
97  		g.addVertex(u);
98  		char v = 'v';
99  		g.addVertex(v);
100 		char w = 'w';
101 		g.addVertex(w);
102 
103         long[] counts = TriadicCensus.getCounts(g);
104 
105 		for (int i = 1; i <= 16; i++) {
106 			if (i == 1) {
107                 assertEquals(1, counts[i]);
108 			} else {
109                 assertEquals(0, counts[i]);
110 			}
111 		}
112 
113 		g.addEdge(0, v, u);
114 		g.addEdge(1, u, v);
115 		g.addEdge(2, v, w);
116 		g.addEdge(3, w, v);
117 		g.addEdge(4, u, w);
118 		g.addEdge(5, w, u);
119 
120         counts = TriadicCensus.getCounts(g);
121 
122 		for (int i = 1; i <= 16; i++) {
123 			if (i == 16) {
124                 assertEquals(1, counts[i]);
125 			} else {
126                 assertEquals("Count on " + i + " failed", 0, counts[i]);
127 			}
128 		}
129 	}
130 
131 	/** **************Boring accounting for zero graphs*********** */
132 	public void testNull() {
133 		DirectedGraph<Character,Number> g = new DirectedSparseMultigraph<Character,Number>();
134         long[] counts = TriadicCensus.getCounts(g);
135 
136 		// t looks like a hashtable for the twelve keys
137 		for (int i = 1; i < TriadicCensus.MAX_TRIADS; i++) {
138             assertEquals("Empty Graph doesn't have count 0", 0, counts[i]);
139 		}
140 	}
141 
142 	public void testOneVertex() {
143 		DirectedGraph<Character,Number> g = new DirectedSparseMultigraph<Character,Number>();
144 		g.addVertex('u');
145         long[] counts = TriadicCensus.getCounts(g);
146 
147 		// t looks like a hashtable for the twelve keys
148 		for (int i = 1; i < TriadicCensus.MAX_TRIADS; i++) {
149             assertEquals("One vertex Graph doesn't have count 0", 0, counts[i]);
150 		}
151 	}
152 
153 	public void testTwoVertices() {
154 		DirectedGraph<Character,Number> g = new DirectedSparseMultigraph<Character,Number>();
155 		char v1, v2;
156 		g.addVertex(v1 = 'u');
157 		g.addVertex(v2 = 'v');
158 		g.addEdge(0, v1, v2);
159         long[] counts = TriadicCensus.getCounts(g);
160 
161 		// t looks like a hashtable for the twelve keys
162 		for (int i = 1; i < TriadicCensus.MAX_TRIADS; i++) {
163             assertEquals("Two vertex Graph doesn't have count 0", 0, counts[i]);
164 		}
165 	}
166 }