From a1fd257727eaac4c6a87ec3a51d9f7168f5ac52e Mon Sep 17 00:00:00 2001 From: dion Date: Wed, 1 Jan 2003 02:19:03 +0000 Subject: [PATCH] Clean up code/fix compile errors git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/sandbox/graph2/trunk@144633 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/graph/WeightedGraph.java | 134 +- .../algorithm/dataflow/DataFlowSolutions.java | 3 - .../graph/algorithm/search/CostSearch.java | 582 ++--- .../commons/graph/algorithm/search/DFS.java | 378 ++- .../graph/decorator/DDirectedGraph.java | 488 ++-- .../domain/dependency/DependencyGraph.java | 6 +- .../CircularDependencyException.java | 76 +- .../domain/statemachine/StateMachine.java | 13 +- .../exception/StateMachineException.java | 76 +- .../graph/domain/uml/ModelFactory.java | 188 +- .../graph/domain/uml/StateMachineFactory.java | 469 ++-- .../commons/graph/search/CostSearch.java | 12 +- .../org/apache/commons/graph/search/DFS.java | 2 - .../apache/commons/graph/DirGraphTest.java | 952 ++++---- .../org/apache/commons/graph/GraphTest.java | 2050 ++++++++--------- .../apache/commons/graph/UndirGraphTest.java | 754 +++--- .../dataflow/DataFlowSolutionsTest.java | 2 - .../graph/algorithm/path/AllPairsTest.java | 1131 +++++---- .../graph/algorithm/path/AllPathsTest.java | 980 ++++---- .../graph/decorator/TransposeTest.java | 6 - .../domain/dependency/DependencyTest.java | 538 ++--- 21 files changed, 4402 insertions(+), 4438 deletions(-) diff --git a/src/java/org/apache/commons/graph/WeightedGraph.java b/src/java/org/apache/commons/graph/WeightedGraph.java index a480917..64a78cf 100644 --- a/src/java/org/apache/commons/graph/WeightedGraph.java +++ b/src/java/org/apache/commons/graph/WeightedGraph.java @@ -1,68 +1,66 @@ -package org.apache.commons.graph; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -import java.util.Comparator; - -/** - * Description of the Interface - */ -public interface WeightedGraph extends Graph -{ - /** - * Gets the weight attribute of the WeightedGraph object - */ - public double getWeight(Edge e); -} +package org.apache.commons.graph; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Description of the Interface + */ +public interface WeightedGraph extends Graph +{ + /** + * Gets the weight attribute of the WeightedGraph object + */ + public double getWeight(Edge e); +} diff --git a/src/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java b/src/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java index d7cdbb2..85e7a67 100644 --- a/src/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java +++ b/src/java/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutions.java @@ -6,9 +6,6 @@ import java.util.HashMap; import java.util.Iterator; import org.apache.commons.graph.*; -import org.apache.commons.graph.exception.*; -import org.apache.commons.graph.domain.basic.*; - public class DataFlowSolutions { diff --git a/src/java/org/apache/commons/graph/algorithm/search/CostSearch.java b/src/java/org/apache/commons/graph/algorithm/search/CostSearch.java index e6c7d0e..63be7ed 100644 --- a/src/java/org/apache/commons/graph/algorithm/search/CostSearch.java +++ b/src/java/org/apache/commons/graph/algorithm/search/CostSearch.java @@ -1,291 +1,291 @@ -package org.apache.commons.graph.algorithm.search; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -/** - * This is a Cost searching algorithm. It will basically follow edges/paths with - * minimal cost first, and then go to the later costs. - */ - -import java.util.Set; -import java.util.Map; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - -import org.apache.commons.graph.*; - -import org.apache.commons.collections.*; - -/** - * Description of the Class - */ -public class CostSearch -{ - /** - * Description of the Class - */ - public class ComparableEdge - implements Edge, Comparable - { - private Edge e; - private double cost; - - /** - * Constructor for the ComparableEdge object - * - * @param e - * @param cost - */ - public ComparableEdge(Edge e, double cost) - { - this.e = e; - this.cost = cost; - } - - /** - * Gets the edge attribute of the ComparableEdge object - */ - public Edge getEdge() - { - return e; - } - - /** - * Gets the cost attribute of the ComparableEdge object - */ - public double getCost() - { - return cost; - } - - /** - * Description of the Method - */ - public int compareTo(Object o) - { - ComparableVertex cv = (ComparableVertex) o; - if (cv.cost > cost) - { - return 1; - } - if (cv.cost == cost) - { - return 0; - } - if (cv.cost < cost) - { - return -1; - } - return 0; - } - } - - /** - * Description of the Class - */ - public class ComparableVertex - implements Vertex, Comparable - { - private Vertex v; - private double cost; - - /** - * Constructor for the ComparableVertex object - * - * @param v - * @param cost - */ - public ComparableVertex(Vertex v, double cost) - { - this.v = v; - this.cost = cost; - } - - /** - * Description of the Method - */ - public int compareTo(Object o) - { - ComparableVertex cv = (ComparableVertex) o; - if (cv.cost > cost) - { - return 1; - } - if (cv.cost == cost) - { - return 0; - } - if (cv.cost < cost) - { - return -1; - } - return 0; - } - - /** - * Gets the vertex attribute of the ComparableVertex object - */ - public Vertex getVertex() - { - return v; - } - } - - private Map colors = new HashMap();// VERTEX X COLOR - private PriorityQueue tasks = null; - - private String WHITE = "white"; - private String BLACK = "black"; - private String GRAY = "gray"; - - /** - * Constructor for the CostSearch object - */ - public CostSearch() - { - tasks = new BinaryHeap(true); - } - - /** - * Constructor for the CostSearch object - * - * @param isMin - */ - public CostSearch(boolean isMin) - { - tasks = new BinaryHeap(isMin); - } - - /** - * Description of the Method - */ - public void visitVertex(WeightedGraph graph, - Vertex vertex, - double cost, - Visitor visitor) - { - colors.remove(vertex); - colors.put(vertex, GRAY); - - visitor.discoverVertex(vertex); - Iterator edges = graph.getEdges(vertex).iterator(); - while (edges.hasNext()) - { - Edge edge = (Edge) edges.next(); - - double edgeCost = graph.getWeight(edge); - ComparableEdge wEdge = - new ComparableEdge(edge, edgeCost + cost); - tasks.insert(wEdge); - } - - visitor.finishVertex(vertex); - colors.remove(vertex); - colors.put(vertex, BLACK); - } - - /** - * Description of the Method - */ - public void visitEdge(WeightedGraph graph, - Edge e, - double cost, - Visitor visitor) - { - visitor.discoverEdge(e); - - Iterator vertices = graph.getVertices(e).iterator(); - while (vertices.hasNext()) - { - Vertex v = (Vertex) vertices.next(); - if (colors.get(v) == WHITE) - { - visitVertex(graph, v, cost, visitor); - } - } - - visitor.finishEdge(e); - } - - - /** - * Description of the Method - */ - public void visit(WeightedGraph graph, - Vertex root, - Visitor visitor) - { - Iterator vertices = graph.getVertices().iterator(); - while (vertices.hasNext()) - { - colors.put(vertices.next(), WHITE); - } - - visitor.discoverGraph(graph); - - visitVertex(graph, root, 0.0, visitor); - - while (!tasks.isEmpty()) - { - ComparableEdge wEdge = (ComparableEdge) tasks.pop(); - visitEdge(graph, wEdge.getEdge(), wEdge.getCost(), visitor); - } - - visitor.finishGraph(graph); - } -} - - +package org.apache.commons.graph.algorithm.search; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * This is a Cost searching algorithm. It will basically follow edges/paths with + * minimal cost first, and then go to the later costs. + */ + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.collections.BinaryHeap; +import org.apache.commons.collections.PriorityQueue; +import org.apache.commons.graph.Edge; +import org.apache.commons.graph.Vertex; +import org.apache.commons.graph.WeightedGraph; + +/** + * Description of the Class + */ +public class CostSearch +{ + /** + * Description of the Class + */ + public class ComparableEdge + implements Edge, Comparable + { + private Edge e; + private double cost; + + /** + * Constructor for the ComparableEdge object + * + * @param e + * @param cost + */ + public ComparableEdge(Edge e, double cost) + { + this.e = e; + this.cost = cost; + } + + /** + * Gets the edge attribute of the ComparableEdge object + */ + public Edge getEdge() + { + return e; + } + + /** + * Gets the cost attribute of the ComparableEdge object + */ + public double getCost() + { + return cost; + } + + /** + * Description of the Method + */ + public int compareTo(Object o) + { + ComparableVertex cv = (ComparableVertex) o; + if (cv.cost > cost) + { + return 1; + } + if (cv.cost == cost) + { + return 0; + } + if (cv.cost < cost) + { + return -1; + } + return 0; + } + } + + /** + * Description of the Class + */ + public class ComparableVertex + implements Vertex, Comparable + { + private Vertex v; + private double cost; + + /** + * Constructor for the ComparableVertex object + * + * @param v + * @param cost + */ + public ComparableVertex(Vertex v, double cost) + { + this.v = v; + this.cost = cost; + } + + /** + * Description of the Method + */ + public int compareTo(Object o) + { + ComparableVertex cv = (ComparableVertex) o; + if (cv.cost > cost) + { + return 1; + } + if (cv.cost == cost) + { + return 0; + } + if (cv.cost < cost) + { + return -1; + } + return 0; + } + + /** + * Gets the vertex attribute of the ComparableVertex object + */ + public Vertex getVertex() + { + return v; + } + } + + private Map colors = new HashMap();// VERTEX X COLOR + private PriorityQueue tasks = null; + + private String WHITE = "white"; + private String BLACK = "black"; + private String GRAY = "gray"; + + /** + * Constructor for the CostSearch object + */ + public CostSearch() + { + tasks = new BinaryHeap(true); + } + + /** + * Constructor for the CostSearch object + * + * @param isMin + */ + public CostSearch(boolean isMin) + { + tasks = new BinaryHeap(isMin); + } + + /** + * Description of the Method + */ + public void visitVertex(WeightedGraph graph, + Vertex vertex, + double cost, + Visitor visitor) + { + colors.remove(vertex); + colors.put(vertex, GRAY); + + visitor.discoverVertex(vertex); + Iterator edges = graph.getEdges(vertex).iterator(); + while (edges.hasNext()) + { + Edge edge = (Edge) edges.next(); + + double edgeCost = graph.getWeight(edge); + ComparableEdge wEdge = + new ComparableEdge(edge, edgeCost + cost); + tasks.insert(wEdge); + } + + visitor.finishVertex(vertex); + colors.remove(vertex); + colors.put(vertex, BLACK); + } + + /** + * Description of the Method + */ + public void visitEdge(WeightedGraph graph, + Edge e, + double cost, + Visitor visitor) + { + visitor.discoverEdge(e); + + Iterator vertices = graph.getVertices(e).iterator(); + while (vertices.hasNext()) + { + Vertex v = (Vertex) vertices.next(); + if (colors.get(v) == WHITE) + { + visitVertex(graph, v, cost, visitor); + } + } + + visitor.finishEdge(e); + } + + + /** + * Description of the Method + */ + public void visit(WeightedGraph graph, + Vertex root, + Visitor visitor) + { + Iterator vertices = graph.getVertices().iterator(); + while (vertices.hasNext()) + { + colors.put(vertices.next(), WHITE); + } + + visitor.discoverGraph(graph); + + visitVertex(graph, root, 0.0, visitor); + + while (!tasks.isEmpty()) + { + ComparableEdge wEdge = (ComparableEdge) tasks.pop(); + visitEdge(graph, wEdge.getEdge(), wEdge.getCost(), visitor); + } + + visitor.finishGraph(graph); + } +} + + diff --git a/src/java/org/apache/commons/graph/algorithm/search/DFS.java b/src/java/org/apache/commons/graph/algorithm/search/DFS.java index f52cc25..8fccbc2 100644 --- a/src/java/org/apache/commons/graph/algorithm/search/DFS.java +++ b/src/java/org/apache/commons/graph/algorithm/search/DFS.java @@ -1,190 +1,188 @@ -package org.apache.commons.graph.algorithm.search; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -/** - * This class does a Depth First Search. It visits all of the children nodes - * before moving to the siblling nodes. - */ - -import java.util.Set; -import java.util.Map; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; - -import org.apache.commons.graph.*; - -/** - * Description of the Class - */ -public class DFS -{ - private Map colors = new HashMap();// VERTEX X COLOR - /** - * Description of the Field - */ - public final static String WHITE = "white"; - /** - * Description of the Field - */ - public final static String BLACK = "black"; - /** - * Description of the Field - */ - public final static String GRAY = "gray"; - - /** - * Constructor for the DFS object - */ - public DFS() { } - - /** - * Gets the color attribute of the DFS object - */ - public String getColor(Vertex v) - { - return (String) colors.get(v); - } - - - /** - * Description of the Method - */ - private void visitEdge(DirectedGraph graph, - Edge e, - Visitor visitor) - { - visitor.discoverEdge(e); - - Vertex v = graph.getTarget(e); - - if (colors.get(v) == WHITE) - { - visitVertex(graph, v, visitor); - } - - visitor.finishEdge(e); - } - - /** - * Description of the Method - */ - private void visitVertex(DirectedGraph graph, - Vertex v, - Visitor visitor) - { - colors.remove(v); - colors.put(v, GRAY); - - visitor.discoverVertex(v); - - Iterator edges = graph.getOutbound(v).iterator(); - while (edges.hasNext()) - { - Edge e = (Edge) edges.next(); - visitEdge(graph, e, visitor); - } - - visitor.finishVertex(v); - - colors.remove(v); - colors.put(v, BLACK); - } - - /** - * visit - Visits the graph - */ - public void visit(DirectedGraph graph, - Vertex root, - Visitor visitor) - { - Iterator vertices = graph.getVertices().iterator(); - while (vertices.hasNext()) - { - colors.put(vertices.next(), WHITE); - } - - visitor.discoverGraph(graph); - - visitVertex(graph, root, visitor); - - visitor.finishGraph(graph); - } - - /** - * visit - Visits all nodes in the graph. - */ - public void visit( DirectedGraph graph, Visitor visitor ) { - Iterator vertices = graph.getVertices().iterator(); - while (vertices.hasNext()) { - colors.put( vertices.next(), WHITE ); - } - - visitor.discoverGraph( graph ); - - vertices = graph.getVertices().iterator(); - while (vertices.hasNext()) { - Vertex v = (Vertex) vertices.next(); - - if (colors.get( v ) == WHITE) { - visitVertex( graph, v, visitor ); - } - } - - visitor.finishGraph( graph ); - } -} - +package org.apache.commons.graph.algorithm.search; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * This class does a Depth First Search. It visits all of the children nodes + * before moving to the siblling nodes. + */ + +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; + +import org.apache.commons.graph.*; + +/** + * Description of the Class + */ +public class DFS +{ + private Map colors = new HashMap();// VERTEX X COLOR + /** + * Description of the Field + */ + public final static String WHITE = "white"; + /** + * Description of the Field + */ + public final static String BLACK = "black"; + /** + * Description of the Field + */ + public final static String GRAY = "gray"; + + /** + * Constructor for the DFS object + */ + public DFS() { } + + /** + * Gets the color attribute of the DFS object + */ + public String getColor(Vertex v) + { + return (String) colors.get(v); + } + + + /** + * Description of the Method + */ + private void visitEdge(DirectedGraph graph, + Edge e, + Visitor visitor) + { + visitor.discoverEdge(e); + + Vertex v = graph.getTarget(e); + + if (colors.get(v) == WHITE) + { + visitVertex(graph, v, visitor); + } + + visitor.finishEdge(e); + } + + /** + * Description of the Method + */ + private void visitVertex(DirectedGraph graph, + Vertex v, + Visitor visitor) + { + colors.remove(v); + colors.put(v, GRAY); + + visitor.discoverVertex(v); + + Iterator edges = graph.getOutbound(v).iterator(); + while (edges.hasNext()) + { + Edge e = (Edge) edges.next(); + visitEdge(graph, e, visitor); + } + + visitor.finishVertex(v); + + colors.remove(v); + colors.put(v, BLACK); + } + + /** + * visit - Visits the graph + */ + public void visit(DirectedGraph graph, + Vertex root, + Visitor visitor) + { + Iterator vertices = graph.getVertices().iterator(); + while (vertices.hasNext()) + { + colors.put(vertices.next(), WHITE); + } + + visitor.discoverGraph(graph); + + visitVertex(graph, root, visitor); + + visitor.finishGraph(graph); + } + + /** + * visit - Visits all nodes in the graph. + */ + public void visit( DirectedGraph graph, Visitor visitor ) { + Iterator vertices = graph.getVertices().iterator(); + while (vertices.hasNext()) { + colors.put( vertices.next(), WHITE ); + } + + visitor.discoverGraph( graph ); + + vertices = graph.getVertices().iterator(); + while (vertices.hasNext()) { + Vertex v = (Vertex) vertices.next(); + + if (colors.get( v ) == WHITE) { + visitVertex( graph, v, visitor ); + } + } + + visitor.finishGraph( graph ); + } +} + diff --git a/src/java/org/apache/commons/graph/decorator/DDirectedGraph.java b/src/java/org/apache/commons/graph/decorator/DDirectedGraph.java index 647487a..62faaa0 100644 --- a/src/java/org/apache/commons/graph/decorator/DDirectedGraph.java +++ b/src/java/org/apache/commons/graph/decorator/DDirectedGraph.java @@ -1,242 +1,246 @@ -package org.apache.commons.graph.decorator; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -import java.util.Set; -import java.util.Map; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; - -import org.apache.commons.graph.*; -import org.apache.commons.graph.exception.*; -import org.apache.commons.graph.domain.basic.*; -import org.apache.commons.graph.algorithm.path.*; -import org.apache.commons.graph.algorithm.spanning.*; - -/** - * Description of the Class - */ -public class DDirectedGraph - extends DirectedGraphWrapper - implements DirectedGraph, - WeightedGraph -{ - private WeightedGraph weighted; - private Map weights = new HashMap();// EDGE X DOUBLE - private static Map decoratedGraphs = new HashMap();// DGRAPH X DDGRAPH - private AllPairsShortestPath allPaths = null; - - protected DDirectedGraph() { - super(); - } - - /** - * Constructor for the DDirectedGraph object - * - * @param impl - */ - protected DDirectedGraph(DirectedGraph impl) - { - super(impl); - - if (impl instanceof WeightedGraph) - { - weighted = (WeightedGraph) impl; - } - } - - /** - * Description of the Method - */ - public static DDirectedGraph decorateGraph(DirectedGraph graph) - { - if (graph instanceof DDirectedGraph) - { - return (DDirectedGraph) graph; - } - - if (decoratedGraphs.containsKey(graph)) - { - return (DDirectedGraph) decoratedGraphs.get(graph); - } - - DDirectedGraph RC = new DDirectedGraph(graph); - decoratedGraphs.put(graph, RC); - return RC; - } - - // WeightedGraph Implementation - /** - * Gets the weight attribute of the DDirectedGraph object - */ - public double getWeight(Edge e) - { - if (weighted != null) - { - return weighted.getWeight(e); - } - else - { - if (weights.containsKey(e)) - { - return ((Double) weights.get(e)).doubleValue(); - } - else - { - return 1.0; - } - } - } - - /** - * Sets the weight attribute of the DDirectedGraph object - */ - public void setWeight(Edge e, double value) - throws GraphException - { - if (weighted != null) - { - throw new GraphException("Unable to set weight."); - } - - weights.put(e, new Double(value)); - } - - /** - * Description of the Method - */ - public DirectedGraph transpose() - throws GraphException - { - try - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - Set vertexSet = getVertices(); - Set edgeSet = getEdges(); - - Iterator vertices = vertexSet.iterator(); - while (vertices.hasNext()) - { - RC.addVertex((Vertex) vertices.next()); - } - - Iterator edges = edgeSet.iterator(); - while (edges.hasNext()) - { - Edge edge = (Edge) edges.next(); - - RC.addEdge(edge, - getTarget(edge), - getSource(edge)); - } - - return RC; - } - catch (GraphException e) - { - throw e; - } - catch (Exception e) - { - throw new GraphException(e); - } - } - - /** - * Description of the Method - */ - public boolean hasConnection(Vertex start, Vertex end) - throws GraphException - { - if (start == end) - { - return true; - } - - try - { - if (allPaths == null) - { - allPaths = new AllPairsShortestPath(this); - } - else - { - allPaths.update(this); - } - - WeightedPath path = - allPaths.getShortestPath(start, end); - } - catch (GraphException ex) - { - return false; - } - - return true; - } - - public MinimumSpanningForest minimumSpanningForest() { - return new MinimumSpanningForest( this ); - } - - public MinimumSpanningForest maximumSpanningForest() { - return new MinimumSpanningForest( false, this ); - } - -} - - - - +package org.apache.commons.graph.decorator; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.graph.DirectedGraph; +import org.apache.commons.graph.Edge; +import org.apache.commons.graph.Vertex; +import org.apache.commons.graph.WeightedGraph; +import org.apache.commons.graph.WeightedPath; +import org.apache.commons.graph.algorithm.path.AllPairsShortestPath; +import org.apache.commons.graph.algorithm.spanning.MinimumSpanningForest; +import org.apache.commons.graph.domain.basic.DirectedGraphImpl; +import org.apache.commons.graph.domain.basic.DirectedGraphWrapper; +import org.apache.commons.graph.exception.GraphException; + +/** + * Description of the Class + */ +public class DDirectedGraph + extends DirectedGraphWrapper + implements DirectedGraph, + WeightedGraph +{ + private WeightedGraph weighted; + private Map weights = new HashMap();// EDGE X DOUBLE + private static Map decoratedGraphs = new HashMap();// DGRAPH X DDGRAPH + private AllPairsShortestPath allPaths = null; + + protected DDirectedGraph() { + super(); + } + + /** + * Constructor for the DDirectedGraph object + * + * @param impl + */ + protected DDirectedGraph(DirectedGraph impl) + { + super(impl); + + if (impl instanceof WeightedGraph) + { + weighted = (WeightedGraph) impl; + } + } + + /** + * Description of the Method + */ + public static DDirectedGraph decorateGraph(DirectedGraph graph) + { + if (graph instanceof DDirectedGraph) + { + return (DDirectedGraph) graph; + } + + if (decoratedGraphs.containsKey(graph)) + { + return (DDirectedGraph) decoratedGraphs.get(graph); + } + + DDirectedGraph RC = new DDirectedGraph(graph); + decoratedGraphs.put(graph, RC); + return RC; + } + + // WeightedGraph Implementation + /** + * Gets the weight attribute of the DDirectedGraph object + */ + public double getWeight(Edge e) + { + if (weighted != null) + { + return weighted.getWeight(e); + } + else + { + if (weights.containsKey(e)) + { + return ((Double) weights.get(e)).doubleValue(); + } + else + { + return 1.0; + } + } + } + + /** + * Sets the weight attribute of the DDirectedGraph object + */ + public void setWeight(Edge e, double value) + throws GraphException + { + if (weighted != null) + { + throw new GraphException("Unable to set weight."); + } + + weights.put(e, new Double(value)); + } + + /** + * Description of the Method + */ + public DirectedGraph transpose() + throws GraphException + { + try + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + Set vertexSet = getVertices(); + Set edgeSet = getEdges(); + + Iterator vertices = vertexSet.iterator(); + while (vertices.hasNext()) + { + RC.addVertex((Vertex) vertices.next()); + } + + Iterator edges = edgeSet.iterator(); + while (edges.hasNext()) + { + Edge edge = (Edge) edges.next(); + + RC.addEdge(edge, + getTarget(edge), + getSource(edge)); + } + + return RC; + } + catch (GraphException e) + { + throw e; + } + catch (Exception e) + { + throw new GraphException(e); + } + } + + /** + * Description of the Method + */ + public boolean hasConnection(Vertex start, Vertex end) + throws GraphException + { + if (start == end) + { + return true; + } + + try + { + if (allPaths == null) + { + allPaths = new AllPairsShortestPath(this); + } + else + { + allPaths.update(this); + } + + WeightedPath path = + allPaths.getShortestPath(start, end); + } + catch (GraphException ex) + { + return false; + } + + return true; + } + + public MinimumSpanningForest minimumSpanningForest() { + return new MinimumSpanningForest( this ); + } + + public MinimumSpanningForest maximumSpanningForest() { + return new MinimumSpanningForest( false, this ); + } + +} + + + + diff --git a/src/java/org/apache/commons/graph/domain/dependency/DependencyGraph.java b/src/java/org/apache/commons/graph/domain/dependency/DependencyGraph.java index e22f61b..d8a8f33 100644 --- a/src/java/org/apache/commons/graph/domain/dependency/DependencyGraph.java +++ b/src/java/org/apache/commons/graph/domain/dependency/DependencyGraph.java @@ -3,19 +3,15 @@ package org.apache.commons.graph.domain.dependency; import org.apache.commons.graph.*; import org.apache.commons.graph.contract.*; import org.apache.commons.graph.exception.*; -import org.apache.commons.graph.domain.basic.*; import org.apache.commons.graph.factory.GraphFactory; import org.apache.commons.graph.decorator.DDirectedGraph; -import org.apache.commons.graph.dependency.exception.*; +import org.apache.commons.graph.domain.dependency.exception.CircularDependencyException; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; /** * Description of the Class diff --git a/src/java/org/apache/commons/graph/domain/dependency/exception/CircularDependencyException.java b/src/java/org/apache/commons/graph/domain/dependency/exception/CircularDependencyException.java index dc7e077..e5dec59 100644 --- a/src/java/org/apache/commons/graph/domain/dependency/exception/CircularDependencyException.java +++ b/src/java/org/apache/commons/graph/domain/dependency/exception/CircularDependencyException.java @@ -1,38 +1,38 @@ -package org.apache.commons.graph.dependency.exception; - -import org.apache.commons.graph.exception.*; - -/** - * Description of the Class - */ -public class CircularDependencyException - extends CycleException -{ - /** - * Constructor for the CircularDependencyException object - */ - public CircularDependencyException() - { - super(); - } - - /** - * Constructor for the CircularDependencyException object - * - * @param msg - */ - public CircularDependencyException(String msg) - { - super(msg); - } - - /** - * Constructor for the CircularDependencyException object - * - * @param cause - */ - public CircularDependencyException(Throwable cause) - { - super(cause); - } -} +package org.apache.commons.graph.domain.dependency.exception; + +import org.apache.commons.graph.exception.*; + +/** + * Description of the Class + */ +public class CircularDependencyException + extends CycleException +{ + /** + * Constructor for the CircularDependencyException object + */ + public CircularDependencyException() + { + super(); + } + + /** + * Constructor for the CircularDependencyException object + * + * @param msg + */ + public CircularDependencyException(String msg) + { + super(msg); + } + + /** + * Constructor for the CircularDependencyException object + * + * @param cause + */ + public CircularDependencyException(Throwable cause) + { + super(cause); + } +} diff --git a/src/java/org/apache/commons/graph/domain/statemachine/StateMachine.java b/src/java/org/apache/commons/graph/domain/statemachine/StateMachine.java index 60c83a9..d739947 100644 --- a/src/java/org/apache/commons/graph/domain/statemachine/StateMachine.java +++ b/src/java/org/apache/commons/graph/domain/statemachine/StateMachine.java @@ -1,18 +1,15 @@ package org.apache.commons.graph.domain.statemachine; -import java.util.Map; -import java.util.Set; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; +import java.util.Map; +import java.util.Set; -import org.apache.commons.graph.*; -import org.apache.commons.graph.exception.*; -import org.apache.commons.graph.domain.basic.*; +import org.apache.commons.graph.MutableDirectedGraph; import org.apache.commons.graph.contract.Contract; -import org.apache.commons.graph.factory.GraphFactory; import org.apache.commons.graph.decorator.DDirectedGraph; -import org.apache.commons.graph.domain.statemachine.exception.*; +import org.apache.commons.graph.exception.GraphException; +import org.apache.commons.graph.factory.GraphFactory; /** * StateMachine - diff --git a/src/java/org/apache/commons/graph/domain/statemachine/exception/StateMachineException.java b/src/java/org/apache/commons/graph/domain/statemachine/exception/StateMachineException.java index 83a3263..958e908 100644 --- a/src/java/org/apache/commons/graph/domain/statemachine/exception/StateMachineException.java +++ b/src/java/org/apache/commons/graph/domain/statemachine/exception/StateMachineException.java @@ -1,38 +1,38 @@ -package org.apache.commons.graph.statemachine.exception; - -import org.apache.commons.graph.exception.*; - -/** - * Description of the Class - */ -public class StateMachineException - extends GraphException -{ - /** - * Constructor for the StateMachineException object - */ - public StateMachineException() - { - super(); - } - - /** - * Constructor for the StateMachineException object - * - * @param msg - */ - public StateMachineException(String msg) - { - super(msg); - } - - /** - * Constructor for the StateMachineException object - * - * @param t - */ - public StateMachineException(Throwable t) - { - super(t); - } -} +package org.apache.commons.graph.domain.statemachine.exception; + +import org.apache.commons.graph.exception.GraphException; + +/** + * Description of the Class + */ +public class StateMachineException + extends GraphException +{ + /** + * Constructor for the StateMachineException object + */ + public StateMachineException() + { + super(); + } + + /** + * Constructor for the StateMachineException object + * + * @param msg + */ + public StateMachineException(String msg) + { + super(msg); + } + + /** + * Constructor for the StateMachineException object + * + * @param t + */ + public StateMachineException(Throwable t) + { + super(t); + } +} diff --git a/src/java/org/apache/commons/graph/domain/uml/ModelFactory.java b/src/java/org/apache/commons/graph/domain/uml/ModelFactory.java index 73f372f..6cb2c14 100644 --- a/src/java/org/apache/commons/graph/domain/uml/ModelFactory.java +++ b/src/java/org/apache/commons/graph/domain/uml/ModelFactory.java @@ -1,96 +1,92 @@ -package org.apache.commons.graph.domain.uml; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; - -import java.util.Enumeration; - -import java.util.zip.*; - -import org.xml.sax.InputSource; - -import org.apache.commons.graph.domain.uml.exception.*; - -import org.apache.log4j.Category; - -import ru.novosoft.uml.xmi.XMIReader; -import ru.novosoft.uml.model_management.MModel; - -/** - * Description of the Class - */ -public class ModelFactory -{ - private XMIReader xmiReader = null; - private final static String xmiVersion = "1.1"; - private static Category log = - Category.getInstance(org.apache.commons.graph.domain.uml.ModelFactory.class); - - /** - * Constructor for the ModelFactory object - * - * @exception Exception - */ - public ModelFactory() - throws Exception - { - log.debug("ModelFactory.__init__()"); - try - { - xmiReader = new XMIReader(); - } - catch (Exception e) - { - log.error(e); - throw e; - } - } - - /** - * Gets the fromStream attribute of the ModelFactory object - */ - public MModel getFromStream(InputStream stream) - { - log.debug("getFromStream"); - return xmiReader.parse(new InputSource(stream)); - } - - /** - * Gets the fromXMI attribute of the ModelFactory object - */ - public MModel getFromXMI(File xmiFile) - throws IOException - { - log.debug("getFromXMI(" + xmiFile.getName() + ")"); - return getFromStream(new FileInputStream(xmiFile)); - } - - /** - * Gets the fromZargo attribute of the ModelFactory object - */ - public MModel getFromZargo(File zargoFile) - throws IOException - { - log.debug("getFromZargo(" + zargoFile.getName() + ")"); - MModel RC = null; - - ZipFile zargoZip = new ZipFile(zargoFile); - - Enumeration entries = zargoZip.entries(); - while (entries.hasMoreElements()) - { - ZipEntry entry = (ZipEntry) entries.nextElement(); - - if (entry.getName().endsWith(".xmi")) - { - log.debug("Zargo Entry: " + entry.getName()); - return getFromStream(zargoZip.getInputStream(entry)); - } - } - throw new FileNotFoundException(); - } - -} +package org.apache.commons.graph.domain.uml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.apache.log4j.Category; +import org.xml.sax.InputSource; + +import ru.novosoft.uml.model_management.MModel; +import ru.novosoft.uml.xmi.XMIReader; + +/** + * Description of the Class + */ +public class ModelFactory +{ + private XMIReader xmiReader = null; + private final static String xmiVersion = "1.1"; + private static Category log = + Category.getInstance(org.apache.commons.graph.domain.uml.ModelFactory.class); + + /** + * Constructor for the ModelFactory object + * + * @exception Exception + */ + public ModelFactory() + throws Exception + { + log.debug("ModelFactory.__init__()"); + try + { + xmiReader = new XMIReader(); + } + catch (Exception e) + { + log.error(e); + throw e; + } + } + + /** + * Gets the fromStream attribute of the ModelFactory object + */ + public MModel getFromStream(InputStream stream) + { + log.debug("getFromStream"); + return xmiReader.parse(new InputSource(stream)); + } + + /** + * Gets the fromXMI attribute of the ModelFactory object + */ + public MModel getFromXMI(File xmiFile) + throws IOException + { + log.debug("getFromXMI(" + xmiFile.getName() + ")"); + return getFromStream(new FileInputStream(xmiFile)); + } + + /** + * Gets the fromZargo attribute of the ModelFactory object + */ + public MModel getFromZargo(File zargoFile) + throws IOException + { + log.debug("getFromZargo(" + zargoFile.getName() + ")"); + MModel RC = null; + + ZipFile zargoZip = new ZipFile(zargoFile); + + Enumeration entries = zargoZip.entries(); + while (entries.hasMoreElements()) + { + ZipEntry entry = (ZipEntry) entries.nextElement(); + + if (entry.getName().endsWith(".xmi")) + { + log.debug("Zargo Entry: " + entry.getName()); + return getFromStream(zargoZip.getInputStream(entry)); + } + } + throw new FileNotFoundException(); + } + +} diff --git a/src/java/org/apache/commons/graph/domain/uml/StateMachineFactory.java b/src/java/org/apache/commons/graph/domain/uml/StateMachineFactory.java index f11f2ee..6ab8ff3 100644 --- a/src/java/org/apache/commons/graph/domain/uml/StateMachineFactory.java +++ b/src/java/org/apache/commons/graph/domain/uml/StateMachineFactory.java @@ -1,232 +1,237 @@ -package org.apache.commons.graph.domain.uml; - -/** - * StateMachineFactory This class will build a State Machine from an NSUML Model - * which can be used for testing. - */ - -import java.util.Set; -import java.util.Map; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; - -import org.apache.commons.graph.domain.uml.exception.*; - -import org.apache.log4j.Category; - -import org.apache.commons.graph.exception.*; -import org.apache.commons.graph.domain.statemachine.*; - -import ru.novosoft.uml.foundation.data_types.*; -import ru.novosoft.uml.model_management.MModel; -import ru.novosoft.uml.foundation.core.*; -import ru.novosoft.uml.behavior.state_machines.*; -import ru.novosoft.uml.behavior.common_behavior.*; - -/** - * Description of the Class - */ -public class StateMachineFactory -{ - private static Category log = - Category.getInstance(org.apache.commons.graph.domain.uml.StateMachineFactory.class); - - private MModel extent = null; - - private Map stateNames = new HashMap();// MSTATEVERTEX X NAME - - /** - * Constructor for the StateMachineFactory object - * - * @param extent - */ - public StateMachineFactory(MModel extent) - { - this.extent = extent; - } - - /** - * Gets the name attribute of the StateMachineFactory object - */ - private String getName(String namespace, MStateVertex msv) - { - if (msv.getName() != null) - { - return namespace + "/" + msv.getName(); - } - - if (msv instanceof MPseudostate) - { - return namespace + "/_" + - ((MPseudostate) msv).getKind().getName() + "_"; - } - - if (msv instanceof MFinalState) - { - return namespace + "/_final_"; - } - - return namespace + "/_unknown_"; - } - - /** - * Description of the Method - */ - private StateMachine makeStateMachine(String namespace, - MCompositeState mcs) - throws GraphException - { - log.debug("makeStateMachine(" + getName(namespace, mcs) + "): Entry"); - StateMachine RC = new StateMachine(namespace); - - // Step 1 - Add States to the State Machine - Iterator states = - mcs.getSubvertices().iterator(); - - while (states.hasNext()) - { - MStateVertex msv = - (MStateVertex) states.next(); - - RC.addState(getName(namespace, msv)); - - stateNames.put(msv, getName(namespace, msv)); - - if (msv instanceof MPseudostate) - { - if (((MPseudostate) msv).getKind() == - MPseudostateKind.INITIAL) - { - RC.setStartState(RC.getState(getName(namespace, msv))); - } - } - - if (msv instanceof MCompositeState) - { - StateMachine ssm = makeStateMachine(getName(namespace, msv), - (MCompositeState) msv); - RC.getState(getName(namespace, msv)).setSubmachine(ssm); - } - - if (msv instanceof MFinalState) - { - RC.addFinalState(RC.getState(getName(namespace, msv))); - } - } - - // Step 2 - Add Transitions to State Machine - states = mcs.getSubvertices().iterator(); - while (states.hasNext()) - { - MStateVertex msv = (MStateVertex) states.next(); - String msvName = getName(namespace, msv); - - Iterator transes = - msv.getIncomings().iterator(); - while (transes.hasNext()) - { - MTransition trans = - (MTransition) transes.next(); - MEvent trigger = trans.getTrigger(); - MGuard guard = trans.getGuard(); - - String trigStr = null; - String guardStr = null; - - if (guard != null) { - guardStr = guard.getName(); - } - - if (trigger != null) - { - trigStr = trigger.getName(); - } - else - { - trigStr = Transition.EPSILON; - } - - String sourceName = - (String) stateNames.get(trans.getSource()); - String targetName = - (String) stateNames.get(trans.getTarget()); - - State source = RC.getState(sourceName); - State target = RC.getState(targetName); - - String transName = source + "-" + target + "/" + trigStr; - if (guardStr != null) { - transName = transName + "[" + guardStr + "]"; - } - - Transition tranx = - new Transition(transName, - source, target); - tranx.setTrigger( trigStr ); - tranx.setGuard( guardStr ); - - RC.addTransition(tranx); - } - } - - log.debug("makeStateMachine(" + getName(namespace, mcs) + "): Exit"); - return RC; - } - - - /** - * Description of the Method - */ - public StateMachine makeStateMachine(String selector) - throws GraphException, ModelNotFoundException - { - log.debug("makeStateMachine(" + selector + "):Enter"); - MStateMachine model = null; - StateMachine RC = null; - - Iterator owned = - extent.getOwnedElements().iterator(); - - while (owned.hasNext()) - { - Object next = owned.next(); - if (next instanceof - ru.novosoft.uml.foundation.core.MClass) - { - MClass mClass = (MClass) next; - - if (selector.equals(mClass.getName())) - { - Iterator machines = mClass.getBehaviors().iterator(); - if (machines.hasNext()) - { - model = (MStateMachine) machines.next(); - log.info("StateMachine Found: " + model); - } - } - } - } - - if (model == null) - { - throw new ModelNotFoundException("Cannot find StateMachine for " + - selector); - } - - MState top = model.getTop(); - if (top instanceof MCompositeState) - { - RC = makeStateMachine(selector, - (MCompositeState) top); - } - else - { - throw new ModelNotFoundException("Expecting CompositeState at top."); - } - - log.debug("makeStateMachine(" + selector + "):Exit"); - return RC; - } -} - +package org.apache.commons.graph.domain.uml; + +/** + * StateMachineFactory This class will build a State Machine from an NSUML Model + * which can be used for testing. + */ + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.graph.domain.statemachine.State; +import org.apache.commons.graph.domain.statemachine.StateMachine; +import org.apache.commons.graph.domain.statemachine.Transition; +import org.apache.commons.graph.domain.uml.exception.ModelNotFoundException; +import org.apache.commons.graph.exception.GraphException; +import org.apache.log4j.Category; + +import ru.novosoft.uml.behavior.state_machines.MCompositeState; +import ru.novosoft.uml.behavior.state_machines.MEvent; +import ru.novosoft.uml.behavior.state_machines.MFinalState; +import ru.novosoft.uml.behavior.state_machines.MGuard; +import ru.novosoft.uml.behavior.state_machines.MPseudostate; +import ru.novosoft.uml.behavior.state_machines.MState; +import ru.novosoft.uml.behavior.state_machines.MStateMachine; +import ru.novosoft.uml.behavior.state_machines.MStateVertex; +import ru.novosoft.uml.behavior.state_machines.MTransition; +import ru.novosoft.uml.foundation.core.MClass; +import ru.novosoft.uml.foundation.data_types.MPseudostateKind; +import ru.novosoft.uml.model_management.MModel; + +/** + * Description of the Class + */ +public class StateMachineFactory +{ + private static Category log = + Category.getInstance(org.apache.commons.graph.domain.uml.StateMachineFactory.class); + + private MModel extent = null; + + private Map stateNames = new HashMap();// MSTATEVERTEX X NAME + + /** + * Constructor for the StateMachineFactory object + * + * @param extent + */ + public StateMachineFactory(MModel extent) + { + this.extent = extent; + } + + /** + * Gets the name attribute of the StateMachineFactory object + */ + private String getName(String namespace, MStateVertex msv) + { + if (msv.getName() != null) + { + return namespace + "/" + msv.getName(); + } + + if (msv instanceof MPseudostate) + { + return namespace + "/_" + + ((MPseudostate) msv).getKind().getName() + "_"; + } + + if (msv instanceof MFinalState) + { + return namespace + "/_final_"; + } + + return namespace + "/_unknown_"; + } + + /** + * Description of the Method + */ + private StateMachine makeStateMachine(String namespace, + MCompositeState mcs) + throws GraphException + { + log.debug("makeStateMachine(" + getName(namespace, mcs) + "): Entry"); + StateMachine RC = new StateMachine(namespace); + + // Step 1 - Add States to the State Machine + Iterator states = + mcs.getSubvertices().iterator(); + + while (states.hasNext()) + { + MStateVertex msv = + (MStateVertex) states.next(); + + RC.addState(getName(namespace, msv)); + + stateNames.put(msv, getName(namespace, msv)); + + if (msv instanceof MPseudostate) + { + if (((MPseudostate) msv).getKind() == + MPseudostateKind.INITIAL) + { + RC.setStartState(RC.getState(getName(namespace, msv))); + } + } + + if (msv instanceof MCompositeState) + { + StateMachine ssm = makeStateMachine(getName(namespace, msv), + (MCompositeState) msv); + RC.getState(getName(namespace, msv)).setSubmachine(ssm); + } + + if (msv instanceof MFinalState) + { + RC.addFinalState(RC.getState(getName(namespace, msv))); + } + } + + // Step 2 - Add Transitions to State Machine + states = mcs.getSubvertices().iterator(); + while (states.hasNext()) + { + MStateVertex msv = (MStateVertex) states.next(); + String msvName = getName(namespace, msv); + + Iterator transes = + msv.getIncomings().iterator(); + while (transes.hasNext()) + { + MTransition trans = + (MTransition) transes.next(); + MEvent trigger = trans.getTrigger(); + MGuard guard = trans.getGuard(); + + String trigStr = null; + String guardStr = null; + + if (guard != null) { + guardStr = guard.getName(); + } + + if (trigger != null) + { + trigStr = trigger.getName(); + } + else + { + trigStr = Transition.EPSILON; + } + + String sourceName = + (String) stateNames.get(trans.getSource()); + String targetName = + (String) stateNames.get(trans.getTarget()); + + State source = RC.getState(sourceName); + State target = RC.getState(targetName); + + String transName = source + "-" + target + "/" + trigStr; + if (guardStr != null) { + transName = transName + "[" + guardStr + "]"; + } + + Transition tranx = + new Transition(transName, + source, target); + tranx.setTrigger( trigStr ); + tranx.setGuard( guardStr ); + + RC.addTransition(tranx); + } + } + + log.debug("makeStateMachine(" + getName(namespace, mcs) + "): Exit"); + return RC; + } + + + /** + * Description of the Method + */ + public StateMachine makeStateMachine(String selector) + throws GraphException, ModelNotFoundException + { + log.debug("makeStateMachine(" + selector + "):Enter"); + MStateMachine model = null; + StateMachine RC = null; + + Iterator owned = + extent.getOwnedElements().iterator(); + + while (owned.hasNext()) + { + Object next = owned.next(); + if (next instanceof + ru.novosoft.uml.foundation.core.MClass) + { + MClass mClass = (MClass) next; + + if (selector.equals(mClass.getName())) + { + Iterator machines = mClass.getBehaviors().iterator(); + if (machines.hasNext()) + { + model = (MStateMachine) machines.next(); + log.info("StateMachine Found: " + model); + } + } + } + } + + if (model == null) + { + throw new ModelNotFoundException("Cannot find StateMachine for " + + selector); + } + + MState top = model.getTop(); + if (top instanceof MCompositeState) + { + RC = makeStateMachine(selector, + (MCompositeState) top); + } + else + { + throw new ModelNotFoundException("Expecting CompositeState at top."); + } + + log.debug("makeStateMachine(" + selector + "):Exit"); + return RC; + } +} + diff --git a/src/java/org/apache/commons/graph/search/CostSearch.java b/src/java/org/apache/commons/graph/search/CostSearch.java index 05d4c9b..c3f9f59 100644 --- a/src/java/org/apache/commons/graph/search/CostSearch.java +++ b/src/java/org/apache/commons/graph/search/CostSearch.java @@ -59,15 +59,15 @@ package org.apache.commons.graph.search; * minimal cost first, and then go to the later costs. */ -import java.util.Set; -import java.util.Map; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; +import java.util.Map; -import org.apache.commons.graph.*; - -import org.apache.commons.collections.*; +import org.apache.commons.collections.BinaryHeap; +import org.apache.commons.collections.PriorityQueue; +import org.apache.commons.graph.Edge; +import org.apache.commons.graph.Vertex; +import org.apache.commons.graph.WeightedGraph; /** * Description of the Class diff --git a/src/java/org/apache/commons/graph/search/DFS.java b/src/java/org/apache/commons/graph/search/DFS.java index 5973670..5ae7cf9 100644 --- a/src/java/org/apache/commons/graph/search/DFS.java +++ b/src/java/org/apache/commons/graph/search/DFS.java @@ -59,9 +59,7 @@ package org.apache.commons.graph.search; * before moving to the siblling nodes. */ -import java.util.Set; import java.util.Map; -import java.util.HashSet; import java.util.HashMap; import java.util.Iterator; diff --git a/src/test/org/apache/commons/graph/DirGraphTest.java b/src/test/org/apache/commons/graph/DirGraphTest.java index bb62ac9..8d47d7d 100644 --- a/src/test/org/apache/commons/graph/DirGraphTest.java +++ b/src/test/org/apache/commons/graph/DirGraphTest.java @@ -1,478 +1,474 @@ -package org.apache.commons.graph; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -/** - * DirGraphTest This test will ensure that we can represent a Directed Graph. - */ - -import java.util.Set; -import java.util.HashSet; -import java.util.Iterator; - -/** - * Description of the Class - */ -public class DirGraphTest - extends GraphTest -{ - private String testName = null; - - /** - * Constructor for the DirGraphTest object - * - * @param name - */ - public DirGraphTest(String name) - { - super(name); - this.testName = name; - } - - /** - * A unit test for JUnit - */ - public void testDirNull() - throws Throwable - { - verifyGraph(makeDirNullGraph(), 0, 0); - } - - /** - * A unit test for JUnit - */ - public void testSingleVertex() - throws Throwable - { - verifyGraph(makeDirSingleVertex(), 1, 0); - } - - /** - * A unit test for JUnit - */ - public void testDoubleVertex() - throws Throwable - { - verifyGraph(makeDirDoubleVertex(), 2, 0); - } - - /** - * A unit test for JUnit - */ - public void testSelfLoop() - throws Throwable - { - DirectedGraph IUT = makeSelfLoop(); - try - { - - verifyGraph(IUT, 1, 1); - - verifyAdjVertices(IUT, V1, - makeSet(V1)); - - verifyAdjVertices(IUT, V1, - makeSet(V1), - makeSet(V1)); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testDirectedEdge() - throws Throwable - { - DirectedGraph IUT = makeDirectedEdge(); - try - { - - verifyGraph(IUT, 2, 1); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2)); - verifyAdjVertices(IUT, V1, - makeSet(V1, V2)); - - verifyAdjVertices(IUT, V1, - makeSet(), - makeSet(V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet()); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testDirParallelEdges() - throws Throwable - { - DirectedGraph IUT = makeDirParallelEdges(); - try - { - - verifyGraph(IUT, 2, 2); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2)); - - verifyAdjVertices(IUT, V1, - makeSet(), - makeSet(V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet()); - - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testTwoCycle() - throws Throwable - { - DirectedGraph IUT = makeTwoCycle(); - try - { - - verifyGraph(IUT, 2, 2); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2)); - - verifyAdjVertices(IUT, V1, - makeSet(V2), - makeSet(V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet(V1)); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testDirectedCycle() - throws Throwable - { - DirectedGraph IUT = makeDirectedCycle(); - try - { - - verifyGraph(IUT, 3, 3); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V3, - makeSet(V1, V2, V3)); - - verifyAdjVertices(IUT, V1, - makeSet(V3), - makeSet(V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet(V3)); - verifyAdjVertices(IUT, V3, - makeSet(V2), - makeSet(V1)); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - - /** - * A unit test for JUnit - */ - public void testPipe() - throws Throwable - { - DirectedGraph IUT = makePipe(); - try - { - - verifyGraph(IUT, 3, 2); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V3, - makeSet(V2, V3)); - - verifyAdjVertices(IUT, V1, - makeSet(), - makeSet(V2)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet(V3)); - verifyAdjVertices(IUT, V3, - makeSet(V2), - makeSet()); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testDiamond() - throws Throwable - { - DirectedGraph IUT = makeDiamond(); - try - { - - verifyGraph(IUT, 4, 4); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2, V4)); - verifyAdjVertices(IUT, V3, - makeSet(V1, V3, V4)); - verifyAdjVertices(IUT, V4, - makeSet(V2, V3, V4)); - - verifyAdjVertices(IUT, V1, - makeSet(), - makeSet(V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet(V4)); - verifyAdjVertices(IUT, V3, - makeSet(V1), - makeSet(V4)); - verifyAdjVertices(IUT, V4, - makeSet(V2, V3), - makeSet()); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testPipelessCycle() - throws Throwable - { - DirectedGraph IUT = makePipelessCycle(); - try - { - - verifyGraph(IUT, 4, 4); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2, V4)); - verifyAdjVertices(IUT, V3, - makeSet(V1, V3, V4)); - verifyAdjVertices(IUT, V4, - makeSet(V2, V3, V4)); - - verifyAdjVertices(IUT, V1, - makeSet(), - makeSet(V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V4), - makeSet()); - verifyAdjVertices(IUT, V3, - makeSet(V1, V4), - makeSet()); - verifyAdjVertices(IUT, V4, - makeSet(), - makeSet(V2, V3)); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testParentTree() - throws Throwable - { - DirectedGraph IUT = makeParentTree(); - try - { - - verifyGraph(IUT, 5, 4); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2)); - verifyAdjVertices(IUT, V3, - makeSet(V1, V3, V4, V5)); - verifyAdjVertices(IUT, V4, - makeSet(V3, V4)); - verifyAdjVertices(IUT, V5, - makeSet(V3, V5)); - - verifyAdjVertices(IUT, V1, - makeSet(V2, V3), - makeSet()); - verifyAdjVertices(IUT, V2, - makeSet(), - makeSet(V1)); - verifyAdjVertices(IUT, V3, - makeSet(V4, V5), - makeSet(V1)); - verifyAdjVertices(IUT, V4, - makeSet(), - makeSet(V3)); - verifyAdjVertices(IUT, V5, - makeSet(), - makeSet(V3)); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - - /** - * A unit test for JUnit - */ - public void testChildTree() - throws Throwable - { - DirectedGraph IUT = makeChildTree(); - try - { - - verifyGraph(IUT, 5, 4); - - verifyAdjVertices(IUT, V1, - makeSet(V1, V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1, V2)); - verifyAdjVertices(IUT, V3, - makeSet(V1, V3, V4, V5)); - verifyAdjVertices(IUT, V4, - makeSet(V3, V4)); - verifyAdjVertices(IUT, V5, - makeSet(V3, V5)); - - verifyAdjVertices(IUT, V1, - makeSet(), - makeSet(V2, V3)); - verifyAdjVertices(IUT, V2, - makeSet(V1), - makeSet()); - verifyAdjVertices(IUT, V3, - makeSet(V1), - makeSet(V4, V5)); - verifyAdjVertices(IUT, V4, - makeSet(V3), - makeSet()); - verifyAdjVertices(IUT, V5, - makeSet(V3), - makeSet()); - } - catch (Throwable t) - { - printGraph(t, IUT); - throw t; - } - } - -} +package org.apache.commons.graph; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DirGraphTest This test will ensure that we can represent a Directed Graph. + */ + +/** + * Description of the Class + */ +public class DirGraphTest + extends GraphTest +{ + private String testName = null; + + /** + * Constructor for the DirGraphTest object + * + * @param name + */ + public DirGraphTest(String name) + { + super(name); + this.testName = name; + } + + /** + * A unit test for JUnit + */ + public void testDirNull() + throws Throwable + { + verifyGraph(makeDirNullGraph(), 0, 0); + } + + /** + * A unit test for JUnit + */ + public void testSingleVertex() + throws Throwable + { + verifyGraph(makeDirSingleVertex(), 1, 0); + } + + /** + * A unit test for JUnit + */ + public void testDoubleVertex() + throws Throwable + { + verifyGraph(makeDirDoubleVertex(), 2, 0); + } + + /** + * A unit test for JUnit + */ + public void testSelfLoop() + throws Throwable + { + DirectedGraph IUT = makeSelfLoop(); + try + { + + verifyGraph(IUT, 1, 1); + + verifyAdjVertices(IUT, V1, + makeSet(V1)); + + verifyAdjVertices(IUT, V1, + makeSet(V1), + makeSet(V1)); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testDirectedEdge() + throws Throwable + { + DirectedGraph IUT = makeDirectedEdge(); + try + { + + verifyGraph(IUT, 2, 1); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2)); + verifyAdjVertices(IUT, V1, + makeSet(V1, V2)); + + verifyAdjVertices(IUT, V1, + makeSet(), + makeSet(V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet()); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testDirParallelEdges() + throws Throwable + { + DirectedGraph IUT = makeDirParallelEdges(); + try + { + + verifyGraph(IUT, 2, 2); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2)); + + verifyAdjVertices(IUT, V1, + makeSet(), + makeSet(V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet()); + + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testTwoCycle() + throws Throwable + { + DirectedGraph IUT = makeTwoCycle(); + try + { + + verifyGraph(IUT, 2, 2); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2)); + + verifyAdjVertices(IUT, V1, + makeSet(V2), + makeSet(V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet(V1)); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testDirectedCycle() + throws Throwable + { + DirectedGraph IUT = makeDirectedCycle(); + try + { + + verifyGraph(IUT, 3, 3); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V3, + makeSet(V1, V2, V3)); + + verifyAdjVertices(IUT, V1, + makeSet(V3), + makeSet(V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet(V3)); + verifyAdjVertices(IUT, V3, + makeSet(V2), + makeSet(V1)); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + + /** + * A unit test for JUnit + */ + public void testPipe() + throws Throwable + { + DirectedGraph IUT = makePipe(); + try + { + + verifyGraph(IUT, 3, 2); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V3, + makeSet(V2, V3)); + + verifyAdjVertices(IUT, V1, + makeSet(), + makeSet(V2)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet(V3)); + verifyAdjVertices(IUT, V3, + makeSet(V2), + makeSet()); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testDiamond() + throws Throwable + { + DirectedGraph IUT = makeDiamond(); + try + { + + verifyGraph(IUT, 4, 4); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2, V4)); + verifyAdjVertices(IUT, V3, + makeSet(V1, V3, V4)); + verifyAdjVertices(IUT, V4, + makeSet(V2, V3, V4)); + + verifyAdjVertices(IUT, V1, + makeSet(), + makeSet(V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet(V4)); + verifyAdjVertices(IUT, V3, + makeSet(V1), + makeSet(V4)); + verifyAdjVertices(IUT, V4, + makeSet(V2, V3), + makeSet()); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testPipelessCycle() + throws Throwable + { + DirectedGraph IUT = makePipelessCycle(); + try + { + + verifyGraph(IUT, 4, 4); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2, V4)); + verifyAdjVertices(IUT, V3, + makeSet(V1, V3, V4)); + verifyAdjVertices(IUT, V4, + makeSet(V2, V3, V4)); + + verifyAdjVertices(IUT, V1, + makeSet(), + makeSet(V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V4), + makeSet()); + verifyAdjVertices(IUT, V3, + makeSet(V1, V4), + makeSet()); + verifyAdjVertices(IUT, V4, + makeSet(), + makeSet(V2, V3)); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testParentTree() + throws Throwable + { + DirectedGraph IUT = makeParentTree(); + try + { + + verifyGraph(IUT, 5, 4); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2)); + verifyAdjVertices(IUT, V3, + makeSet(V1, V3, V4, V5)); + verifyAdjVertices(IUT, V4, + makeSet(V3, V4)); + verifyAdjVertices(IUT, V5, + makeSet(V3, V5)); + + verifyAdjVertices(IUT, V1, + makeSet(V2, V3), + makeSet()); + verifyAdjVertices(IUT, V2, + makeSet(), + makeSet(V1)); + verifyAdjVertices(IUT, V3, + makeSet(V4, V5), + makeSet(V1)); + verifyAdjVertices(IUT, V4, + makeSet(), + makeSet(V3)); + verifyAdjVertices(IUT, V5, + makeSet(), + makeSet(V3)); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + + /** + * A unit test for JUnit + */ + public void testChildTree() + throws Throwable + { + DirectedGraph IUT = makeChildTree(); + try + { + + verifyGraph(IUT, 5, 4); + + verifyAdjVertices(IUT, V1, + makeSet(V1, V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1, V2)); + verifyAdjVertices(IUT, V3, + makeSet(V1, V3, V4, V5)); + verifyAdjVertices(IUT, V4, + makeSet(V3, V4)); + verifyAdjVertices(IUT, V5, + makeSet(V3, V5)); + + verifyAdjVertices(IUT, V1, + makeSet(), + makeSet(V2, V3)); + verifyAdjVertices(IUT, V2, + makeSet(V1), + makeSet()); + verifyAdjVertices(IUT, V3, + makeSet(V1), + makeSet(V4, V5)); + verifyAdjVertices(IUT, V4, + makeSet(V3), + makeSet()); + verifyAdjVertices(IUT, V5, + makeSet(V3), + makeSet()); + } + catch (Throwable t) + { + printGraph(t, IUT); + throw t; + } + } + +} diff --git a/src/test/org/apache/commons/graph/GraphTest.java b/src/test/org/apache/commons/graph/GraphTest.java index c736461..20a9dbe 100644 --- a/src/test/org/apache/commons/graph/GraphTest.java +++ b/src/test/org/apache/commons/graph/GraphTest.java @@ -1,1026 +1,1024 @@ -package org.apache.commons.graph; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -/** - * GraphTest This is a superclass of other tests to provide some utilities in - * verifying graphs. This test will provide Undirected and Directed Graphs as - * well. We will implement the following graphs. Undirected Graphs - * ------------------- () No Vertex, No Edges @ One Vertex, No Edges @ @ Two - * Vertices, No Edges @-@ Two Vertices, One edge /-\ @ @ Two Vertices, Two Edges - * (Parallel Edges) \-/ @ / \ Three Vertices, Three Edges (Cycle) @---@ @--@--@ - * Three Vertices, Two Edges (No Cycle) @ / \ @ @ 5 Vertices, 4 Edges (Tree) / \ - * @ @ @-@ @-@ 4 Vertices, 2 Edges (Disconnected) - */ - -import java.util.Set; -import java.util.Map; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; - -import junit.framework.*; - -import org.apache.commons.graph.domain.basic.*; -import org.apache.commons.graph.exception.*; - -/** - * Description of the Class - */ -public class GraphTest extends TestCase -{ - /** - * Description of the Class - */ - public class VertexImpl - implements Vertex - { - private String name = null; - - /** - * Constructor for the VertexImpl object - * - * @param name - */ - public VertexImpl(String name) - { - this.name = name; - } - - /** - * Description of the Method - */ - public String toString() - { - return name; - } - } - - /** - * Description of the Class - */ - public class EdgeImpl - implements Edge - { - private Vertex start; - private Vertex end; - - /** - * Constructor for the EdgeImpl object - * - * @param start - * @param end - */ - public EdgeImpl(Vertex start, - Vertex end) - { - this.start = start; - this.end = end; - } - - /** - * Gets the otherVertex attribute of the EdgeImpl object - */ - public Vertex getOtherVertex(Vertex v) - { - if (v == start) - { - return end; - } - if (v == end) - { - return start; - } - return null; - } - - /** - * Gets the vertices attribute of the EdgeImpl object - */ - public Set getVertices() - { - Set RC = new HashSet(); - RC.add(start); - RC.add(end); - return RC; - } - - /** - * Gets the source attribute of the EdgeImpl object - */ - public Vertex getSource() - { - return start; - } - - /** - * Gets the target attribute of the EdgeImpl object - */ - public Vertex getTarget() - { - return end; - } - - /** - * Description of the Method - */ - public String toString() - { - return start.toString() + " <-> " + end.toString(); - } - } - - /** - * Description of the Field - */ - public Vertex V1 = new VertexImpl("V1"); - /** - * Description of the Field - */ - public Vertex V2 = new VertexImpl("V2"); - /** - * Description of the Field - */ - public Vertex V3 = new VertexImpl("V3"); - /** - * Description of the Field - */ - public Vertex V4 = new VertexImpl("V4"); - /** - * Description of the Field - */ - public Vertex V5 = new VertexImpl("V5"); - - /** - * Description of the Field - */ - public EdgeImpl V1_V1 = new EdgeImpl(V1, V1);// For Self-Loops. - /** - * Description of the Field - */ - public EdgeImpl V1_V2 = new EdgeImpl(V1, V2); - /** - * Description of the Field - */ - public EdgeImpl V1_V2_ = new EdgeImpl(V1, V2);// For Parallel - /** - * Description of the Field - */ - public EdgeImpl V1_V2__ = new EdgeImpl(V1, V2);// For Parallel #2 - - public EdgeImpl V1_V2_V3 = new EdgeImpl(V1, V2); // HyperEdge. . . - - /** - * Description of the Field - */ - public EdgeImpl V1_V3 = new EdgeImpl(V1, V3); - /** - * Description of the Field - */ - public EdgeImpl V1_V4 = new EdgeImpl(V1, V4); - /** - * Description of the Field - */ - public EdgeImpl V1_V5 = new EdgeImpl(V1, V5); - - /** - * Description of the Field - */ - public EdgeImpl V2_V1 = new EdgeImpl(V2, V1); - /** - * Description of the Field - */ - public EdgeImpl V2_V3 = new EdgeImpl(V2, V3); - /** - * Description of the Field - */ - public EdgeImpl V2_V4 = new EdgeImpl(V2, V4); - /** - * Description of the Field - */ - public EdgeImpl V2_V5 = new EdgeImpl(V2, V5); - - /** - * Description of the Field - */ - public EdgeImpl V3_V1 = new EdgeImpl(V3, V1); - /** - * Description of the Field - */ - public EdgeImpl V3_V2 = new EdgeImpl(V3, V2); - /** - * Description of the Field - */ - public EdgeImpl V3_V4 = new EdgeImpl(V3, V4); - /** - * Description of the Field - */ - public EdgeImpl V3_V5 = new EdgeImpl(V3, V5); - - /** - * Description of the Field - */ - public EdgeImpl V4_V1 = new EdgeImpl(V4, V1); - /** - * Description of the Field - */ - public EdgeImpl V4_V2 = new EdgeImpl(V4, V2); - /** - * Description of the Field - */ - public EdgeImpl V4_V3 = new EdgeImpl(V4, V3); - /** - * Description of the Field - */ - public EdgeImpl V4_V5 = new EdgeImpl(V4, V5); - - /** - * Description of the Field - */ - public EdgeImpl V5_V1 = new EdgeImpl(V5, V1); - /** - * Description of the Field - */ - public EdgeImpl V5_V2 = new EdgeImpl(V5, V2); - /** - * Description of the Field - */ - public EdgeImpl V5_V3 = new EdgeImpl(V5, V3); - /** - * Description of the Field - */ - public EdgeImpl V5_V4 = new EdgeImpl(V5, V4); - - /** - * Constructor for the GraphTest object - * - * @param name - */ - public GraphTest(String name) - { - super(name); - this.testName = name; - } - - private String testName = null; - - /** - * Return this graph: () - */ - public UndirectedGraph makeNullGraph() - throws GraphException - { - return new UndirectedGraphImpl(); - } - - /** - * Description of the Method - */ - public DirectedGraph makeDirNullGraph() - throws GraphException - { - return new DirectedGraphImpl(); - } - - /** - * Return this graph: v1 - */ - public UndirectedGraph makeSingleVertex() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - RC.addVertex(V1); - return RC; - } - - /** - * Description of the Method - */ - public DirectedGraph makeDirSingleVertex() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - RC.addVertex(V1); - return RC; - } - - /** - * /--\ v1 | ^--/ - */ - public DirectedGraph makeSelfLoop() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - RC.addVertex(V1); - RC.addEdge(V1_V1, V1, V1); - return RC; - } - - /** - * v1 v2 Two Vertices, No Edges - */ - public UndirectedGraph makeDoubleVertex() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - RC.addVertex(V1); - RC.addVertex(V2); - return RC; - } - - /** - * Description of the Method - */ - public DirectedGraph makeDirDoubleVertex() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - RC.addVertex(V1); - RC.addVertex(V2); - return RC; - } - - /** - * v1-v2 Two Vertices, One edge - */ - public UndirectedGraph makeSingleEdge() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - - RC.addEdge(V1_V2, V1_V2.getVertices()); - - return RC; - } - - /** - * v1 -> v2 Directed Edge - */ - public DirectedGraph makeDirectedEdge() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - - RC.addEdge(V1_V2, - V1, V2); - - return RC; - } - - /** - * /-\ v1 v2 Two Vertices, Two Edges (Parallel Edges) \-/ - */ - public UndirectedGraph makeParallelEdges() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - - RC.addEdge(V1_V2, V1_V2.getVertices()); - RC.addEdge(V1_V2_, V1_V2_.getVertices()); - - return RC; - } - - /** - * /--->\ @ @ \--->/ - */ - public DirectedGraph makeDirParallelEdges() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - - RC.addEdge(V1_V2, V1, V2); - // Second edge must be distinct. . . - RC.addEdge(V1_V2_, V1, V2); - - return RC; - } - - /** - * v1 / \ Three Vertices, Three Edges (Cycle) v2---v3 - */ - public UndirectedGraph makeCycle() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - - RC.addEdge(V1_V2, V1_V2.getVertices()); - RC.addEdge(V2_V3, V2_V3.getVertices()); - RC.addEdge(V3_V1, V3_V1.getVertices()); - - return RC; - } - - /** - * /--->\ v1 v2 \<---/ - */ - public DirectedGraph makeTwoCycle() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V2_V1, V2, V1); - - return RC; - } - - /** - * v1 / ^ v \ v2 ---> v3 - */ - public DirectedGraph makeDirectedCycle() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V2_V3, V2, V3); - RC.addEdge(V3_V1, V3, V1); - - return RC; - } - - /** - * v1 / ^ v \ v2 ---> v3 - */ - public DirectedGraph makeDirected4Cycle() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V2_V3, V2, V3); - RC.addEdge(V3_V4, V3, V4); - RC.addEdge(V4_V1, V4, V1); - - return RC; - } - - /** - * v1--v2--v3 Three Vertices, Two Edges (No Cycle) - */ - public UndirectedGraph makeNoCycle() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - - RC.addEdge(V1_V2, V1_V2.getVertices()); - RC.addEdge(V2_V3, V2_V3.getVertices()); - - return RC; - } - - /** - * v1 --> v2 --> v3 - */ - public DirectedGraph makePipe() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V2_V3, V2, V3); - - return RC; - } - - /** - * v1 / \ v v v2 v3 \ / v v v4 - */ - public DirectedGraph makeDiamond() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V1_V3, V1, V3); - RC.addEdge(V2_V4, V2, V4); - RC.addEdge(V3_V4, V3, V4); - - return RC; - } - - /** - * v1 / \ v v v2 v3 ^ ^ \ / v4 - */ - public DirectedGraph makePipelessCycle() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V1_V3, V1, V3); - RC.addEdge(V4_V2, V4, V2); - RC.addEdge(V4_V3, V4, V3); - - return RC; - } - - /** - * v1 / \ v2 v3 5 Vertices, 4 Edges (Tree) / \ v4 v5 - */ - public UndirectedGraph makeTree() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - RC.addVertex(V5); - - RC.addEdge(V1_V2, V1_V2.getVertices()); - RC.addEdge(V1_V3, V1_V3.getVertices()); - RC.addEdge(V3_V4, V3_V4.getVertices()); - RC.addEdge(V3_V5, V3_V5.getVertices()); - - return RC; - } - - /** - * Description of the Method - */ - public DirectedGraph makeParentTree() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - RC.addVertex(V5); - - RC.addEdge(V2_V1, V2, V1); - RC.addEdge(V3_V1, V3, V1); - RC.addEdge(V4_V3, V4, V3); - RC.addEdge(V5_V3, V5, V3); - - return RC; - } - - /** - * Description of the Method - */ - public DirectedGraph makeChildTree() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - RC.addVertex(V5); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V1_V3, V1, V3); - RC.addEdge(V3_V4, V3, V4); - RC.addEdge(V3_V5, V3, V5); - - return RC; - } - - /** - * v1-v2 v3-v4 4 Vertices, 2 Edges (Disconnected) - */ - public UndirectedGraph makeDisconnected() - throws GraphException - { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - - RC.addEdge(V1_V2, V1_V2.getVertices()); - RC.addEdge(V3_V4, V3_V4.getVertices()); - - return RC; - } - - /** - * makeHyperEdgeGraph - * - * This makes a graph which has more than one Vertex on an Edge. - * - * V1 - * | - * * - * / \ - * V2 V3 - * - */ - public Graph makeHyperGraph() { - UndirectedGraphImpl RC = new UndirectedGraphImpl(); - - RC.addVertex( V1 ); - RC.addVertex( V2 ); - RC.addVertex( V3 ); - - RC.addEdge( V1_V2_V3 ); - RC.connect( V1_V2_V3, V1 ); - RC.connect( V1_V2_V3, V2 ); - RC.connect( V1_V2_V3, V3 ); - - return RC; - } - - - /** - * - * V1 --> V2 --> V3 <--> V4 - */ - public DirectedGraph makeCycleNoReturn() - throws GraphException - { - DirectedGraphImpl RC = new DirectedGraphImpl(); - - RC.addVertex(V1); - RC.addVertex(V2); - RC.addVertex(V3); - RC.addVertex(V4); - - RC.addEdge(V1_V2, V1, V2); - RC.addEdge(V2_V3, V2, V3); - RC.addEdge(V3_V4, V3, V4); - RC.addEdge(V4_V3, V4, V3); - - return RC; - } - - /** - * A unit test for JUnit - */ - public void testNothing() - throws Throwable { } - - /** - * Description of the Method - */ - public void verifyVertexEdgeCount(Graph IUT, - Vertex v, - int numEdge) - throws Throwable - { - assertEquals(v.toString() + " has wrong number of adjacent edges.", - IUT.getEdges(v).size(), numEdge); - } - - /** - * Gets the outboundVertices attribute of the GraphTest object - */ - private Set getOutboundVertices(DirectedGraph IUT, - Vertex v) - { - Set RC = new HashSet(); - Iterator edges = IUT.getOutbound(v).iterator(); - - while (edges.hasNext()) - { - Edge e = (Edge) edges.next(); - RC.add(IUT.getTarget(e)); - } - - return RC; - } - - /** - * Gets the inboundVertices attribute of the GraphTest object - */ - private Set getInboundVertices(DirectedGraph IUT, - Vertex v) - { - Set RC = new HashSet(); - Iterator edges = IUT.getInbound(v).iterator(); - - while (edges.hasNext()) - { - Edge e = (Edge) edges.next(); - RC.add(IUT.getSource(e)); - } - - return RC; - } - - - /** - * Gets the adjVertices attribute of the GraphTest object - */ - private Set getAdjVertices(Graph IUT, - Vertex v) - { - Set RC = new HashSet(); - Iterator edges = IUT.getEdges(v).iterator(); - - while (edges.hasNext()) - { - Edge e = (Edge) edges.next(); - - Set verts = IUT.getVertices(e); - RC.addAll(verts); - } - - return RC; - } - - /** - * Description of the Method - */ - public Set makeSet() - { - return new HashSet(); - } - - - /** - * Description of the Method - */ - public Set makeSet(Object v) - { - Set RC = new HashSet(); - RC.add(v); - return RC; - } - - /** - * Description of the Method - */ - public Set makeSet(Object v1, - Object v2) - { - Set RC = makeSet(v1); - RC.add(v2); - return RC; - } - - /** - * Description of the Method - */ - public Set makeSet(Set s1, - Set s2) - { - Set RC = new HashSet(); - RC.addAll(s1); - RC.addAll(s2); - return RC; - } - - /** - * Description of the Method - */ - public Set makeSet(Object v1, - Object v2, - Object v3) - { - return makeSet(makeSet(v1, v2), - makeSet(v3)); - } - - /** - * Description of the Method - */ - public Set makeSet(Object v1, - Object v2, - Object v3, - Object v4) - { - return makeSet(makeSet(v1, v2), - makeSet(v3, v4)); - } - - /** - * Description of the Method - */ - public void verifyAdjVertices(DirectedGraph IUT, - Vertex v, - Set inExpect, - Set outExpect) - { - Set inbound = getInboundVertices(IUT, v); - Set outbound = getOutboundVertices(IUT, v); - - Iterator verts; - - // inbound is a subset of inExpect - verts = inbound.iterator(); - - while (verts.hasNext()) - { - Vertex curr = (Vertex) verts.next(); - - assertTrue(curr.toString() + " is not supposed to be " + - "next to " + v.toString(), - inExpect.contains(curr)); - } - - // inExpect is a subset of inbound - verts = inExpect.iterator(); - - while (verts.hasNext()) - { - Vertex curr = (Vertex) verts.next(); - assertTrue(curr.toString() + " is supposed to be next to " + - v.toString(), - inbound.contains(curr)); - } - - // outbound is a subset of outExpect - verts = outbound.iterator(); - - while (verts.hasNext()) - { - Vertex curr = (Vertex) verts.next(); - - assertTrue(curr.toString() + " is not supposed to be " + - "next to " + v.toString(), - outExpect.contains(curr)); - } - - // outExpect is a subset of outbound - verts = outExpect.iterator(); - - while (verts.hasNext()) - { - Vertex curr = (Vertex) verts.next(); - assertTrue(curr.toString() + " is supposed to be next to " + - v.toString(), - outbound.contains(curr)); - } - - } - - /** - * Description of the Method - */ - public void verifyAdjVertices(Graph IUT, - Vertex v, - Set expected) - throws Throwable - { - Set adjacent = getAdjVertices(IUT, v); - Iterator adjV = adjacent.iterator(); - - while (adjV.hasNext()) - { - Vertex curr = (Vertex) adjV.next(); - assertTrue(curr.toString() + " is not supposed to be " + - "next to " + v.toString(), - expected.contains(curr)); - } - - Iterator expect = expected.iterator(); - - while (expect.hasNext()) - { - Vertex curr = (Vertex) expect.next(); - assertTrue(curr.toString() + " is supposed to be next to " + - v.toString(), - adjacent.contains(curr)); - } - } - - /** - * Description of the Method - */ - public void verifyGraph(Graph g, int numVertex, int numEdge) - throws Throwable - { - assertEquals("Incorrect Number of Vertices.", - numVertex, g.getVertices().size()); - assertEquals("Incorrect Number of Edges.", - numEdge, g.getEdges().size()); - } - - /** - * Description of the Method - */ - public void printGraph(Throwable t, - DirectedGraph IUT) - { - System.err.println(testName + ": " + t.toString()); - System.err.println("VERTICES: " + IUT.getVertices()); - System.err.println("EDGES: " + IUT.getEdges()); - - Iterator verts = IUT.getVertices().iterator(); - while (verts.hasNext()) - { - Vertex vert = (Vertex) verts.next(); - System.err.println("[ " + vert + " ]"); - - Iterator inbounds = IUT.getInbound(vert).iterator(); - while (inbounds.hasNext()) - { - Edge inbound = (Edge) inbounds.next(); - System.err.println("\tI [" + inbound + "]"); - } - - Iterator outbounds = IUT.getOutbound(vert).iterator(); - while (outbounds.hasNext()) - { - Edge outbound = (Edge) outbounds.next(); - System.err.println("\tO [" + outbound + "]"); - } - } - } - -} +package org.apache.commons.graph; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +/** + * GraphTest This is a superclass of other tests to provide some utilities in + * verifying graphs. This test will provide Undirected and Directed Graphs as + * well. We will implement the following graphs. Undirected Graphs + * ------------------- () No Vertex, No Edges @ One Vertex, No Edges @ @ Two + * Vertices, No Edges @-@ Two Vertices, One edge /-\ @ @ Two Vertices, Two Edges + * (Parallel Edges) \-/ @ / \ Three Vertices, Three Edges (Cycle) @---@ @--@--@ + * Three Vertices, Two Edges (No Cycle) @ / \ @ @ 5 Vertices, 4 Edges (Tree) / \ + * @ @ @-@ @-@ 4 Vertices, 2 Edges (Disconnected) + */ + +import java.util.Set; +import java.util.HashSet; +import java.util.Iterator; + +import junit.framework.*; + +import org.apache.commons.graph.domain.basic.*; +import org.apache.commons.graph.exception.*; + +/** + * Description of the Class + */ +public class GraphTest extends TestCase +{ + /** + * Description of the Class + */ + public class VertexImpl + implements Vertex + { + private String name = null; + + /** + * Constructor for the VertexImpl object + * + * @param name + */ + public VertexImpl(String name) + { + this.name = name; + } + + /** + * Description of the Method + */ + public String toString() + { + return name; + } + } + + /** + * Description of the Class + */ + public class EdgeImpl + implements Edge + { + private Vertex start; + private Vertex end; + + /** + * Constructor for the EdgeImpl object + * + * @param start + * @param end + */ + public EdgeImpl(Vertex start, + Vertex end) + { + this.start = start; + this.end = end; + } + + /** + * Gets the otherVertex attribute of the EdgeImpl object + */ + public Vertex getOtherVertex(Vertex v) + { + if (v == start) + { + return end; + } + if (v == end) + { + return start; + } + return null; + } + + /** + * Gets the vertices attribute of the EdgeImpl object + */ + public Set getVertices() + { + Set RC = new HashSet(); + RC.add(start); + RC.add(end); + return RC; + } + + /** + * Gets the source attribute of the EdgeImpl object + */ + public Vertex getSource() + { + return start; + } + + /** + * Gets the target attribute of the EdgeImpl object + */ + public Vertex getTarget() + { + return end; + } + + /** + * Description of the Method + */ + public String toString() + { + return start.toString() + " <-> " + end.toString(); + } + } + + /** + * Description of the Field + */ + public Vertex V1 = new VertexImpl("V1"); + /** + * Description of the Field + */ + public Vertex V2 = new VertexImpl("V2"); + /** + * Description of the Field + */ + public Vertex V3 = new VertexImpl("V3"); + /** + * Description of the Field + */ + public Vertex V4 = new VertexImpl("V4"); + /** + * Description of the Field + */ + public Vertex V5 = new VertexImpl("V5"); + + /** + * Description of the Field + */ + public EdgeImpl V1_V1 = new EdgeImpl(V1, V1);// For Self-Loops. + /** + * Description of the Field + */ + public EdgeImpl V1_V2 = new EdgeImpl(V1, V2); + /** + * Description of the Field + */ + public EdgeImpl V1_V2_ = new EdgeImpl(V1, V2);// For Parallel + /** + * Description of the Field + */ + public EdgeImpl V1_V2__ = new EdgeImpl(V1, V2);// For Parallel #2 + + public EdgeImpl V1_V2_V3 = new EdgeImpl(V1, V2); // HyperEdge. . . + + /** + * Description of the Field + */ + public EdgeImpl V1_V3 = new EdgeImpl(V1, V3); + /** + * Description of the Field + */ + public EdgeImpl V1_V4 = new EdgeImpl(V1, V4); + /** + * Description of the Field + */ + public EdgeImpl V1_V5 = new EdgeImpl(V1, V5); + + /** + * Description of the Field + */ + public EdgeImpl V2_V1 = new EdgeImpl(V2, V1); + /** + * Description of the Field + */ + public EdgeImpl V2_V3 = new EdgeImpl(V2, V3); + /** + * Description of the Field + */ + public EdgeImpl V2_V4 = new EdgeImpl(V2, V4); + /** + * Description of the Field + */ + public EdgeImpl V2_V5 = new EdgeImpl(V2, V5); + + /** + * Description of the Field + */ + public EdgeImpl V3_V1 = new EdgeImpl(V3, V1); + /** + * Description of the Field + */ + public EdgeImpl V3_V2 = new EdgeImpl(V3, V2); + /** + * Description of the Field + */ + public EdgeImpl V3_V4 = new EdgeImpl(V3, V4); + /** + * Description of the Field + */ + public EdgeImpl V3_V5 = new EdgeImpl(V3, V5); + + /** + * Description of the Field + */ + public EdgeImpl V4_V1 = new EdgeImpl(V4, V1); + /** + * Description of the Field + */ + public EdgeImpl V4_V2 = new EdgeImpl(V4, V2); + /** + * Description of the Field + */ + public EdgeImpl V4_V3 = new EdgeImpl(V4, V3); + /** + * Description of the Field + */ + public EdgeImpl V4_V5 = new EdgeImpl(V4, V5); + + /** + * Description of the Field + */ + public EdgeImpl V5_V1 = new EdgeImpl(V5, V1); + /** + * Description of the Field + */ + public EdgeImpl V5_V2 = new EdgeImpl(V5, V2); + /** + * Description of the Field + */ + public EdgeImpl V5_V3 = new EdgeImpl(V5, V3); + /** + * Description of the Field + */ + public EdgeImpl V5_V4 = new EdgeImpl(V5, V4); + + /** + * Constructor for the GraphTest object + * + * @param name + */ + public GraphTest(String name) + { + super(name); + this.testName = name; + } + + private String testName = null; + + /** + * Return this graph: () + */ + public UndirectedGraph makeNullGraph() + throws GraphException + { + return new UndirectedGraphImpl(); + } + + /** + * Description of the Method + */ + public DirectedGraph makeDirNullGraph() + throws GraphException + { + return new DirectedGraphImpl(); + } + + /** + * Return this graph: v1 + */ + public UndirectedGraph makeSingleVertex() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + RC.addVertex(V1); + return RC; + } + + /** + * Description of the Method + */ + public DirectedGraph makeDirSingleVertex() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + RC.addVertex(V1); + return RC; + } + + /** + * /--\ v1 | ^--/ + */ + public DirectedGraph makeSelfLoop() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + RC.addVertex(V1); + RC.addEdge(V1_V1, V1, V1); + return RC; + } + + /** + * v1 v2 Two Vertices, No Edges + */ + public UndirectedGraph makeDoubleVertex() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + RC.addVertex(V1); + RC.addVertex(V2); + return RC; + } + + /** + * Description of the Method + */ + public DirectedGraph makeDirDoubleVertex() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + RC.addVertex(V1); + RC.addVertex(V2); + return RC; + } + + /** + * v1-v2 Two Vertices, One edge + */ + public UndirectedGraph makeSingleEdge() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + + RC.addEdge(V1_V2, V1_V2.getVertices()); + + return RC; + } + + /** + * v1 -> v2 Directed Edge + */ + public DirectedGraph makeDirectedEdge() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + + RC.addEdge(V1_V2, + V1, V2); + + return RC; + } + + /** + * /-\ v1 v2 Two Vertices, Two Edges (Parallel Edges) \-/ + */ + public UndirectedGraph makeParallelEdges() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + + RC.addEdge(V1_V2, V1_V2.getVertices()); + RC.addEdge(V1_V2_, V1_V2_.getVertices()); + + return RC; + } + + /** + * /--->\ @ @ \--->/ + */ + public DirectedGraph makeDirParallelEdges() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + + RC.addEdge(V1_V2, V1, V2); + // Second edge must be distinct. . . + RC.addEdge(V1_V2_, V1, V2); + + return RC; + } + + /** + * v1 / \ Three Vertices, Three Edges (Cycle) v2---v3 + */ + public UndirectedGraph makeCycle() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + + RC.addEdge(V1_V2, V1_V2.getVertices()); + RC.addEdge(V2_V3, V2_V3.getVertices()); + RC.addEdge(V3_V1, V3_V1.getVertices()); + + return RC; + } + + /** + * /--->\ v1 v2 \<---/ + */ + public DirectedGraph makeTwoCycle() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V2_V1, V2, V1); + + return RC; + } + + /** + * v1 / ^ v \ v2 ---> v3 + */ + public DirectedGraph makeDirectedCycle() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V2_V3, V2, V3); + RC.addEdge(V3_V1, V3, V1); + + return RC; + } + + /** + * v1 / ^ v \ v2 ---> v3 + */ + public DirectedGraph makeDirected4Cycle() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V2_V3, V2, V3); + RC.addEdge(V3_V4, V3, V4); + RC.addEdge(V4_V1, V4, V1); + + return RC; + } + + /** + * v1--v2--v3 Three Vertices, Two Edges (No Cycle) + */ + public UndirectedGraph makeNoCycle() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + + RC.addEdge(V1_V2, V1_V2.getVertices()); + RC.addEdge(V2_V3, V2_V3.getVertices()); + + return RC; + } + + /** + * v1 --> v2 --> v3 + */ + public DirectedGraph makePipe() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V2_V3, V2, V3); + + return RC; + } + + /** + * v1 / \ v v v2 v3 \ / v v v4 + */ + public DirectedGraph makeDiamond() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V1_V3, V1, V3); + RC.addEdge(V2_V4, V2, V4); + RC.addEdge(V3_V4, V3, V4); + + return RC; + } + + /** + * v1 / \ v v v2 v3 ^ ^ \ / v4 + */ + public DirectedGraph makePipelessCycle() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V1_V3, V1, V3); + RC.addEdge(V4_V2, V4, V2); + RC.addEdge(V4_V3, V4, V3); + + return RC; + } + + /** + * v1 / \ v2 v3 5 Vertices, 4 Edges (Tree) / \ v4 v5 + */ + public UndirectedGraph makeTree() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + RC.addVertex(V5); + + RC.addEdge(V1_V2, V1_V2.getVertices()); + RC.addEdge(V1_V3, V1_V3.getVertices()); + RC.addEdge(V3_V4, V3_V4.getVertices()); + RC.addEdge(V3_V5, V3_V5.getVertices()); + + return RC; + } + + /** + * Description of the Method + */ + public DirectedGraph makeParentTree() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + RC.addVertex(V5); + + RC.addEdge(V2_V1, V2, V1); + RC.addEdge(V3_V1, V3, V1); + RC.addEdge(V4_V3, V4, V3); + RC.addEdge(V5_V3, V5, V3); + + return RC; + } + + /** + * Description of the Method + */ + public DirectedGraph makeChildTree() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + RC.addVertex(V5); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V1_V3, V1, V3); + RC.addEdge(V3_V4, V3, V4); + RC.addEdge(V3_V5, V3, V5); + + return RC; + } + + /** + * v1-v2 v3-v4 4 Vertices, 2 Edges (Disconnected) + */ + public UndirectedGraph makeDisconnected() + throws GraphException + { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + + RC.addEdge(V1_V2, V1_V2.getVertices()); + RC.addEdge(V3_V4, V3_V4.getVertices()); + + return RC; + } + + /** + * makeHyperEdgeGraph + * + * This makes a graph which has more than one Vertex on an Edge. + * + * V1 + * | + * * + * / \ + * V2 V3 + * + */ + public Graph makeHyperGraph() { + UndirectedGraphImpl RC = new UndirectedGraphImpl(); + + RC.addVertex( V1 ); + RC.addVertex( V2 ); + RC.addVertex( V3 ); + + RC.addEdge( V1_V2_V3 ); + RC.connect( V1_V2_V3, V1 ); + RC.connect( V1_V2_V3, V2 ); + RC.connect( V1_V2_V3, V3 ); + + return RC; + } + + + /** + * + * V1 --> V2 --> V3 <--> V4 + */ + public DirectedGraph makeCycleNoReturn() + throws GraphException + { + DirectedGraphImpl RC = new DirectedGraphImpl(); + + RC.addVertex(V1); + RC.addVertex(V2); + RC.addVertex(V3); + RC.addVertex(V4); + + RC.addEdge(V1_V2, V1, V2); + RC.addEdge(V2_V3, V2, V3); + RC.addEdge(V3_V4, V3, V4); + RC.addEdge(V4_V3, V4, V3); + + return RC; + } + + /** + * A unit test for JUnit + */ + public void testNothing() + throws Throwable { } + + /** + * Description of the Method + */ + public void verifyVertexEdgeCount(Graph IUT, + Vertex v, + int numEdge) + throws Throwable + { + assertEquals(v.toString() + " has wrong number of adjacent edges.", + IUT.getEdges(v).size(), numEdge); + } + + /** + * Gets the outboundVertices attribute of the GraphTest object + */ + private Set getOutboundVertices(DirectedGraph IUT, + Vertex v) + { + Set RC = new HashSet(); + Iterator edges = IUT.getOutbound(v).iterator(); + + while (edges.hasNext()) + { + Edge e = (Edge) edges.next(); + RC.add(IUT.getTarget(e)); + } + + return RC; + } + + /** + * Gets the inboundVertices attribute of the GraphTest object + */ + private Set getInboundVertices(DirectedGraph IUT, + Vertex v) + { + Set RC = new HashSet(); + Iterator edges = IUT.getInbound(v).iterator(); + + while (edges.hasNext()) + { + Edge e = (Edge) edges.next(); + RC.add(IUT.getSource(e)); + } + + return RC; + } + + + /** + * Gets the adjVertices attribute of the GraphTest object + */ + private Set getAdjVertices(Graph IUT, + Vertex v) + { + Set RC = new HashSet(); + Iterator edges = IUT.getEdges(v).iterator(); + + while (edges.hasNext()) + { + Edge e = (Edge) edges.next(); + + Set verts = IUT.getVertices(e); + RC.addAll(verts); + } + + return RC; + } + + /** + * Description of the Method + */ + public Set makeSet() + { + return new HashSet(); + } + + + /** + * Description of the Method + */ + public Set makeSet(Object v) + { + Set RC = new HashSet(); + RC.add(v); + return RC; + } + + /** + * Description of the Method + */ + public Set makeSet(Object v1, + Object v2) + { + Set RC = makeSet(v1); + RC.add(v2); + return RC; + } + + /** + * Description of the Method + */ + public Set makeSet(Set s1, + Set s2) + { + Set RC = new HashSet(); + RC.addAll(s1); + RC.addAll(s2); + return RC; + } + + /** + * Description of the Method + */ + public Set makeSet(Object v1, + Object v2, + Object v3) + { + return makeSet(makeSet(v1, v2), + makeSet(v3)); + } + + /** + * Description of the Method + */ + public Set makeSet(Object v1, + Object v2, + Object v3, + Object v4) + { + return makeSet(makeSet(v1, v2), + makeSet(v3, v4)); + } + + /** + * Description of the Method + */ + public void verifyAdjVertices(DirectedGraph IUT, + Vertex v, + Set inExpect, + Set outExpect) + { + Set inbound = getInboundVertices(IUT, v); + Set outbound = getOutboundVertices(IUT, v); + + Iterator verts; + + // inbound is a subset of inExpect + verts = inbound.iterator(); + + while (verts.hasNext()) + { + Vertex curr = (Vertex) verts.next(); + + assertTrue(curr.toString() + " is not supposed to be " + + "next to " + v.toString(), + inExpect.contains(curr)); + } + + // inExpect is a subset of inbound + verts = inExpect.iterator(); + + while (verts.hasNext()) + { + Vertex curr = (Vertex) verts.next(); + assertTrue(curr.toString() + " is supposed to be next to " + + v.toString(), + inbound.contains(curr)); + } + + // outbound is a subset of outExpect + verts = outbound.iterator(); + + while (verts.hasNext()) + { + Vertex curr = (Vertex) verts.next(); + + assertTrue(curr.toString() + " is not supposed to be " + + "next to " + v.toString(), + outExpect.contains(curr)); + } + + // outExpect is a subset of outbound + verts = outExpect.iterator(); + + while (verts.hasNext()) + { + Vertex curr = (Vertex) verts.next(); + assertTrue(curr.toString() + " is supposed to be next to " + + v.toString(), + outbound.contains(curr)); + } + + } + + /** + * Description of the Method + */ + public void verifyAdjVertices(Graph IUT, + Vertex v, + Set expected) + throws Throwable + { + Set adjacent = getAdjVertices(IUT, v); + Iterator adjV = adjacent.iterator(); + + while (adjV.hasNext()) + { + Vertex curr = (Vertex) adjV.next(); + assertTrue(curr.toString() + " is not supposed to be " + + "next to " + v.toString(), + expected.contains(curr)); + } + + Iterator expect = expected.iterator(); + + while (expect.hasNext()) + { + Vertex curr = (Vertex) expect.next(); + assertTrue(curr.toString() + " is supposed to be next to " + + v.toString(), + adjacent.contains(curr)); + } + } + + /** + * Description of the Method + */ + public void verifyGraph(Graph g, int numVertex, int numEdge) + throws Throwable + { + assertEquals("Incorrect Number of Vertices.", + numVertex, g.getVertices().size()); + assertEquals("Incorrect Number of Edges.", + numEdge, g.getEdges().size()); + } + + /** + * Description of the Method + */ + public void printGraph(Throwable t, + DirectedGraph IUT) + { + System.err.println(testName + ": " + t.toString()); + System.err.println("VERTICES: " + IUT.getVertices()); + System.err.println("EDGES: " + IUT.getEdges()); + + Iterator verts = IUT.getVertices().iterator(); + while (verts.hasNext()) + { + Vertex vert = (Vertex) verts.next(); + System.err.println("[ " + vert + " ]"); + + Iterator inbounds = IUT.getInbound(vert).iterator(); + while (inbounds.hasNext()) + { + Edge inbound = (Edge) inbounds.next(); + System.err.println("\tI [" + inbound + "]"); + } + + Iterator outbounds = IUT.getOutbound(vert).iterator(); + while (outbounds.hasNext()) + { + Edge outbound = (Edge) outbounds.next(); + System.err.println("\tO [" + outbound + "]"); + } + } + } + +} diff --git a/src/test/org/apache/commons/graph/UndirGraphTest.java b/src/test/org/apache/commons/graph/UndirGraphTest.java index 1728e00..c5c2982 100644 --- a/src/test/org/apache/commons/graph/UndirGraphTest.java +++ b/src/test/org/apache/commons/graph/UndirGraphTest.java @@ -1,379 +1,375 @@ -package org.apache.commons.graph; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -/** - * GraphTest This test will ensure that we can indeed represent a graph. We will - * implement the following graphs. () No Vertex, No Edges @ One Vertex, No Edges - * @ @ Two Vertices, No Edges @-@ Two Vertices, One edge /-\ @ @ Two Vertices, - * Two Edges (Parallel Edges) \-/ @ / \ Three Vertices, Three Edges (Cycle) - * @---@ @--@--@ Three Vertices, Two Edges (No Cycle) @ / \ @ @ 5 Vertices, 4 - * Edges (Tree) / \ @ @ @-@ @-@ 4 Vertices, 2 Edges (Disconnected) - */ - -import java.util.Set; -import java.util.Map; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; - -import junit.framework.*; - -/** - * Description of the Class - */ -public class UndirGraphTest extends GraphTest -{ - /** - * Constructor for the UndirGraphTest object - * - * @param name - */ - public UndirGraphTest(String name) - { - super(name); - } - - /** - * Test the NULL Graph. - */ - public void testNullGraph() - throws Throwable - { - verifyGraph(makeNullGraph(), 0, 0); - } - - - /** - * Test the Single Vertex. - */ - public void testSingleVertex() - throws Throwable - { - verifyGraph(makeSingleVertex(), 1, 0); - } - - /** - * Tests Double Vertex graph. - */ - public void testDoubleVertex() - throws Throwable - { - verifyGraph(makeDoubleVertex(), 2, 0); - } - - /** - * Test Single Edge Graph. - */ - public void testSingleEdge() - throws Throwable - { - Graph IUT = makeSingleEdge(); - - verifyGraph(IUT, 2, 1); - - // Verify Edge from Vertex Count - verifyVertexEdgeCount(IUT, V1, 1); - verifyVertexEdgeCount(IUT, V2, 1); - - Set expectV1 = new HashSet(); - expectV1.add(V2); - - verifyAdjVertices(IUT, V1, expectV1); - - Set expectV2 = new HashSet(); - expectV2.add(V1); - - verifyAdjVertices(IUT, V2, expectV2); - } - - /** - * Test Parallel Edges, make sure the representation is right. - */ - public void testParallelEdges() - throws Throwable - { - Graph IUT = makeParallelEdges(); - - verifyGraph(IUT, 2, 2); - - // Verify Edge from Vertex Count - verifyVertexEdgeCount(IUT, V1, 2); - verifyVertexEdgeCount(IUT, V2, 2); - - // Verify Adjacent Vertex - Set expectV1 = new HashSet(); - Set expectV2 = new HashSet(); - - expectV1.add(V2); - expectV2.add(V1); - - verifyAdjVertices(IUT, V1, expectV1); - verifyAdjVertices(IUT, V2, expectV2); - - } - - /** - * Test the Cycle Graph. - */ - public void testCycle() - throws Throwable - { - Graph IUT = makeCycle(); - - verifyGraph(IUT, 3, 3); - - // Verify Edge from Vertex Count - verifyVertexEdgeCount(IUT, V1, 2); - verifyVertexEdgeCount(IUT, V2, 2); - verifyVertexEdgeCount(IUT, V3, 2); - - // Verify Adjacent Vertex - Set expectV1 = new HashSet(); - Set expectV2 = new HashSet(); - Set expectV3 = new HashSet(); - - expectV1.add(V2); - expectV1.add(V3); - expectV2.add(V1); - expectV2.add(V3); - expectV3.add(V1); - expectV3.add(V2); - - verifyAdjVertices(IUT, V1, expectV1); - verifyAdjVertices(IUT, V2, expectV2); - verifyAdjVertices(IUT, V3, expectV3); - } - - /** - * Test the No Cycle Graph. - */ - public void testNoCycle() - throws Throwable - { - Graph IUT = makeNoCycle(); - - verifyGraph(IUT, 3, 2); - - // Verify Edge from Vertex Count - verifyVertexEdgeCount(IUT, V1, 1); - verifyVertexEdgeCount(IUT, V2, 2); - verifyVertexEdgeCount(IUT, V3, 1); - - // Verify Adjacent Vertex - Set expectV1 = new HashSet(); - Set expectV2 = new HashSet(); - Set expectV3 = new HashSet(); - - expectV1.add(V2); - expectV2.add(V1); - expectV2.add(V3); - expectV3.add(V2); - - verifyAdjVertices(IUT, V1, expectV1); - verifyAdjVertices(IUT, V2, expectV2); - verifyAdjVertices(IUT, V3, expectV3); - } - - /** - * Test the Tree Graph. - */ - public void testTree() - throws Throwable - { - Graph IUT = makeTree(); - - verifyGraph(IUT, 5, 4); - - // Verify Edge from Vertex Count - verifyVertexEdgeCount(IUT, V1, 2); - verifyVertexEdgeCount(IUT, V2, 1); - verifyVertexEdgeCount(IUT, V3, 3); - verifyVertexEdgeCount(IUT, V4, 1); - verifyVertexEdgeCount(IUT, V5, 1); - - // Verify Adjacent Vertex - Set expectV1 = new HashSet(); - Set expectV2 = new HashSet(); - Set expectV3 = new HashSet(); - Set expectV4 = new HashSet(); - Set expectV5 = new HashSet(); - - expectV1.add(V2); - expectV1.add(V3); - expectV2.add(V1); - expectV3.add(V1); - expectV3.add(V4); - expectV3.add(V5); - expectV4.add(V3); - expectV5.add(V3); - - verifyAdjVertices(IUT, V1, expectV1); - verifyAdjVertices(IUT, V2, expectV2); - verifyAdjVertices(IUT, V3, expectV3); - verifyAdjVertices(IUT, V4, expectV4); - verifyAdjVertices(IUT, V5, expectV5); - } - - /** - * Test the Disconnected Graph. - */ - public void testDisconnected() - throws Throwable - { - Graph IUT = makeDisconnected(); - - verifyGraph(IUT, 4, 2); - - // Verify Edge from Vertex Count - verifyVertexEdgeCount(IUT, V1, 1); - verifyVertexEdgeCount(IUT, V2, 1); - verifyVertexEdgeCount(IUT, V3, 1); - verifyVertexEdgeCount(IUT, V4, 1); - - // Verify Adjacent Vertex - Set expectV1 = new HashSet(); - Set expectV2 = new HashSet(); - Set expectV3 = new HashSet(); - Set expectV4 = new HashSet(); - - expectV1.add(V2); - expectV2.add(V1); - expectV3.add(V4); - expectV4.add(V3); - - verifyAdjVertices(IUT, V1, expectV1); - verifyAdjVertices(IUT, V2, expectV2); - verifyAdjVertices(IUT, V3, expectV3); - verifyAdjVertices(IUT, V4, expectV4); - } - - - /** - * Description of the Method - */ - public void verifyVertexEdgeCount(Graph IUT, - Vertex v, - int numEdge) - throws Throwable - { - assertEquals(v.toString() + " has wrong number of adjacent edges.", - IUT.getEdges(v).size(), numEdge); - } - - /** - * Gets the adjVertices attribute of the UndirGraphTest object - */ - private Set getAdjVertices(Graph IUT, - Vertex v) - { - Set RC = new HashSet(); - Iterator edges = IUT.getEdges(v).iterator(); - - while (edges.hasNext()) - { - Edge e = (Edge) edges.next(); - - Set verts = IUT.getVertices(e); - verts.remove(v); - RC.addAll(verts); - } - - return RC; - } - - /** - * Description of the Method - */ - public void verifyAdjVertices(Graph IUT, - Vertex v, - Set expected) - throws Throwable - { - Set adjacent = getAdjVertices(IUT, v); - Iterator adjV = adjacent.iterator(); - - while (adjV.hasNext()) - { - Vertex curr = (Vertex) adjV.next(); - - assertTrue(curr.toString() + " is not supposed to be " + - "next to " + v.toString(), - expected.contains(curr)); - } - - Iterator expect = expected.iterator(); - - while (expect.hasNext()) - { - Vertex curr = (Vertex) expect.next(); - - assertTrue(curr.toString() + " is supposed to be next to " + - v.toString(), - adjacent.contains(curr)); - } - } - - /** - * Description of the Method - */ - public void verifyGraph(Graph g, int numVertex, int numEdge) - throws Throwable - { - assertEquals("Incorrect Number of Vertices.", - g.getVertices().size(), numVertex); - assertEquals("Incorrect Number of Edges.", - g.getEdges().size(), numEdge); - } -} +package org.apache.commons.graph; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +/** + * GraphTest This test will ensure that we can indeed represent a graph. We will + * implement the following graphs. () No Vertex, No Edges @ One Vertex, No Edges + * @ @ Two Vertices, No Edges @-@ Two Vertices, One edge /-\ @ @ Two Vertices, + * Two Edges (Parallel Edges) \-/ @ / \ Three Vertices, Three Edges (Cycle) + * @---@ @--@--@ Three Vertices, Two Edges (No Cycle) @ / \ @ @ 5 Vertices, 4 + * Edges (Tree) / \ @ @ @-@ @-@ 4 Vertices, 2 Edges (Disconnected) + */ + +import java.util.Set; +import java.util.HashSet; +import java.util.Iterator; + +/** + * Description of the Class + */ +public class UndirGraphTest extends GraphTest +{ + /** + * Constructor for the UndirGraphTest object + * + * @param name + */ + public UndirGraphTest(String name) + { + super(name); + } + + /** + * Test the NULL Graph. + */ + public void testNullGraph() + throws Throwable + { + verifyGraph(makeNullGraph(), 0, 0); + } + + + /** + * Test the Single Vertex. + */ + public void testSingleVertex() + throws Throwable + { + verifyGraph(makeSingleVertex(), 1, 0); + } + + /** + * Tests Double Vertex graph. + */ + public void testDoubleVertex() + throws Throwable + { + verifyGraph(makeDoubleVertex(), 2, 0); + } + + /** + * Test Single Edge Graph. + */ + public void testSingleEdge() + throws Throwable + { + Graph IUT = makeSingleEdge(); + + verifyGraph(IUT, 2, 1); + + // Verify Edge from Vertex Count + verifyVertexEdgeCount(IUT, V1, 1); + verifyVertexEdgeCount(IUT, V2, 1); + + Set expectV1 = new HashSet(); + expectV1.add(V2); + + verifyAdjVertices(IUT, V1, expectV1); + + Set expectV2 = new HashSet(); + expectV2.add(V1); + + verifyAdjVertices(IUT, V2, expectV2); + } + + /** + * Test Parallel Edges, make sure the representation is right. + */ + public void testParallelEdges() + throws Throwable + { + Graph IUT = makeParallelEdges(); + + verifyGraph(IUT, 2, 2); + + // Verify Edge from Vertex Count + verifyVertexEdgeCount(IUT, V1, 2); + verifyVertexEdgeCount(IUT, V2, 2); + + // Verify Adjacent Vertex + Set expectV1 = new HashSet(); + Set expectV2 = new HashSet(); + + expectV1.add(V2); + expectV2.add(V1); + + verifyAdjVertices(IUT, V1, expectV1); + verifyAdjVertices(IUT, V2, expectV2); + + } + + /** + * Test the Cycle Graph. + */ + public void testCycle() + throws Throwable + { + Graph IUT = makeCycle(); + + verifyGraph(IUT, 3, 3); + + // Verify Edge from Vertex Count + verifyVertexEdgeCount(IUT, V1, 2); + verifyVertexEdgeCount(IUT, V2, 2); + verifyVertexEdgeCount(IUT, V3, 2); + + // Verify Adjacent Vertex + Set expectV1 = new HashSet(); + Set expectV2 = new HashSet(); + Set expectV3 = new HashSet(); + + expectV1.add(V2); + expectV1.add(V3); + expectV2.add(V1); + expectV2.add(V3); + expectV3.add(V1); + expectV3.add(V2); + + verifyAdjVertices(IUT, V1, expectV1); + verifyAdjVertices(IUT, V2, expectV2); + verifyAdjVertices(IUT, V3, expectV3); + } + + /** + * Test the No Cycle Graph. + */ + public void testNoCycle() + throws Throwable + { + Graph IUT = makeNoCycle(); + + verifyGraph(IUT, 3, 2); + + // Verify Edge from Vertex Count + verifyVertexEdgeCount(IUT, V1, 1); + verifyVertexEdgeCount(IUT, V2, 2); + verifyVertexEdgeCount(IUT, V3, 1); + + // Verify Adjacent Vertex + Set expectV1 = new HashSet(); + Set expectV2 = new HashSet(); + Set expectV3 = new HashSet(); + + expectV1.add(V2); + expectV2.add(V1); + expectV2.add(V3); + expectV3.add(V2); + + verifyAdjVertices(IUT, V1, expectV1); + verifyAdjVertices(IUT, V2, expectV2); + verifyAdjVertices(IUT, V3, expectV3); + } + + /** + * Test the Tree Graph. + */ + public void testTree() + throws Throwable + { + Graph IUT = makeTree(); + + verifyGraph(IUT, 5, 4); + + // Verify Edge from Vertex Count + verifyVertexEdgeCount(IUT, V1, 2); + verifyVertexEdgeCount(IUT, V2, 1); + verifyVertexEdgeCount(IUT, V3, 3); + verifyVertexEdgeCount(IUT, V4, 1); + verifyVertexEdgeCount(IUT, V5, 1); + + // Verify Adjacent Vertex + Set expectV1 = new HashSet(); + Set expectV2 = new HashSet(); + Set expectV3 = new HashSet(); + Set expectV4 = new HashSet(); + Set expectV5 = new HashSet(); + + expectV1.add(V2); + expectV1.add(V3); + expectV2.add(V1); + expectV3.add(V1); + expectV3.add(V4); + expectV3.add(V5); + expectV4.add(V3); + expectV5.add(V3); + + verifyAdjVertices(IUT, V1, expectV1); + verifyAdjVertices(IUT, V2, expectV2); + verifyAdjVertices(IUT, V3, expectV3); + verifyAdjVertices(IUT, V4, expectV4); + verifyAdjVertices(IUT, V5, expectV5); + } + + /** + * Test the Disconnected Graph. + */ + public void testDisconnected() + throws Throwable + { + Graph IUT = makeDisconnected(); + + verifyGraph(IUT, 4, 2); + + // Verify Edge from Vertex Count + verifyVertexEdgeCount(IUT, V1, 1); + verifyVertexEdgeCount(IUT, V2, 1); + verifyVertexEdgeCount(IUT, V3, 1); + verifyVertexEdgeCount(IUT, V4, 1); + + // Verify Adjacent Vertex + Set expectV1 = new HashSet(); + Set expectV2 = new HashSet(); + Set expectV3 = new HashSet(); + Set expectV4 = new HashSet(); + + expectV1.add(V2); + expectV2.add(V1); + expectV3.add(V4); + expectV4.add(V3); + + verifyAdjVertices(IUT, V1, expectV1); + verifyAdjVertices(IUT, V2, expectV2); + verifyAdjVertices(IUT, V3, expectV3); + verifyAdjVertices(IUT, V4, expectV4); + } + + + /** + * Description of the Method + */ + public void verifyVertexEdgeCount(Graph IUT, + Vertex v, + int numEdge) + throws Throwable + { + assertEquals(v.toString() + " has wrong number of adjacent edges.", + IUT.getEdges(v).size(), numEdge); + } + + /** + * Gets the adjVertices attribute of the UndirGraphTest object + */ + private Set getAdjVertices(Graph IUT, + Vertex v) + { + Set RC = new HashSet(); + Iterator edges = IUT.getEdges(v).iterator(); + + while (edges.hasNext()) + { + Edge e = (Edge) edges.next(); + + Set verts = IUT.getVertices(e); + verts.remove(v); + RC.addAll(verts); + } + + return RC; + } + + /** + * Description of the Method + */ + public void verifyAdjVertices(Graph IUT, + Vertex v, + Set expected) + throws Throwable + { + Set adjacent = getAdjVertices(IUT, v); + Iterator adjV = adjacent.iterator(); + + while (adjV.hasNext()) + { + Vertex curr = (Vertex) adjV.next(); + + assertTrue(curr.toString() + " is not supposed to be " + + "next to " + v.toString(), + expected.contains(curr)); + } + + Iterator expect = expected.iterator(); + + while (expect.hasNext()) + { + Vertex curr = (Vertex) expect.next(); + + assertTrue(curr.toString() + " is supposed to be next to " + + v.toString(), + adjacent.contains(curr)); + } + } + + /** + * Description of the Method + */ + public void verifyGraph(Graph g, int numVertex, int numEdge) + throws Throwable + { + assertEquals("Incorrect Number of Vertices.", + g.getVertices().size(), numVertex); + assertEquals("Incorrect Number of Edges.", + g.getEdges().size(), numEdge); + } +} diff --git a/src/test/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java b/src/test/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java index 8a657f7..edfa6d6 100644 --- a/src/test/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java +++ b/src/test/org/apache/commons/graph/algorithm/dataflow/DataFlowSolutionsTest.java @@ -58,8 +58,6 @@ import org.apache.commons.graph.*; import java.util.BitSet; -import junit.framework.*; - public class DataFlowSolutionsTest extends GraphTest { private static BitSet BS_000 = null; private static BitSet BS_001 = null; diff --git a/src/test/org/apache/commons/graph/algorithm/path/AllPairsTest.java b/src/test/org/apache/commons/graph/algorithm/path/AllPairsTest.java index 502382e..1856953 100644 --- a/src/test/org/apache/commons/graph/algorithm/path/AllPairsTest.java +++ b/src/test/org/apache/commons/graph/algorithm/path/AllPairsTest.java @@ -1,567 +1,564 @@ -package org.apache.commons.graph.algorithm.path; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -/** - * AllPairsTest This tests the All Pairs Shortest Path solution. - */ - -import org.apache.commons.graph.*; -import org.apache.commons.graph.exception.*; - -import java.util.List; -import java.util.Iterator; - -import junit.framework.*; - -/** - * Description of the Class - */ -public class AllPairsTest - extends WeightedGraphTest -{ - /** - * Constructor for the AllPairsTest object - * - * @param name - */ - public AllPairsTest(String name) - { - super(name); - } - - /** - * A unit test for JUnit - */ - public void testAPWDirectedEdge() - throws Throwable - { - DirectedGraph g = makeWDirectedEdge(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 5.0, 2, 1); - try - { - IUT.getShortestPath(V2, V1); - fail("NoPathException not thrown."); - } - catch (NoPathException ex) - {} - } - - /** - * A unit test for JUnit - */ - public void testAPPositiveCycle() - throws Throwable - { - DirectedGraph g = makePositiveCycle(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 2.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V3), - V2, V3, V2, V2_V3, - 4.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V3, V1), - V3, V1, V3, V3_V1, - 1.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V2, V1_V2, - 6.0, 3, 2); - verifyPath(g, IUT.getShortestPath(V2, V1), - V2, V1, V3, V2_V3, - 5.5, 3, 2); - verifyPath(g, IUT.getShortestPath(V3, V2), - V3, V2, V1, V1_V2, - 3.5, 3, 2); - } - - /** - * A unit test for JUnit - */ - public void testAPPositivePartNegCycle() - throws Throwable - { - DirectedGraph g = makePositivePartNegCycle(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 2.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V3), - V2, V3, V2, V2_V3, - 4.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V3, V1), - V3, V1, V3, V3_V1, - -1.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V2, V2_V3, - 6.0, 3, 2); - verifyPath(g, IUT.getShortestPath(V2, V1), - V2, V1, V3, V2_V3, - 2.5, 3, 2); - verifyPath(g, IUT.getShortestPath(V3, V2), - V3, V2, V1, V1_V2, - 0.5, 3, 2); - } - - /** - * A unit test for JUnit - */ - public void testAPNegativeCycle() - throws Throwable - { - try - { - AllPairsShortestPath IUT = new AllPairsShortestPath(makeNegativeCycle()); - fail("NegativeCycleException not thrown."); - } - catch (NegativeCycleException ex) - {} - } - - /** - * A unit test for JUnit - */ - public void testAPNegativePartPosCycle() - throws Throwable - { - try - { - AllPairsShortestPath IUT = new AllPairsShortestPath(makeNegativePartPosCycle()); - fail("NegativeCycleException not thrown."); - } - catch (NegativeCycleException ex) - {} - } - - /* - * Test Pipes now. . . - */ - /** - * A unit test for JUnit - */ - public void testAPPositivePipe() - throws Throwable - { - DirectedGraph g = makePositivePipe(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V3), - V2, V3, V2, V2_V3, - 3.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V2, V1_V2, - 5.0, 3, 2); - - } - - /** - * A unit test for JUnit - */ - public void testAPPositivePartNegPipe() - throws Throwable - { - DirectedGraph g = makePositivePartNegPipe(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - -1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V3), - V2, V3, V2, V2_V3, - 3.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V2, V2_V3, - 2.0, 3, 2); - - } - - /** - * A unit test for JUnit - */ - public void testAPNegativePipe() - throws Throwable - { - DirectedGraph g = makeNegativePipe(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - -1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V3), - V2, V3, V2, V2_V3, - -3.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V2, V1_V2, - -5.0, 3, 2); - - } - - /** - * A unit test for JUnit - */ - public void testAPNegativePartPosPipe() - throws Throwable - { - DirectedGraph g = makeNegativePartPosPipe(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V3), - V2, V3, V2, V2_V3, - -3.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V2, V1_V2, - -2.0, 3, 2); - - } - - /** - * A unit test for JUnit - */ - public void testMultiplePathL() - throws Throwable - { - DirectedGraph g = makeMultiplePathL(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V4, V4), - V4, V4, V4, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V1, V1_V3, - 2.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V4), - V2, V4, V2, V2_V4, - 1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V3, V4), - V3, V4, V3, V3_V4, - 3.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V4), - V1, V4, V2, V1_V2, - 3.0, 3, 2); - } - - /** - * A unit test for JUnit - */ - public void testMultiplePathR() - throws Throwable - { - DirectedGraph g = makeMultiplePathR(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V4, V4), - V4, V4, V4, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 3.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V1, V1_V3, - 1.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V4), - V2, V4, V2, V2_V4, - 2.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V3, V4), - V3, V4, V3, V3_V4, - 1.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V4), - V1, V4, V3, V1_V3, - 3.0, 3, 2); - } - - /** - * A unit test for JUnit - */ - public void testMultiplePathEarlyLow() - throws Throwable - { - DirectedGraph g = makeMultiplePathEarlyLow(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V4, V4), - V4, V4, V4, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 10.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V1, V1_V3, - 0.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V4), - V2, V4, V2, V2_V4, - 10.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V3, V4), - V3, V4, V3, V3_V4, - 10.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V4), - V1, V4, V3, V3_V4, - 11.0, 3, 2); - } - - /** - * A unit test for JUnit - */ - public void testMultiplePathEarlyHigh() - throws Throwable - { - DirectedGraph g = makeMultiplePathEarlyHigh(); - AllPairsShortestPath IUT = new AllPairsShortestPath(g); - - verifyPath(g, IUT.getShortestPath(V1, V1), - V1, V1, V1, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V2, V2), - V2, V2, V2, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V3, V3), - V3, V3, V3, - 0.0, 1, 0); - verifyPath(g, IUT.getShortestPath(V4, V4), - V4, V4, V4, - 0.0, 1, 0); - - verifyPath(g, IUT.getShortestPath(V1, V2), - V1, V2, V1, V1_V2, - 10.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V1, V3), - V1, V3, V1, V1_V3, - 10.5, 2, 1); - verifyPath(g, IUT.getShortestPath(V2, V4), - V2, V4, V2, V2_V4, - 10.0, 2, 1); - verifyPath(g, IUT.getShortestPath(V3, V4), - V3, V4, V3, V3_V4, - 0.5, 2, 1); - - verifyPath(g, IUT.getShortestPath(V1, V4), - V1, V4, V3, V1_V3, - 11.0, 3, 2); - } - - /** - * Description of the Method - */ - public void verifyPath(DirectedGraph g, WeightedPath wp, - Vertex start, Vertex end, Vertex mid, - double cost, int vertexCount, int edgeCount) - throws Throwable - { - verifyPath(g, wp, start, end, mid, - null, cost, vertexCount, edgeCount); - } - - /** - * Description of the Method - */ - public void verifyPath(DirectedGraph g, WeightedPath wp, - Vertex start, Vertex end, Vertex mid, Edge midE, - double cost, int vertexCount, int edgeCount) - throws Throwable - { - assertEquals("Wrong Start", - start, wp.getStart()); - assertEquals("Wrong End", - end, wp.getEnd()); - assertEquals("Wrong Cost of Path: " + start + "->" + end, - cost, wp.getWeight(), 0.0001); - assertEquals("Wrong number of Vertices in " + start + "->" + end, - vertexCount, wp.getVertices().size()); - assertEquals("Wrong number of Edges in " + start + "->" + end, - edgeCount, wp.getEdges().size()); - assertTrue("Path " + start + "->" + end + " doesn't contain: " + mid, - wp.getVertices().contains(mid)); - if (midE != null) - { - assertTrue("Path " + start + "-> " + end + " doesn't contain edge: " + midE, - wp.getEdges().contains(midE)); - } - - List edgeList = wp.getEdges(); - List vertList = wp.getVertices(); - - for (int i = 0; i < edgeList.size(); i++) - { - assertEquals("Edge: " + edgeList.get(i) + " doesn't use " + - vertList.get(i) + " as source.", - g.getSource((Edge) edgeList.get(i)), - (Vertex) vertList.get(i)); - assertEquals("Edge: " + edgeList.get(i) + " doesn't use " + - vertList.get(i) + " as target.", - g.getTarget((Edge) edgeList.get(i)), - (Vertex) vertList.get(i + 1)); - } - } -} +package org.apache.commons.graph.algorithm.path; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * AllPairsTest This tests the All Pairs Shortest Path solution. + */ + +import org.apache.commons.graph.*; +import org.apache.commons.graph.exception.*; + +import java.util.List; + +/** + * Description of the Class + */ +public class AllPairsTest + extends WeightedGraphTest +{ + /** + * Constructor for the AllPairsTest object + * + * @param name + */ + public AllPairsTest(String name) + { + super(name); + } + + /** + * A unit test for JUnit + */ + public void testAPWDirectedEdge() + throws Throwable + { + DirectedGraph g = makeWDirectedEdge(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 5.0, 2, 1); + try + { + IUT.getShortestPath(V2, V1); + fail("NoPathException not thrown."); + } + catch (NoPathException ex) + {} + } + + /** + * A unit test for JUnit + */ + public void testAPPositiveCycle() + throws Throwable + { + DirectedGraph g = makePositiveCycle(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 2.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V3), + V2, V3, V2, V2_V3, + 4.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V3, V1), + V3, V1, V3, V3_V1, + 1.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V2, V1_V2, + 6.0, 3, 2); + verifyPath(g, IUT.getShortestPath(V2, V1), + V2, V1, V3, V2_V3, + 5.5, 3, 2); + verifyPath(g, IUT.getShortestPath(V3, V2), + V3, V2, V1, V1_V2, + 3.5, 3, 2); + } + + /** + * A unit test for JUnit + */ + public void testAPPositivePartNegCycle() + throws Throwable + { + DirectedGraph g = makePositivePartNegCycle(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 2.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V3), + V2, V3, V2, V2_V3, + 4.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V3, V1), + V3, V1, V3, V3_V1, + -1.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V2, V2_V3, + 6.0, 3, 2); + verifyPath(g, IUT.getShortestPath(V2, V1), + V2, V1, V3, V2_V3, + 2.5, 3, 2); + verifyPath(g, IUT.getShortestPath(V3, V2), + V3, V2, V1, V1_V2, + 0.5, 3, 2); + } + + /** + * A unit test for JUnit + */ + public void testAPNegativeCycle() + throws Throwable + { + try + { + AllPairsShortestPath IUT = new AllPairsShortestPath(makeNegativeCycle()); + fail("NegativeCycleException not thrown."); + } + catch (NegativeCycleException ex) + {} + } + + /** + * A unit test for JUnit + */ + public void testAPNegativePartPosCycle() + throws Throwable + { + try + { + AllPairsShortestPath IUT = new AllPairsShortestPath(makeNegativePartPosCycle()); + fail("NegativeCycleException not thrown."); + } + catch (NegativeCycleException ex) + {} + } + + /* + * Test Pipes now. . . + */ + /** + * A unit test for JUnit + */ + public void testAPPositivePipe() + throws Throwable + { + DirectedGraph g = makePositivePipe(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V3), + V2, V3, V2, V2_V3, + 3.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V2, V1_V2, + 5.0, 3, 2); + + } + + /** + * A unit test for JUnit + */ + public void testAPPositivePartNegPipe() + throws Throwable + { + DirectedGraph g = makePositivePartNegPipe(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + -1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V3), + V2, V3, V2, V2_V3, + 3.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V2, V2_V3, + 2.0, 3, 2); + + } + + /** + * A unit test for JUnit + */ + public void testAPNegativePipe() + throws Throwable + { + DirectedGraph g = makeNegativePipe(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + -1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V3), + V2, V3, V2, V2_V3, + -3.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V2, V1_V2, + -5.0, 3, 2); + + } + + /** + * A unit test for JUnit + */ + public void testAPNegativePartPosPipe() + throws Throwable + { + DirectedGraph g = makeNegativePartPosPipe(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V3), + V2, V3, V2, V2_V3, + -3.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V2, V1_V2, + -2.0, 3, 2); + + } + + /** + * A unit test for JUnit + */ + public void testMultiplePathL() + throws Throwable + { + DirectedGraph g = makeMultiplePathL(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V4, V4), + V4, V4, V4, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V1, V1_V3, + 2.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V4), + V2, V4, V2, V2_V4, + 1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V3, V4), + V3, V4, V3, V3_V4, + 3.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V4), + V1, V4, V2, V1_V2, + 3.0, 3, 2); + } + + /** + * A unit test for JUnit + */ + public void testMultiplePathR() + throws Throwable + { + DirectedGraph g = makeMultiplePathR(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V4, V4), + V4, V4, V4, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 3.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V1, V1_V3, + 1.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V4), + V2, V4, V2, V2_V4, + 2.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V3, V4), + V3, V4, V3, V3_V4, + 1.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V4), + V1, V4, V3, V1_V3, + 3.0, 3, 2); + } + + /** + * A unit test for JUnit + */ + public void testMultiplePathEarlyLow() + throws Throwable + { + DirectedGraph g = makeMultiplePathEarlyLow(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V4, V4), + V4, V4, V4, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 10.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V1, V1_V3, + 0.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V4), + V2, V4, V2, V2_V4, + 10.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V3, V4), + V3, V4, V3, V3_V4, + 10.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V4), + V1, V4, V3, V3_V4, + 11.0, 3, 2); + } + + /** + * A unit test for JUnit + */ + public void testMultiplePathEarlyHigh() + throws Throwable + { + DirectedGraph g = makeMultiplePathEarlyHigh(); + AllPairsShortestPath IUT = new AllPairsShortestPath(g); + + verifyPath(g, IUT.getShortestPath(V1, V1), + V1, V1, V1, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V2, V2), + V2, V2, V2, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V3, V3), + V3, V3, V3, + 0.0, 1, 0); + verifyPath(g, IUT.getShortestPath(V4, V4), + V4, V4, V4, + 0.0, 1, 0); + + verifyPath(g, IUT.getShortestPath(V1, V2), + V1, V2, V1, V1_V2, + 10.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V1, V3), + V1, V3, V1, V1_V3, + 10.5, 2, 1); + verifyPath(g, IUT.getShortestPath(V2, V4), + V2, V4, V2, V2_V4, + 10.0, 2, 1); + verifyPath(g, IUT.getShortestPath(V3, V4), + V3, V4, V3, V3_V4, + 0.5, 2, 1); + + verifyPath(g, IUT.getShortestPath(V1, V4), + V1, V4, V3, V1_V3, + 11.0, 3, 2); + } + + /** + * Description of the Method + */ + public void verifyPath(DirectedGraph g, WeightedPath wp, + Vertex start, Vertex end, Vertex mid, + double cost, int vertexCount, int edgeCount) + throws Throwable + { + verifyPath(g, wp, start, end, mid, + null, cost, vertexCount, edgeCount); + } + + /** + * Description of the Method + */ + public void verifyPath(DirectedGraph g, WeightedPath wp, + Vertex start, Vertex end, Vertex mid, Edge midE, + double cost, int vertexCount, int edgeCount) + throws Throwable + { + assertEquals("Wrong Start", + start, wp.getStart()); + assertEquals("Wrong End", + end, wp.getEnd()); + assertEquals("Wrong Cost of Path: " + start + "->" + end, + cost, wp.getWeight(), 0.0001); + assertEquals("Wrong number of Vertices in " + start + "->" + end, + vertexCount, wp.getVertices().size()); + assertEquals("Wrong number of Edges in " + start + "->" + end, + edgeCount, wp.getEdges().size()); + assertTrue("Path " + start + "->" + end + " doesn't contain: " + mid, + wp.getVertices().contains(mid)); + if (midE != null) + { + assertTrue("Path " + start + "-> " + end + " doesn't contain edge: " + midE, + wp.getEdges().contains(midE)); + } + + List edgeList = wp.getEdges(); + List vertList = wp.getVertices(); + + for (int i = 0; i < edgeList.size(); i++) + { + assertEquals("Edge: " + edgeList.get(i) + " doesn't use " + + vertList.get(i) + " as source.", + g.getSource((Edge) edgeList.get(i)), + (Vertex) vertList.get(i)); + assertEquals("Edge: " + edgeList.get(i) + " doesn't use " + + vertList.get(i) + " as target.", + g.getTarget((Edge) edgeList.get(i)), + (Vertex) vertList.get(i + 1)); + } + } +} diff --git a/src/test/org/apache/commons/graph/algorithm/path/AllPathsTest.java b/src/test/org/apache/commons/graph/algorithm/path/AllPathsTest.java index 6f47fa5..f7241c4 100644 --- a/src/test/org/apache/commons/graph/algorithm/path/AllPathsTest.java +++ b/src/test/org/apache/commons/graph/algorithm/path/AllPathsTest.java @@ -1,492 +1,488 @@ -package org.apache.commons.graph.algorithm.path; - -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Apache" and "Apache Software Foundation" and - * "Commons" must not be used to endorse or promote products - * derived from this software without prior written permission. For - * written permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * "Commons", nor may "Apache" appear in their name, without - * prior written permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -/** - * AllPathsTest This tests the All Pairs Shortest Path solution. - */ - -import org.apache.commons.graph.*; -import org.apache.commons.graph.exception.*; - -import java.util.Set; -import java.util.List; -import java.util.Random; -import java.util.HashSet; -import java.util.Iterator; -import java.util.AbstractSet; - -import junit.framework.*; - -/** - * Description of the Class - */ -public class AllPathsTest - extends GraphTest -{ - /** - * PathCollector - * - * This is the thing that collects Callbacks. - */ - public class PathCollector - extends AbstractSet - implements PathListener, - Set - { - private Set paths = new HashSet(); - - public PathCollector() { } - - public void notifyPath( Path path ) { - paths.add( path ); - } - - public int size() { - return paths.size(); - } - - public Iterator iterator() { - return paths.iterator(); - } - } - - private String name = null; - private Random random = new Random(); - - /** - * Constructor for the AllPathsTest object - * - * @param name - */ - public AllPathsTest(String name) - { - super(name); - this.name = name; - } - - public void testSelfLoop() throws Throwable { - AllPaths IUT = new AllPaths( makeSelfLoop() ); - verifyPathCount( IUT, V1, V1, 1, 1 ); - - // Make sure it works with 0. . . - verifyPathCount( IUT, V1, V1, 0, 0 ); - - for (int i = 0; i < 5; i++) { - int r = random.nextInt( 50 ); - verifyPathCount( IUT, V1, V1, r, r ); - - Iterator iter = IUT.findPaths( V1, V1 ); - for (int j = 0; j < r; j++) { - Path path = (Path) iter.next(); - - assertEquals( "Path wrong size.", - j + 2, path.size() ); - } - } - - } - - public void testDirDoubleVertex() - throws Throwable { - AllPaths IUT = new AllPaths( makeDirDoubleVertex() ); - - verifyPathCount( IUT, V1, V1, 0, 2 ); - verifyPathCount( IUT, V2, V2, 0, 2 ); - - verifyPathCount( IUT, V1, V2, 0, 2 ); - verifyPathCount( IUT, V2, V1, 0, 2 ); - } - - /** - * A unit test for JUnit - */ - public void testDirectedEdge() - throws Throwable - { - DirectedGraph g = makeDirectedEdge(); - final AllPaths IUT = new AllPaths(g); - - verifyPathCount( IUT, V1, V1, 0, 2 ); - verifyPathCount( IUT, V2, V2, 0, 2 ); - - verifyPathCount( IUT, V2, V1, 0, 2 ); - verifyPathCount( IUT, V1, V2, 1, 2 ); - - verifyPathCount( IUT, V1, V2, 1, 1 ); - - // Make sure that no matter how big it - // is, it still only returns 1 path. - for (int i = 0; i < 5; i++) { - int r = random.nextInt( 50 ); - - r += 5; - verifyPathCount( IUT, V1, V2, 1, r ); - - } - - verifyHasNextFalse( IUT, V1, V2 ); - } - - public void testDirParallelEdges() throws Throwable { - AllPaths IUT = new AllPaths( makeDirParallelEdges() ); - verifyPathCount( IUT, V1, V1, 0, 2 ); - verifyPathCount( IUT, V2, V2, 0, 2 ); - - verifyPathCount( IUT, V1, V2, 2, 2 ); - verifyPathCount( IUT, V2, V1, 0, 2 ); - } - - public void testTwoCycle() throws Throwable { - AllPaths IUT = new AllPaths( makeTwoCycle() ); - verifyPathCount( IUT, V1, V1, 1, 2 ); - verifyPathCount( IUT, V2, V2, 1, 2 ); - - - verifyPathCount( IUT, V1, V2, 1, 2 ); - verifyPathCount( IUT, V2, V1, 1, 2 ); - } - - public void testDirectedCycle() throws Throwable { - AllPaths IUT = new AllPaths( makeDirectedCycle() ); - - verifyPathCount( IUT, V1, V1, 1, 3 ); - verifyPathCount( IUT, V2, V2, 1, 3 ); - verifyPathCount( IUT, V3, V3, 1, 3 ); - - - verifyPathCount( IUT, V1, V2, 1, 3 ); - verifyPathCount( IUT, V1, V3, 1, 3 ); - - verifyPathCount( IUT, V2, V3, 1, 3 ); - verifyPathCount( IUT, V2, V1, 1, 3 ); - - verifyPathCount( IUT, V3, V1, 1, 3 ); - verifyPathCount( IUT, V3, V2, 1, 3 ); - - for (int i = 0; i < 5; i++) { - int r = random.nextInt( 50 ); - verifyPathCount( IUT, V1, V1, r, 3 * r ); - } - - verifyHasNextTrue( IUT, V1, V1 ); - - } - - public void testDirected4Cycle() throws Throwable { - AllPaths IUT = new AllPaths( makeDirected4Cycle() ); - - verifyPathCount( IUT, V1, V1, 1, 4 ); - verifyPathCount( IUT, V2, V2, 1, 4 ); - verifyPathCount( IUT, V3, V3, 1, 4 ); - verifyPathCount( IUT, V4, V4, 1, 4 ); - - - verifyPathCount( IUT, V1, V2, 1, 4 ); - verifyPathCount( IUT, V1, V3, 1, 4 ); - verifyPathCount( IUT, V1, V4, 1, 4 ); - - verifyPathCount( IUT, V2, V1, 1, 4 ); - verifyPathCount( IUT, V2, V3, 1, 4 ); - verifyPathCount( IUT, V2, V4, 1, 4 ); - - verifyPathCount( IUT, V3, V1, 1, 4 ); - verifyPathCount( IUT, V3, V2, 1, 4 ); - verifyPathCount( IUT, V3, V4, 1, 4 ); - - verifyPathCount( IUT, V4, V1, 1, 4 ); - verifyPathCount( IUT, V4, V2, 1, 4 ); - verifyPathCount( IUT, V4, V3, 1, 4 ); - - verifyHasNextTrue( IUT, V1, V1 ); - } - - public void testCycleNoReturn() throws Throwable { - AllPaths IUT = new AllPaths( makeCycleNoReturn() ); - - verifyHasNextFalse( IUT, V1, V1 ); - } - public void testPipe() throws Throwable { - AllPaths IUT = new AllPaths( makePipe() ); - verifyPathCount( IUT, V1, V1, 0, 3 ); - verifyPathCount( IUT, V2, V2, 0, 3 ); - verifyPathCount( IUT, V3, V3, 0, 3 ); - - verifyPathCount( IUT, V1, V2, 1, 3 ); - verifyPathCount( IUT, V1, V3, 1, 3 ); - - verifyPathCount( IUT, V2, V3, 1, 3 ); - verifyPathCount( IUT, V2, V1, 0, 3 ); - - verifyPathCount( IUT, V3, V1, 0, 3 ); - verifyPathCount( IUT, V3, V2, 0, 3 ); - } - - public void testDiamond() throws Throwable { - AllPaths IUT = new AllPaths( makeDiamond() ); - - verifyPathCount( IUT, V1, V1, 0, 4 ); - verifyPathCount( IUT, V2, V2, 0, 4 ); - verifyPathCount( IUT, V3, V3, 0, 4 ); - verifyPathCount( IUT, V4, V4, 0, 4 ); - - verifyPathCount( IUT, V1, V2, 1, 4 ); - verifyPathCount( IUT, V1, V3, 1, 4 ); - verifyPathCount( IUT, V1, V4, 2, 4 ); - - verifyPathCount( IUT, V2, V1, 0, 4 ); - verifyPathCount( IUT, V2, V3, 0, 4 ); - verifyPathCount( IUT, V2, V4, 1, 4 ); - - verifyPathCount( IUT, V3, V1, 0, 4 ); - verifyPathCount( IUT, V3, V2, 0, 4 ); - verifyPathCount( IUT, V3, V4, 1, 4 ); - - verifyPathCount( IUT, V4, V1, 0, 4 ); - verifyPathCount( IUT, V4, V2, 0, 4 ); - verifyPathCount( IUT, V4, V3, 0, 4 ); - } - - public void testPipelessCycle() throws Throwable { - AllPaths IUT = new AllPaths( makePipelessCycle() ); - - verifyPathCount( IUT, V1, V1, 0, 4 ); - verifyPathCount( IUT, V2, V2, 0, 4 ); - verifyPathCount( IUT, V3, V3, 0, 4 ); - verifyPathCount( IUT, V4, V4, 0, 4 ); - - verifyPathCount( IUT, V1, V2, 1, 4 ); - verifyPathCount( IUT, V1, V3, 1, 4 ); - verifyPathCount( IUT, V1, V4, 0, 4 ); - - verifyPathCount( IUT, V2, V3, 0, 4 ); - verifyPathCount( IUT, V2, V4, 0, 4 ); - verifyPathCount( IUT, V2, V1, 0, 4 ); - - verifyPathCount( IUT, V3, V4, 0, 4 ); - verifyPathCount( IUT, V3, V1, 0, 4 ); - verifyPathCount( IUT, V3, V2, 0, 4 ); - - verifyPathCount( IUT, V4, V1, 0, 4 ); - verifyPathCount( IUT, V4, V2, 1, 4 ); - verifyPathCount( IUT, V4, V3, 1, 4 ); - } - - public void testParentTree() throws Throwable { - AllPaths IUT = new AllPaths( makeParentTree() ); - - verifyPathCount( IUT, V1, V1, 0, 5 ); - verifyPathCount( IUT, V2, V2, 0, 5 ); - verifyPathCount( IUT, V3, V3, 0, 5 ); - verifyPathCount( IUT, V4, V4, 0, 5 ); - verifyPathCount( IUT, V5, V5, 0, 5 ); - - - verifyPathCount( IUT, V1, V2, 0, 5 ); - verifyPathCount( IUT, V1, V3, 0, 5 ); - verifyPathCount( IUT, V1, V4, 0, 5 ); - verifyPathCount( IUT, V1, V5, 0, 5 ); - - verifyPathCount( IUT, V2, V1, 1, 5 ); - verifyPathCount( IUT, V2, V3, 0, 5 ); - verifyPathCount( IUT, V2, V4, 0, 5 ); - verifyPathCount( IUT, V2, V5, 0, 5 ); - - verifyPathCount( IUT, V3, V1, 1, 5 ); - verifyPathCount( IUT, V3, V2, 0, 5 ); - verifyPathCount( IUT, V3, V4, 0, 5 ); - verifyPathCount( IUT, V3, V5, 0, 5 ); - - verifyPathCount( IUT, V4, V1, 1, 5 ); - verifyPathCount( IUT, V4, V2, 0, 5 ); - verifyPathCount( IUT, V4, V3, 1, 5 ); - verifyPathCount( IUT, V4, V5, 0, 5 ); - - verifyPathCount( IUT, V5, V1, 1, 5 ); - verifyPathCount( IUT, V5, V2, 0, 5 ); - verifyPathCount( IUT, V5, V3, 1, 5 ); - verifyPathCount( IUT, V5, V4, 0, 5 ); - } - - public void testChildTree() throws Throwable { - AllPaths IUT = new AllPaths( makeChildTree() ); - - verifyPathCount( IUT, V1, V1, 0, 5 ); - verifyPathCount( IUT, V2, V2, 0, 5 ); - verifyPathCount( IUT, V3, V3, 0, 5 ); - verifyPathCount( IUT, V4, V4, 0, 5 ); - verifyPathCount( IUT, V5, V5, 0, 5 ); - - verifyPathCount( IUT, V1, V2, 1, 5 ); - verifyPathCount( IUT, V1, V3, 1, 5 ); - verifyPathCount( IUT, V1, V4, 1, 5 ); - verifyPathCount( IUT, V1, V5, 1, 5 ); - - verifyPathCount( IUT, V2, V1, 0, 5 ); - verifyPathCount( IUT, V2, V3, 0, 5 ); - verifyPathCount( IUT, V2, V4, 0, 5 ); - verifyPathCount( IUT, V2, V5, 0, 5 ); - - verifyPathCount( IUT, V3, V1, 0, 5 ); - verifyPathCount( IUT, V3, V2, 0, 5 ); - verifyPathCount( IUT, V3, V4, 1, 5 ); - verifyPathCount( IUT, V3, V5, 1, 5 ); - - verifyPathCount( IUT, V4, V1, 0, 5 ); - verifyPathCount( IUT, V4, V2, 0, 5 ); - verifyPathCount( IUT, V4, V3, 0, 5 ); - verifyPathCount( IUT, V4, V5, 0, 5 ); - - verifyPathCount( IUT, V5, V1, 0, 5 ); - verifyPathCount( IUT, V5, V2, 0, 5 ); - verifyPathCount( IUT, V5, V3, 0, 5 ); - verifyPathCount( IUT, V5, V4, 0, 5 ); - } - - public void verifyHasNextFalse( final AllPaths IUT, - final Vertex start, - final Vertex end ) - throws Throwable { - - for (int i = 0; i < 5; i++) { - // This is run many times, because there - // may be a race condition in it. - Thread t = new Thread( new Runnable() { - public void run() { - Iterator iter = IUT.findPaths( start, end ); - if (iter.hasNext()) iter.next(); - boolean val = iter.hasNext(); - } - }); - - t.start(); - t.join( 1000 ); - - assertTrue("Iterator didn't return from hasNext in one second.", - !t.isAlive()); - } - - - Iterator iter = IUT.findPaths( start, end ); - if (iter.hasNext()) iter.next(); - - assertTrue("Iterator has too many elements.", - !iter.hasNext()); - - } - - public void verifyHasNextTrue( final AllPaths IUT, - final Vertex start, - final Vertex end ) - throws Throwable { - - final Iterator iter = IUT.findPaths( start, end ); - - for (int i = 0; i < 5; i++) { - - // This is run many times, because there - // may be a race condition in it. - Thread t = new Thread( new Runnable() { - public void run() { - if (iter.hasNext()) { iter.next(); } - } - }); - - t.start(); - t.join( 1000 ); - - assertTrue("Iterator didn't return from hasNext in one second.", - !t.isAlive()); - } - - - assertTrue("Iterator terminated.", - iter.hasNext()); - - } - - public void verifyPathCount( AllPaths IUT, - Vertex start, - Vertex end, - int expected, - int depth ) throws Throwable { - PathCollector paths = new PathCollector(); - - IUT.findPaths( paths, start, end, depth ); - - Iterator pathsIter = paths.iterator(); - while (pathsIter.hasNext()) { - Path path = (Path) pathsIter.next(); - assertEquals("Path: " + path + " has wrong start.", - start, path.getStart() ); - assertEquals("Path: " + path + " has wrong end.", - end, path.getEnd() ); - assertTrue("Path: " + path + " is too long.", - path.size() <= depth+1 ); - } - - assertEquals("Wrong number of paths returned for: " + start + "->" + end, - expected, paths.size() ); - - - } - -} - - - - - - +package org.apache.commons.graph.algorithm.path; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Commons", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * AllPathsTest This tests the All Pairs Shortest Path solution. + */ + +import org.apache.commons.graph.*; + +import java.util.Set; +import java.util.Random; +import java.util.HashSet; +import java.util.Iterator; +import java.util.AbstractSet; + +/** + * Description of the Class + */ +public class AllPathsTest + extends GraphTest +{ + /** + * PathCollector + * + * This is the thing that collects Callbacks. + */ + public class PathCollector + extends AbstractSet + implements PathListener, + Set + { + private Set paths = new HashSet(); + + public PathCollector() { } + + public void notifyPath( Path path ) { + paths.add( path ); + } + + public int size() { + return paths.size(); + } + + public Iterator iterator() { + return paths.iterator(); + } + } + + private String name = null; + private Random random = new Random(); + + /** + * Constructor for the AllPathsTest object + * + * @param name + */ + public AllPathsTest(String name) + { + super(name); + this.name = name; + } + + public void testSelfLoop() throws Throwable { + AllPaths IUT = new AllPaths( makeSelfLoop() ); + verifyPathCount( IUT, V1, V1, 1, 1 ); + + // Make sure it works with 0. . . + verifyPathCount( IUT, V1, V1, 0, 0 ); + + for (int i = 0; i < 5; i++) { + int r = random.nextInt( 50 ); + verifyPathCount( IUT, V1, V1, r, r ); + + Iterator iter = IUT.findPaths( V1, V1 ); + for (int j = 0; j < r; j++) { + Path path = (Path) iter.next(); + + assertEquals( "Path wrong size.", + j + 2, path.size() ); + } + } + + } + + public void testDirDoubleVertex() + throws Throwable { + AllPaths IUT = new AllPaths( makeDirDoubleVertex() ); + + verifyPathCount( IUT, V1, V1, 0, 2 ); + verifyPathCount( IUT, V2, V2, 0, 2 ); + + verifyPathCount( IUT, V1, V2, 0, 2 ); + verifyPathCount( IUT, V2, V1, 0, 2 ); + } + + /** + * A unit test for JUnit + */ + public void testDirectedEdge() + throws Throwable + { + DirectedGraph g = makeDirectedEdge(); + final AllPaths IUT = new AllPaths(g); + + verifyPathCount( IUT, V1, V1, 0, 2 ); + verifyPathCount( IUT, V2, V2, 0, 2 ); + + verifyPathCount( IUT, V2, V1, 0, 2 ); + verifyPathCount( IUT, V1, V2, 1, 2 ); + + verifyPathCount( IUT, V1, V2, 1, 1 ); + + // Make sure that no matter how big it + // is, it still only returns 1 path. + for (int i = 0; i < 5; i++) { + int r = random.nextInt( 50 ); + + r += 5; + verifyPathCount( IUT, V1, V2, 1, r ); + + } + + verifyHasNextFalse( IUT, V1, V2 ); + } + + public void testDirParallelEdges() throws Throwable { + AllPaths IUT = new AllPaths( makeDirParallelEdges() ); + verifyPathCount( IUT, V1, V1, 0, 2 ); + verifyPathCount( IUT, V2, V2, 0, 2 ); + + verifyPathCount( IUT, V1, V2, 2, 2 ); + verifyPathCount( IUT, V2, V1, 0, 2 ); + } + + public void testTwoCycle() throws Throwable { + AllPaths IUT = new AllPaths( makeTwoCycle() ); + verifyPathCount( IUT, V1, V1, 1, 2 ); + verifyPathCount( IUT, V2, V2, 1, 2 ); + + + verifyPathCount( IUT, V1, V2, 1, 2 ); + verifyPathCount( IUT, V2, V1, 1, 2 ); + } + + public void testDirectedCycle() throws Throwable { + AllPaths IUT = new AllPaths( makeDirectedCycle() ); + + verifyPathCount( IUT, V1, V1, 1, 3 ); + verifyPathCount( IUT, V2, V2, 1, 3 ); + verifyPathCount( IUT, V3, V3, 1, 3 ); + + + verifyPathCount( IUT, V1, V2, 1, 3 ); + verifyPathCount( IUT, V1, V3, 1, 3 ); + + verifyPathCount( IUT, V2, V3, 1, 3 ); + verifyPathCount( IUT, V2, V1, 1, 3 ); + + verifyPathCount( IUT, V3, V1, 1, 3 ); + verifyPathCount( IUT, V3, V2, 1, 3 ); + + for (int i = 0; i < 5; i++) { + int r = random.nextInt( 50 ); + verifyPathCount( IUT, V1, V1, r, 3 * r ); + } + + verifyHasNextTrue( IUT, V1, V1 ); + + } + + public void testDirected4Cycle() throws Throwable { + AllPaths IUT = new AllPaths( makeDirected4Cycle() ); + + verifyPathCount( IUT, V1, V1, 1, 4 ); + verifyPathCount( IUT, V2, V2, 1, 4 ); + verifyPathCount( IUT, V3, V3, 1, 4 ); + verifyPathCount( IUT, V4, V4, 1, 4 ); + + + verifyPathCount( IUT, V1, V2, 1, 4 ); + verifyPathCount( IUT, V1, V3, 1, 4 ); + verifyPathCount( IUT, V1, V4, 1, 4 ); + + verifyPathCount( IUT, V2, V1, 1, 4 ); + verifyPathCount( IUT, V2, V3, 1, 4 ); + verifyPathCount( IUT, V2, V4, 1, 4 ); + + verifyPathCount( IUT, V3, V1, 1, 4 ); + verifyPathCount( IUT, V3, V2, 1, 4 ); + verifyPathCount( IUT, V3, V4, 1, 4 ); + + verifyPathCount( IUT, V4, V1, 1, 4 ); + verifyPathCount( IUT, V4, V2, 1, 4 ); + verifyPathCount( IUT, V4, V3, 1, 4 ); + + verifyHasNextTrue( IUT, V1, V1 ); + } + + public void testCycleNoReturn() throws Throwable { + AllPaths IUT = new AllPaths( makeCycleNoReturn() ); + + verifyHasNextFalse( IUT, V1, V1 ); + } + public void testPipe() throws Throwable { + AllPaths IUT = new AllPaths( makePipe() ); + verifyPathCount( IUT, V1, V1, 0, 3 ); + verifyPathCount( IUT, V2, V2, 0, 3 ); + verifyPathCount( IUT, V3, V3, 0, 3 ); + + verifyPathCount( IUT, V1, V2, 1, 3 ); + verifyPathCount( IUT, V1, V3, 1, 3 ); + + verifyPathCount( IUT, V2, V3, 1, 3 ); + verifyPathCount( IUT, V2, V1, 0, 3 ); + + verifyPathCount( IUT, V3, V1, 0, 3 ); + verifyPathCount( IUT, V3, V2, 0, 3 ); + } + + public void testDiamond() throws Throwable { + AllPaths IUT = new AllPaths( makeDiamond() ); + + verifyPathCount( IUT, V1, V1, 0, 4 ); + verifyPathCount( IUT, V2, V2, 0, 4 ); + verifyPathCount( IUT, V3, V3, 0, 4 ); + verifyPathCount( IUT, V4, V4, 0, 4 ); + + verifyPathCount( IUT, V1, V2, 1, 4 ); + verifyPathCount( IUT, V1, V3, 1, 4 ); + verifyPathCount( IUT, V1, V4, 2, 4 ); + + verifyPathCount( IUT, V2, V1, 0, 4 ); + verifyPathCount( IUT, V2, V3, 0, 4 ); + verifyPathCount( IUT, V2, V4, 1, 4 ); + + verifyPathCount( IUT, V3, V1, 0, 4 ); + verifyPathCount( IUT, V3, V2, 0, 4 ); + verifyPathCount( IUT, V3, V4, 1, 4 ); + + verifyPathCount( IUT, V4, V1, 0, 4 ); + verifyPathCount( IUT, V4, V2, 0, 4 ); + verifyPathCount( IUT, V4, V3, 0, 4 ); + } + + public void testPipelessCycle() throws Throwable { + AllPaths IUT = new AllPaths( makePipelessCycle() ); + + verifyPathCount( IUT, V1, V1, 0, 4 ); + verifyPathCount( IUT, V2, V2, 0, 4 ); + verifyPathCount( IUT, V3, V3, 0, 4 ); + verifyPathCount( IUT, V4, V4, 0, 4 ); + + verifyPathCount( IUT, V1, V2, 1, 4 ); + verifyPathCount( IUT, V1, V3, 1, 4 ); + verifyPathCount( IUT, V1, V4, 0, 4 ); + + verifyPathCount( IUT, V2, V3, 0, 4 ); + verifyPathCount( IUT, V2, V4, 0, 4 ); + verifyPathCount( IUT, V2, V1, 0, 4 ); + + verifyPathCount( IUT, V3, V4, 0, 4 ); + verifyPathCount( IUT, V3, V1, 0, 4 ); + verifyPathCount( IUT, V3, V2, 0, 4 ); + + verifyPathCount( IUT, V4, V1, 0, 4 ); + verifyPathCount( IUT, V4, V2, 1, 4 ); + verifyPathCount( IUT, V4, V3, 1, 4 ); + } + + public void testParentTree() throws Throwable { + AllPaths IUT = new AllPaths( makeParentTree() ); + + verifyPathCount( IUT, V1, V1, 0, 5 ); + verifyPathCount( IUT, V2, V2, 0, 5 ); + verifyPathCount( IUT, V3, V3, 0, 5 ); + verifyPathCount( IUT, V4, V4, 0, 5 ); + verifyPathCount( IUT, V5, V5, 0, 5 ); + + + verifyPathCount( IUT, V1, V2, 0, 5 ); + verifyPathCount( IUT, V1, V3, 0, 5 ); + verifyPathCount( IUT, V1, V4, 0, 5 ); + verifyPathCount( IUT, V1, V5, 0, 5 ); + + verifyPathCount( IUT, V2, V1, 1, 5 ); + verifyPathCount( IUT, V2, V3, 0, 5 ); + verifyPathCount( IUT, V2, V4, 0, 5 ); + verifyPathCount( IUT, V2, V5, 0, 5 ); + + verifyPathCount( IUT, V3, V1, 1, 5 ); + verifyPathCount( IUT, V3, V2, 0, 5 ); + verifyPathCount( IUT, V3, V4, 0, 5 ); + verifyPathCount( IUT, V3, V5, 0, 5 ); + + verifyPathCount( IUT, V4, V1, 1, 5 ); + verifyPathCount( IUT, V4, V2, 0, 5 ); + verifyPathCount( IUT, V4, V3, 1, 5 ); + verifyPathCount( IUT, V4, V5, 0, 5 ); + + verifyPathCount( IUT, V5, V1, 1, 5 ); + verifyPathCount( IUT, V5, V2, 0, 5 ); + verifyPathCount( IUT, V5, V3, 1, 5 ); + verifyPathCount( IUT, V5, V4, 0, 5 ); + } + + public void testChildTree() throws Throwable { + AllPaths IUT = new AllPaths( makeChildTree() ); + + verifyPathCount( IUT, V1, V1, 0, 5 ); + verifyPathCount( IUT, V2, V2, 0, 5 ); + verifyPathCount( IUT, V3, V3, 0, 5 ); + verifyPathCount( IUT, V4, V4, 0, 5 ); + verifyPathCount( IUT, V5, V5, 0, 5 ); + + verifyPathCount( IUT, V1, V2, 1, 5 ); + verifyPathCount( IUT, V1, V3, 1, 5 ); + verifyPathCount( IUT, V1, V4, 1, 5 ); + verifyPathCount( IUT, V1, V5, 1, 5 ); + + verifyPathCount( IUT, V2, V1, 0, 5 ); + verifyPathCount( IUT, V2, V3, 0, 5 ); + verifyPathCount( IUT, V2, V4, 0, 5 ); + verifyPathCount( IUT, V2, V5, 0, 5 ); + + verifyPathCount( IUT, V3, V1, 0, 5 ); + verifyPathCount( IUT, V3, V2, 0, 5 ); + verifyPathCount( IUT, V3, V4, 1, 5 ); + verifyPathCount( IUT, V3, V5, 1, 5 ); + + verifyPathCount( IUT, V4, V1, 0, 5 ); + verifyPathCount( IUT, V4, V2, 0, 5 ); + verifyPathCount( IUT, V4, V3, 0, 5 ); + verifyPathCount( IUT, V4, V5, 0, 5 ); + + verifyPathCount( IUT, V5, V1, 0, 5 ); + verifyPathCount( IUT, V5, V2, 0, 5 ); + verifyPathCount( IUT, V5, V3, 0, 5 ); + verifyPathCount( IUT, V5, V4, 0, 5 ); + } + + public void verifyHasNextFalse( final AllPaths IUT, + final Vertex start, + final Vertex end ) + throws Throwable { + + for (int i = 0; i < 5; i++) { + // This is run many times, because there + // may be a race condition in it. + Thread t = new Thread( new Runnable() { + public void run() { + Iterator iter = IUT.findPaths( start, end ); + if (iter.hasNext()) iter.next(); + boolean val = iter.hasNext(); + } + }); + + t.start(); + t.join( 1000 ); + + assertTrue("Iterator didn't return from hasNext in one second.", + !t.isAlive()); + } + + + Iterator iter = IUT.findPaths( start, end ); + if (iter.hasNext()) iter.next(); + + assertTrue("Iterator has too many elements.", + !iter.hasNext()); + + } + + public void verifyHasNextTrue( final AllPaths IUT, + final Vertex start, + final Vertex end ) + throws Throwable { + + final Iterator iter = IUT.findPaths( start, end ); + + for (int i = 0; i < 5; i++) { + + // This is run many times, because there + // may be a race condition in it. + Thread t = new Thread( new Runnable() { + public void run() { + if (iter.hasNext()) { iter.next(); } + } + }); + + t.start(); + t.join( 1000 ); + + assertTrue("Iterator didn't return from hasNext in one second.", + !t.isAlive()); + } + + + assertTrue("Iterator terminated.", + iter.hasNext()); + + } + + public void verifyPathCount( AllPaths IUT, + Vertex start, + Vertex end, + int expected, + int depth ) throws Throwable { + PathCollector paths = new PathCollector(); + + IUT.findPaths( paths, start, end, depth ); + + Iterator pathsIter = paths.iterator(); + while (pathsIter.hasNext()) { + Path path = (Path) pathsIter.next(); + assertEquals("Path: " + path + " has wrong start.", + start, path.getStart() ); + assertEquals("Path: " + path + " has wrong end.", + end, path.getEnd() ); + assertTrue("Path: " + path + " is too long.", + path.size() <= depth+1 ); + } + + assertEquals("Wrong number of paths returned for: " + start + "->" + end, + expected, paths.size() ); + + + } + +} + + + + + + diff --git a/src/test/org/apache/commons/graph/decorator/TransposeTest.java b/src/test/org/apache/commons/graph/decorator/TransposeTest.java index 1ffec25..95e53c5 100644 --- a/src/test/org/apache/commons/graph/decorator/TransposeTest.java +++ b/src/test/org/apache/commons/graph/decorator/TransposeTest.java @@ -54,12 +54,6 @@ package org.apache.commons.graph.decorator; * . */ -import java.util.Set; -import java.util.Map; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Iterator; - import org.apache.commons.graph.*; /** diff --git a/src/test/org/apache/commons/graph/domain/dependency/DependencyTest.java b/src/test/org/apache/commons/graph/domain/dependency/DependencyTest.java index 88d2044..42771bb 100644 --- a/src/test/org/apache/commons/graph/domain/dependency/DependencyTest.java +++ b/src/test/org/apache/commons/graph/domain/dependency/DependencyTest.java @@ -1,269 +1,269 @@ -package org.apache.commons.graph.domain.dependency; - -import java.util.Set; -import java.util.List; -import java.util.HashSet; - -import org.apache.commons.graph.*; -import org.apache.commons.graph.dependency.exception.*; - -/** - * Description of the Class - */ -public class DependencyTest - extends GraphTest -{ - private DependencyGraph IUT = null; - - /** - * Constructor for the DependencyTest object - * - * @param name - */ - public DependencyTest(String name) - { - super(name); - } - - /** - * The JUnit setup method - */ - public void setUp() - { - IUT = new DependencyGraph(); - } - - /** - * Description of the Class - */ - private class Task - { - private String name; - - /** - * Constructor for the Task object - * - * @param name - */ - public Task(String name) - { - this.name = name; - } - - /** - * Description of the Method - */ - public String toString() - { - return name; - } - } - - /** - * Description of the Field - */ - public Task T1 = new Task("T1"); - /** - * Description of the Field - */ - public Task T2 = new Task("T2"); - /** - * Description of the Field - */ - public Task T3 = new Task("T3"); - /** - * Description of the Field - */ - public Task T4 = new Task("T4"); - /** - * Description of the Field - */ - public Task T5 = new Task("T5"); - - /** - * A unit test for JUnit - */ - public void testNoDeps() - throws Throwable - { - Set deps = new HashSet(); - - IUT.addDependencies(T1, deps); - } - - /** - * A unit test for JUnit - */ - public void testTwoTasksNoDeps() - throws Throwable - { - Set deps = new HashSet(); - IUT.addDependencies(T1, deps); - IUT.addDependencies(T2, deps); - } - - /** - * A unit test for JUnit - */ - public void testSelfDep() - throws Throwable - { - Set deps = new HashSet(); - deps.add(T1); - - try - { - IUT.addDependencies(T1, deps); - fail("Self Dependency added without exception."); - } - catch (CircularDependencyException ex) - {} - } - - /** - * A unit test for JUnit - */ - public void testTwoCyclicDeps() - throws Throwable - { - Set t1Deps = new HashSet(); - t1Deps.add(T2); - - Set t2Deps = new HashSet(); - t2Deps.add(T1); - - IUT.addDependencies(T1, t1Deps); - try - { - IUT.addDependencies(T2, t2Deps); - fail("No CircularDependencyException thrown."); - } - catch (CircularDependencyException ex) - {} - } - - /** - * A unit test for JUnit - */ - public void testThreeCyclicDeps() - throws Throwable - { - Set t1Deps = new HashSet(); - t1Deps.add(T2); - - Set t2Deps = new HashSet(); - t2Deps.add(T3); - - Set t3Deps = new HashSet(); - t3Deps.add(T1); - - IUT.addDependencies(T1, t1Deps); - IUT.addDependencies(T2, t2Deps); - - try - { - IUT.addDependencies(T3, t3Deps); - fail("No CircularDependencyException Thrown."); - } - catch (CircularDependencyException ex) - {} - } - - /** - * A unit test for JUnit - */ - public void testSortedDepsEasy() - throws Throwable - { - Set t1Deps = new HashSet(); - t1Deps.add(T2); - - Set t2Deps = new HashSet(); - t2Deps.add(T3); - - IUT.addDependencies(T1, t1Deps); - IUT.addDependencies(T2, t2Deps); - IUT.addDependencies(T3, new HashSet()); - - // T3 - List t3SDeps = - IUT.getSortedDependencies(T3); - assertEquals("T3: Wrong number of Deps for T3", - 1, t3SDeps.size()); - - assertEquals("T3: Wrong thing at pos 0", - T3, t3SDeps.get(0)); - - // T2 - List t2SDeps = - IUT.getSortedDependencies(T2); - assertEquals("T2: Wrong number of Deps for T2", - 2, t2SDeps.size()); - - try - { - assertEquals("T2: Wrong thing at pos 0", - T3, t2SDeps.get(0)); - assertEquals("T2: Wrong thing at pos 1", - T2, t2SDeps.get(1)); - } - catch (Throwable ex) - { - System.err.println(t2SDeps); - throw ex; - } - - // T1 - List t1SDeps = - IUT.getSortedDependencies(T1); - assertEquals("T1: Wrong number of Deps for T1", - 3, t1SDeps.size()); - - assertEquals("T1: Wrong thing at pos 0", - T3, t1SDeps.get(0)); - assertEquals("T1: Wrong thing at pos 1", - T2, t1SDeps.get(1)); - assertEquals("T1: Wrong thing at pos 2", - T1, t1SDeps.get(2)); - - } - - /** - * A unit test for JUnit - */ - public void testSortedDepsHard() - { - Set t1Deps = new HashSet(); - t1Deps.add(T2); - t1Deps.add(T3); - t1Deps.add(T5); - - Set t2Deps = new HashSet(); - t2Deps.add(T4); - t2Deps.add(T5); - - IUT.addDependencies(T1, t1Deps); - IUT.addDependencies(T2, t2Deps); - - List t1SDeps = IUT.getSortedDependencies(T1); - assertEquals("T1: Wrong number of dependents.", - 5, t1SDeps.size()); - - List t2SDeps = IUT.getSortedDependencies(T2); - assertEquals("T2: Wrong number of dependents.", - 3, t2SDeps.size()); - - List t3SDeps = IUT.getSortedDependencies(T3); - assertEquals("T1: Wrong number of dependents.", - 1, t3SDeps.size()); - - List t4SDeps = IUT.getSortedDependencies(T4); - assertEquals("T4: Wrong number of dependents.", - 1, t4SDeps.size()); - - List t5SDeps = IUT.getSortedDependencies(T5); - assertEquals("T5: Wrong number of dependents.", - 1, t5SDeps.size()); - - } -} +package org.apache.commons.graph.domain.dependency; + +import java.util.Set; +import java.util.List; +import java.util.HashSet; + +import org.apache.commons.graph.*; +import org.apache.commons.graph.domain.dependency.exception.*; + +/** + * Description of the Class + */ +public class DependencyTest + extends GraphTest +{ + private DependencyGraph IUT = null; + + /** + * Constructor for the DependencyTest object + * + * @param name + */ + public DependencyTest(String name) + { + super(name); + } + + /** + * The JUnit setup method + */ + public void setUp() + { + IUT = new DependencyGraph(); + } + + /** + * Description of the Class + */ + private class Task + { + private String name; + + /** + * Constructor for the Task object + * + * @param name + */ + public Task(String name) + { + this.name = name; + } + + /** + * Description of the Method + */ + public String toString() + { + return name; + } + } + + /** + * Description of the Field + */ + public Task T1 = new Task("T1"); + /** + * Description of the Field + */ + public Task T2 = new Task("T2"); + /** + * Description of the Field + */ + public Task T3 = new Task("T3"); + /** + * Description of the Field + */ + public Task T4 = new Task("T4"); + /** + * Description of the Field + */ + public Task T5 = new Task("T5"); + + /** + * A unit test for JUnit + */ + public void testNoDeps() + throws Throwable + { + Set deps = new HashSet(); + + IUT.addDependencies(T1, deps); + } + + /** + * A unit test for JUnit + */ + public void testTwoTasksNoDeps() + throws Throwable + { + Set deps = new HashSet(); + IUT.addDependencies(T1, deps); + IUT.addDependencies(T2, deps); + } + + /** + * A unit test for JUnit + */ + public void testSelfDep() + throws Throwable + { + Set deps = new HashSet(); + deps.add(T1); + + try + { + IUT.addDependencies(T1, deps); + fail("Self Dependency added without exception."); + } + catch (CircularDependencyException ex) + {} + } + + /** + * A unit test for JUnit + */ + public void testTwoCyclicDeps() + throws Throwable + { + Set t1Deps = new HashSet(); + t1Deps.add(T2); + + Set t2Deps = new HashSet(); + t2Deps.add(T1); + + IUT.addDependencies(T1, t1Deps); + try + { + IUT.addDependencies(T2, t2Deps); + fail("No CircularDependencyException thrown."); + } + catch (CircularDependencyException ex) + {} + } + + /** + * A unit test for JUnit + */ + public void testThreeCyclicDeps() + throws Throwable + { + Set t1Deps = new HashSet(); + t1Deps.add(T2); + + Set t2Deps = new HashSet(); + t2Deps.add(T3); + + Set t3Deps = new HashSet(); + t3Deps.add(T1); + + IUT.addDependencies(T1, t1Deps); + IUT.addDependencies(T2, t2Deps); + + try + { + IUT.addDependencies(T3, t3Deps); + fail("No CircularDependencyException Thrown."); + } + catch (CircularDependencyException ex) + {} + } + + /** + * A unit test for JUnit + */ + public void testSortedDepsEasy() + throws Throwable + { + Set t1Deps = new HashSet(); + t1Deps.add(T2); + + Set t2Deps = new HashSet(); + t2Deps.add(T3); + + IUT.addDependencies(T1, t1Deps); + IUT.addDependencies(T2, t2Deps); + IUT.addDependencies(T3, new HashSet()); + + // T3 + List t3SDeps = + IUT.getSortedDependencies(T3); + assertEquals("T3: Wrong number of Deps for T3", + 1, t3SDeps.size()); + + assertEquals("T3: Wrong thing at pos 0", + T3, t3SDeps.get(0)); + + // T2 + List t2SDeps = + IUT.getSortedDependencies(T2); + assertEquals("T2: Wrong number of Deps for T2", + 2, t2SDeps.size()); + + try + { + assertEquals("T2: Wrong thing at pos 0", + T3, t2SDeps.get(0)); + assertEquals("T2: Wrong thing at pos 1", + T2, t2SDeps.get(1)); + } + catch (Throwable ex) + { + System.err.println(t2SDeps); + throw ex; + } + + // T1 + List t1SDeps = + IUT.getSortedDependencies(T1); + assertEquals("T1: Wrong number of Deps for T1", + 3, t1SDeps.size()); + + assertEquals("T1: Wrong thing at pos 0", + T3, t1SDeps.get(0)); + assertEquals("T1: Wrong thing at pos 1", + T2, t1SDeps.get(1)); + assertEquals("T1: Wrong thing at pos 2", + T1, t1SDeps.get(2)); + + } + + /** + * A unit test for JUnit + */ + public void testSortedDepsHard() + { + Set t1Deps = new HashSet(); + t1Deps.add(T2); + t1Deps.add(T3); + t1Deps.add(T5); + + Set t2Deps = new HashSet(); + t2Deps.add(T4); + t2Deps.add(T5); + + IUT.addDependencies(T1, t1Deps); + IUT.addDependencies(T2, t2Deps); + + List t1SDeps = IUT.getSortedDependencies(T1); + assertEquals("T1: Wrong number of dependents.", + 5, t1SDeps.size()); + + List t2SDeps = IUT.getSortedDependencies(T2); + assertEquals("T2: Wrong number of dependents.", + 3, t2SDeps.size()); + + List t3SDeps = IUT.getSortedDependencies(T3); + assertEquals("T1: Wrong number of dependents.", + 1, t3SDeps.size()); + + List t4SDeps = IUT.getSortedDependencies(T4); + assertEquals("T4: Wrong number of dependents.", + 1, t4SDeps.size()); + + List t5SDeps = IUT.getSortedDependencies(T5); + assertEquals("T5: Wrong number of dependents.", + 1, t5SDeps.size()); + + } +}