/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.graph.structure.basic;
import java.util.Iterator;
import junit.framework.TestCase;
public class BasicDirectedNodeTest extends TestCase {
private BasicDirectedNode m_node;
private BasicDirectedNode m_inNode1;
private BasicDirectedNode m_inNode2;
private BasicDirectedNode m_outNode1;
private BasicDirectedNode m_outNode2;
private BasicDirectedEdge m_inEdge1;
private BasicDirectedEdge m_inEdge2;
private BasicDirectedEdge m_outEdge1;
private BasicDirectedEdge m_outEdge2;
private BasicDirectedEdge m_loop;
public BasicDirectedNodeTest(String name) {
super(name);
}
protected void setUp() throws Exception {
super.setUp();
m_node = new BasicDirectedNode();
m_inNode1 = new BasicDirectedNode();
m_inNode2 = new BasicDirectedNode();
m_outNode1 = new BasicDirectedNode();
m_outNode2 = new BasicDirectedNode();
m_inEdge1 = new BasicDirectedEdge(m_inNode1, m_node);
m_inEdge2 = new BasicDirectedEdge(m_inNode2, m_node);
m_outEdge1 = new BasicDirectedEdge(m_node, m_outNode1);
m_outEdge2 = new BasicDirectedEdge(m_node, m_outNode2);
m_loop = new BasicDirectedEdge(m_node, m_node);
}
public void test_addIn() {
assertTrue(m_node.getInEdges().size() == 0);
//single in edge
m_node.addIn(m_inEdge1);
assertTrue(m_node.getInEdges().contains(m_inEdge1));
assertTrue(m_node.getInEdges().size() == 1);
//multiple in edges, same edge
m_node.addIn(m_inEdge1);
assertTrue(m_node.getInEdges().size() == 2);
m_node.removeIn(m_inEdge1);
//multiple in edges, different
m_node.addIn(m_inEdge2);
assertTrue(m_node.getInEdges().contains(m_inEdge1));
assertTrue(m_node.getInEdges().contains(m_inEdge2));
assertTrue(m_node.getInEdges().size() == 2);
}
public void test_addOut() {
assertTrue(m_node.getOutEdges().size() == 0);
//single out edge
m_node.addOut(m_outEdge1);
assertTrue(m_node.getOutEdges().contains(m_outEdge1));
assertTrue(m_node.getOutEdges().size() == 1);
//multiple out edges, same edge
m_node.addOut(m_outEdge1);
assertTrue(m_node.getOutEdges().size() == 2);
m_node.removeOut(m_outEdge1);
//multiple out edges, different
m_node.addOut(m_outEdge2);
assertTrue(m_node.getOutEdges().contains(m_outEdge1));
assertTrue(m_node.getOutEdges().contains(m_outEdge2));
assertTrue(m_node.getOutEdges().size() == 2);
}
public void test_remove() {
m_node.addIn(m_inEdge1);
m_node.addOut(m_outEdge1);
m_node.remove(m_inEdge1);
m_node.remove(m_outEdge1);
assertTrue(m_node.getInEdges().size() == 0);
assertTrue(m_node.getOutEdges().size() == 0);
}
public void test_removeIn() {
//single edge
m_node.addIn(m_inEdge1);
m_node.removeIn(m_inEdge1);
assertTrue(m_node.getInEdges().isEmpty());
//multiple edges same
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge1);
assertTrue(m_node.getInEdges().size() == 2);
m_node.removeIn(m_inEdge1);
assertTrue(m_node.getInEdges().size() == 1);
m_node.removeIn(m_inEdge1);
assertTrue(m_node.getInEdges().size() == 0);
//multiple edges different
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
m_node.removeIn(m_inEdge1);
assertTrue(m_node.getInEdges().size() == 1);
assertTrue(m_node.getInEdges().contains(m_inEdge2));
m_node.removeIn(m_inEdge2);
assertTrue(m_node.getInEdges().size() == 0);
}
public void test_removeOut() {
//single edge
m_node.addOut(m_outEdge1);
m_node.removeOut(m_outEdge1);
assertTrue(m_node.getOutEdges().isEmpty());
//multiple edges same
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge1);
assertTrue(m_node.getOutEdges().size() == 2);
m_node.removeOut(m_outEdge1);
assertTrue(m_node.getOutEdges().size() == 1);
m_node.removeOut(m_outEdge1);
assertTrue(m_node.getOutEdges().size() == 0);
//multiple edges different
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
m_node.removeOut(m_outEdge1);
assertTrue(m_node.getOutEdges().size() == 1);
assertTrue(m_node.getOutEdges().contains(m_outEdge2));
m_node.removeOut(m_outEdge2);
assertTrue(m_node.getOutEdges().size() == 0);
}
public void test_getEdge() {
m_node.addIn(m_inEdge1);
m_node.addOut(m_outEdge1);
assertSame(m_node.getEdge(m_inNode1), m_inEdge1);
assertSame(m_node.getEdge(m_outNode1), m_outEdge1);
}
public void test_getInEdge() {
m_node.addIn(m_inEdge1);
assertSame(m_node.getInEdge(m_inNode1), m_inEdge1);
}
public void test_getOutEdge() {
m_node.addOut(m_outEdge1);
assertSame(m_node.getOutEdge(m_outNode1), m_outEdge1);
}
public void test_getEdges_0() {
m_node.addIn(m_inEdge1);
m_node.addOut(m_outEdge1);
assertTrue(m_node.getEdges().size() == 2);
assertTrue(m_node.getEdges().contains(m_inEdge1));
assertTrue(m_node.getEdges().contains(m_outEdge1));
}
public void test_getEdges_1() {
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getEdges(m_inNode1).contains(m_inEdge1));
assertTrue(m_node.getEdges(m_inNode2).contains(m_inEdge2));
assertTrue(m_node.getEdges(m_outNode1).contains(m_outEdge1));
assertTrue(m_node.getEdges(m_outNode2).contains(m_outEdge2));
//add duplicates
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getEdges(m_inNode1).contains(m_inEdge1));
assertTrue(m_node.getEdges(m_inNode1).size() == 2);
assertTrue(m_node.getEdges(m_inNode2).contains(m_inEdge2));
assertTrue(m_node.getEdges(m_inNode2).size() == 2);
assertTrue(m_node.getEdges(m_outNode1).contains(m_outEdge1));
assertTrue(m_node.getEdges(m_outNode1).size() == 2);
assertTrue(m_node.getEdges(m_outNode2).contains(m_outEdge2));
assertTrue(m_node.getEdges(m_outNode2).size() == 2);
}
public void test_getInEdges_0() {
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
assertTrue(m_node.getInEdges().contains(m_inEdge1));
assertTrue(m_node.getInEdges().contains(m_inEdge2));
assertTrue(m_node.getInEdges().size() == 2);
}
public void test_getInEdges_1() {
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
assertTrue(m_node.getInEdges(m_inNode1).contains(m_inEdge1));
assertTrue(m_node.getInEdges(m_inNode2).contains(m_inEdge2));
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
assertTrue(m_node.getInEdges(m_inNode1).contains(m_inEdge1));
assertTrue(m_node.getInEdges(m_inNode1).size() == 2);
assertTrue(m_node.getInEdges(m_inNode2).contains(m_inEdge2));
assertTrue(m_node.getInEdges(m_inNode2).size() == 2);
}
public void test_getOutEdges_0() {
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getOutEdges().contains(m_outEdge1));
assertTrue(m_node.getOutEdges().contains(m_outEdge2));
assertTrue(m_node.getOutEdges().size() == 2);
}
public void test_getOutEdges_1() {
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getOutEdges(m_outNode1).contains(m_outEdge1));
assertTrue(m_node.getOutEdges(m_outNode2).contains(m_outEdge2));
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getOutEdges(m_outNode1).contains(m_outEdge1));
assertTrue(m_node.getOutEdges(m_outNode1).size() == 2);
assertTrue(m_node.getOutEdges(m_outNode2).contains(m_outEdge2));
assertTrue(m_node.getOutEdges(m_outNode2).size() == 2);
}
public void test_getDegree() {
m_node.addIn(m_inEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getDegree() == 2);
}
public void test_getInDegree() {
m_node.addIn(m_inEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getInDegree() == 1);
}
public void test_getOutDegree_0() {
m_node.addIn(m_inEdge1);
m_node.addOut(m_outEdge2);
assertTrue(m_node.getOutDegree() == 1);
}
public void test_getRelated() {
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
Iterator related = m_node.getRelated();
BasicDirectedNode dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 || dn == m_outNode1 || dn == m_outNode2
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 || dn == m_outNode1 || dn == m_outNode2
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 || dn == m_outNode1 || dn == m_outNode2
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 || dn == m_outNode1 || dn == m_outNode2
);
assertTrue(!related.hasNext());
//add loop
m_node.addIn(m_loop);
m_node.addOut(m_loop);
related = m_node.getRelated();
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 ||
dn == m_outNode1 || dn == m_outNode2 || dn == m_node
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 ||
dn == m_outNode1 || dn == m_outNode2 || dn == m_node
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 ||
dn == m_outNode1 || dn == m_outNode2 || dn == m_node
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 ||
dn == m_outNode1 || dn == m_outNode2 || dn == m_node
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 ||
dn == m_outNode1 || dn == m_outNode2 || dn == m_node
);
dn = (BasicDirectedNode)related.next();
assertTrue(
dn == m_inNode1 || dn == m_inNode2 ||
dn == m_outNode1 || dn == m_outNode2 || dn == m_node
);
assertTrue(!related.hasNext());
}
public void test_getInRelated() {
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
Iterator related = m_node.getInRelated();
BasicDirectedNode dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_inNode1 || dn == m_inNode2);
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_inNode1 || dn == m_inNode2);
assertTrue(!related.hasNext());
//add a loop
m_node.addIn(m_loop);
m_node.addOut(m_loop);
related = m_node.getInRelated();
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_inNode1 || dn == m_inNode2 || dn == m_node);
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_inNode1 || dn == m_inNode2 || dn == m_node);
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_inNode1 || dn == m_inNode2 || dn == m_node);
assertTrue(!related.hasNext());
}
public void test_getOutRelated() {
m_node.addIn(m_inEdge1);
m_node.addIn(m_inEdge2);
m_node.addOut(m_outEdge1);
m_node.addOut(m_outEdge2);
Iterator related = m_node.getOutRelated();
BasicDirectedNode dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_outNode1 || dn == m_outNode2);
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_outNode1 || dn == m_outNode2);
assertTrue(!related.hasNext());
//add a loop
m_node.addIn(m_loop);
m_node.addOut(m_loop);
related = m_node.getOutRelated();
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_outNode1 || dn == m_outNode2 || dn == m_node);
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_outNode1 || dn == m_outNode2 || dn == m_node);
dn = (BasicDirectedNode)related.next();
assertTrue(dn == m_outNode1 || dn == m_outNode2 || dn == m_node);
assertTrue(!related.hasNext());
}
}