/* * 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 BasicDirectedEdgeTest extends TestCase { private BasicDirectedNode m_inNode; private BasicDirectedNode m_outNode; private BasicDirectedNode m_otherInNode; private BasicDirectedNode m_otherOutNode; private BasicDirectedEdge m_edge; private BasicDirectedEdge m_inEdge; private BasicDirectedEdge m_outEdge; private BasicDirectedEdge m_same; private BasicDirectedEdge m_same2; private BasicDirectedEdge m_opp; private BasicDirectedEdge m_opp2; private BasicDirectedEdge m_inloop; private BasicDirectedEdge m_outloop; private BasicDirectedEdge m_inoutEdge; private BasicDirectedEdge m_outinEdge; public BasicDirectedEdgeTest(String name) { super(name); } protected void setUp() throws Exception { m_inNode = new BasicDirectedNode(); m_outNode = new BasicDirectedNode(); m_edge = new BasicDirectedEdge(m_inNode, m_outNode); m_inNode.addOut(m_edge); m_outNode.addIn(m_edge); m_otherInNode = new BasicDirectedNode(); m_otherOutNode = new BasicDirectedNode(); m_inEdge = new BasicDirectedEdge(m_otherInNode, m_inNode); m_otherInNode.addOut(m_inEdge); m_inNode.addIn(m_inEdge); m_outEdge = new BasicDirectedEdge(m_outNode, m_otherOutNode); m_outNode.addOut(m_outEdge); m_otherOutNode.addIn(m_outEdge); m_same = new BasicDirectedEdge(m_inNode, m_outNode); m_same2 = new BasicDirectedEdge(m_inNode, m_outNode); m_opp = new BasicDirectedEdge(m_outNode, m_inNode); m_opp2 = new BasicDirectedEdge(m_outNode, m_inNode); m_inloop = new BasicDirectedEdge(m_inNode, m_inNode); m_outloop = new BasicDirectedEdge(m_outNode, m_outNode); m_inoutEdge = new BasicDirectedEdge(m_inNode, m_otherInNode); m_outinEdge = new BasicDirectedEdge(m_otherOutNode, m_outNode); } public void test_getInNode() { assertTrue(m_inNode == m_edge.getNodeA()); assertTrue(m_inNode == m_edge.getInNode()); } public void test_getOutNode() { assertTrue(m_outNode == m_edge.getNodeB()); assertTrue(m_outNode == m_edge.getOutNode()); } public void test_getOtherNode() { assertTrue(m_inNode == m_edge.getOtherNode(m_outNode)); assertTrue(m_outNode == m_edge.getOtherNode(m_inNode)); assertTrue(null == m_edge.getOtherNode(new BasicDirectedNode())); } public void test_reverse() { assertTrue(m_edge.getInNode().getOutEdges().contains(m_edge)); assertTrue(m_edge.getOutNode().getInEdges().contains(m_edge)); m_edge.reverse(); assertTrue(m_inNode == m_edge.getOutNode()); assertTrue(m_outNode == m_edge.getInNode()); assertTrue(m_edge.getInNode().getOutEdges().contains(m_edge)); assertTrue(m_edge.getOutNode().getInEdges().contains(m_edge)); } public void test_getRelated() { Iterator itr = m_edge.getRelated(); BasicDirectedEdge de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge); assertTrue(!itr.hasNext()); //add an edge that has the same nodes, in the same direction m_edge.getInNode().addOut(m_same); m_edge.getOutNode().addIn(m_same); itr = m_edge.getRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge || de == m_same); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge || de == m_same); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge || de == m_same); assertTrue(!itr.hasNext()); //add another edge in the same direction m_edge.getInNode().addOut(m_same2); m_edge.getOutNode().addIn(m_same2); itr = m_edge.getRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_same || de==m_same2); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_same || de==m_same2); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_same || de==m_same2); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_same || de==m_same2); assertTrue(!itr.hasNext()); m_edge.getInNode().removeOut(m_same); m_edge.getOutNode().removeIn(m_same); m_edge.getInNode().removeOut(m_same2); m_edge.getOutNode().removeIn(m_same2); //add an edge that has the same nodes, opposite direction m_edge.getInNode().addIn(m_opp); m_edge.getOutNode().addOut(m_opp); itr = m_edge.getRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge || de == m_opp); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge || de == m_opp); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_outEdge || de == m_opp); assertTrue(!itr.hasNext()); //add another edge in opposite direction m_edge.getInNode().addIn(m_opp2); m_edge.getOutNode().addOut(m_opp2); itr = m_edge.getRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_opp || de==m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_opp || de==m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_opp || de==m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de==m_inEdge || de==m_outEdge || de==m_opp || de==m_opp2); assertTrue(!itr.hasNext()); m_edge.getInNode().removeIn(m_opp); m_edge.getOutNode().removeOut(m_opp); m_edge.getInNode().removeIn(m_opp2); m_edge.getOutNode().removeOut(m_opp2); //add loops m_edge.getInNode().addIn(m_inloop); m_edge.getInNode().addOut(m_inloop); m_edge.getOutNode().addIn(m_outloop); m_edge.getOutNode().addOut(m_outloop); itr = m_edge.getRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inloop || de == m_outloop ); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inloop || de == m_outloop ); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inloop || de == m_outloop ); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inloop || de == m_outloop ); assertTrue(!itr.hasNext()); m_edge.getInNode().removeIn(m_inloop); m_edge.getInNode().removeOut(m_inloop); m_edge.getOutNode().removeIn(m_outloop); m_edge.getOutNode().removeOut(m_outloop); //add an incoming edge to the out node and an outgoing edge to the in node m_edge.getInNode().addOut(m_inoutEdge); m_otherInNode.addIn(m_inoutEdge); m_edge.getOutNode().addIn(m_outinEdge); m_otherOutNode.addOut(m_outinEdge); itr = m_edge.getRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inoutEdge || de == m_outinEdge ); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inoutEdge || de == m_outinEdge ); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inoutEdge || de == m_outinEdge ); de = (BasicDirectedEdge)itr.next(); assertTrue( de == m_inEdge || de == m_outEdge || de == m_inoutEdge || de == m_outinEdge ); assertTrue(!itr.hasNext()); } public void test_getInRelated() { Iterator itr = m_edge.getInRelated(); BasicDirectedEdge de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge); assertTrue(!itr.hasNext()); //add same edge (shouldn't show up in iterator this time) m_edge.getInNode().addOut(m_same); m_edge.getOutNode().addIn(m_same); itr = m_edge.getInRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge); assertTrue(!itr.hasNext()); m_edge.getInNode().removeOut(m_same); m_edge.getOutNode().removeIn(m_same); //add opposite edge m_edge.getInNode().addIn(m_opp); m_edge.getOutNode().addOut(m_opp); itr = m_edge.getInRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_opp); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_opp); assertTrue(!itr.hasNext()); //add multiple opposites m_edge.getInNode().addIn(m_opp2); m_edge.getOutNode().addOut(m_opp2); itr = m_edge.getInRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_opp || de == m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_opp || de == m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_opp || de == m_opp2); assertTrue(!itr.hasNext()); m_edge.getInNode().removeIn(m_opp); m_edge.getOutNode().removeOut(m_opp); m_edge.getInNode().removeIn(m_opp2); m_edge.getOutNode().removeOut(m_opp2); //add loop m_edge.getInNode().addIn(m_inloop); m_edge.getInNode().addOut(m_inloop); itr = m_edge.getInRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_inloop); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_inEdge || de == m_inloop); assertTrue(!itr.hasNext()); } public void test_getOutRelated() { Iterator itr = m_edge.getOutRelated(); BasicDirectedEdge de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge); assertTrue(!itr.hasNext()); //add same edge (shouldn't show up in iterator this time) m_edge.getInNode().addOut(m_same); m_edge.getOutNode().addIn(m_same); itr = m_edge.getOutRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge); assertTrue(!itr.hasNext()); m_edge.getInNode().removeOut(m_same); m_edge.getOutNode().removeIn(m_same); //add opposite edge m_edge.getInNode().addIn(m_opp); m_edge.getOutNode().addOut(m_opp); itr = m_edge.getOutRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_opp); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_opp); assertTrue(!itr.hasNext()); //add another opposite edge m_edge.getInNode().addIn(m_opp2); m_edge.getOutNode().addOut(m_opp2); itr = m_edge.getOutRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_opp || de == m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_opp || de == m_opp2); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_opp || de == m_opp2); assertTrue(!itr.hasNext()); m_edge.getInNode().removeIn(m_opp); m_edge.getOutNode().removeOut(m_opp); m_edge.getInNode().removeIn(m_opp2); m_edge.getOutNode().removeOut(m_opp2); //add loop m_edge.getOutNode().addIn(m_outloop); m_edge.getOutNode().addOut(m_outloop); itr = m_edge.getOutRelated(); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_outloop); de = (BasicDirectedEdge)itr.next(); assertTrue(de == m_outEdge || de == m_outloop); assertTrue(!itr.hasNext()); } }