package edu.brown.graphs; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; import org.junit.Test; import org.voltdb.catalog.CatalogType; import edu.brown.graphs.VertexTreeWalker.Direction; import edu.brown.graphs.VertexTreeWalker.TraverseOrder; /** * @author pavlo */ public class TestVertexTreeWalker extends TestCase { public class MockVertex extends AbstractVertex { public final Integer id; public MockVertex(int id) { this.id = id; } @Override public <T extends CatalogType> T getCatalogItem() { return (null); } @Override public int hashCode() { return (this.id.hashCode()); } @Override public String toString() { return "[" + id.toString() + "]"; } } // CLASS public class MockEdge extends AbstractEdge { public final Integer id; public MockEdge(int id) { super(null); this.id = id; } @Override public int hashCode() { return (this.id.hashCode()); } @Override public String toString() { return "[" + id.toString() + "]"; } } // CLASS private AbstractDirectedGraph<MockVertex, MockEdge> graph; private MockVertex vertices[] = new MockVertex[7]; @Override protected void setUp() throws Exception { // Create a graph that looks like the following: // // [0] // / \ // [1] [2] // / \ | // [3] [4] [5] // | // [6] // this.graph = new AbstractDirectedGraph<MockVertex, MockEdge>(null) { private static final long serialVersionUID = 1L; }; for (int i = 0; i < vertices.length; i++) { this.vertices[i] = new MockVertex(i); this.graph.addVertex(this.vertices[i]); } // FOR int edge_id = 1; this.graph.addEdge(new MockEdge(edge_id++), vertices[0], vertices[1]); this.graph.addEdge(new MockEdge(edge_id++), vertices[0], vertices[2]); this.graph.addEdge(new MockEdge(edge_id++), vertices[1], vertices[3]); this.graph.addEdge(new MockEdge(edge_id++), vertices[1], vertices[4]); this.graph.addEdge(new MockEdge(edge_id++), vertices[2], vertices[5]); this.graph.addEdge(new MockEdge(edge_id++), vertices[3], vertices[6]); } private List<Integer> traverse(MockVertex v, TraverseOrder order, Direction direction) { final List<Integer> result = new ArrayList<Integer>(); new VertexTreeWalker<MockVertex, MockEdge>(this.graph, order, direction) { @Override protected void callback(MockVertex element) { result.add(element.id); } }.traverse(v); return (result); } /** * testReverseSearch */ @Test public void testReverseSearch() { final List<Integer> expected = Arrays.asList(6, 3, 1, 0); List<Integer> result = this.traverse(vertices[6], TraverseOrder.DEPTH, Direction.REVERSE); System.err.println("Longest Path Expected: " + expected); System.err.println("Longest Path Result: " + result); assertEquals(expected.size(), result.size()); for (int i = 0, cnt = expected.size(); i < cnt; i++) { assertEquals("[" + i + "]", expected.get(i), result.get(i)); } // FOR } /** * testBreadthFirstSearch */ @Test public void testBreadthFirstSearch() { final List<Integer> expected = Arrays.asList(0, 1, 2, 3, 4, 5, 6); assertEquals(this.vertices.length, expected.size()); final List<Integer> result = this.traverse(this.vertices[0], TraverseOrder.BREADTH, Direction.FORWARD); System.err.println("Breadth First Expected: " + expected); System.err.println("Breadth First Result: " + result); assertEquals(expected.size(), result.size()); for (int i = 0, cnt = expected.size(); i < cnt; i++) { assertEquals("[" + i + "]", expected.get(i), result.get(i)); } // FOR } /** * testDepthFirstSearch */ @Test public void testDepthFirstSearch() { final List<Integer> expected = Arrays.asList(0, 1, 3, 6, 4, 2, 5); assertEquals(this.vertices.length, expected.size()); final List<Integer> result = this.traverse(this.vertices[0], TraverseOrder.DEPTH, Direction.FORWARD); System.err.println("Depth First Expected: " + expected); System.err.println("Depth First Result: " + result); assertEquals(expected.size(), result.size()); for (int i = 0, cnt = expected.size(); i < cnt; i++) { assertEquals("[" + i + "]", expected.get(i), result.get(i)); } // FOR } }