Package org.geotools.graph.io.standard

Source Code of org.geotools.graph.io.standard.BasicGraphSerializerTest

/*
*    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.io.standard;

import java.io.File;
import java.util.HashSet;
import java.util.Map;
import java.util.StringTokenizer;

import junit.framework.TestCase;

import org.geotools.graph.GraphTestUtil;
import org.geotools.graph.build.GraphBuilder;
import org.geotools.graph.build.basic.BasicGraphBuilder;
import org.geotools.graph.structure.Edge;
import org.geotools.graph.structure.Graph;
import org.geotools.graph.structure.GraphVisitor;
import org.geotools.graph.structure.Graphable;
import org.geotools.graph.structure.Node;

/**
*
*
* @source $URL$
*/
public class BasicGraphSerializerTest extends TestCase {

  private GraphBuilder m_builder;
  private GraphBuilder m_rebuilder;
  private SerializedReaderWriter m_serializer;
  
  public BasicGraphSerializerTest(String name) {
    super(name)
  }
 
  protected void setUp() throws Exception {
    super.setUp();
   
    m_builder = createBuilder();
    m_rebuilder = createRebuilder();
    m_serializer = new SerializedReaderWriter();
    m_serializer.setProperty(SerializedReaderWriter.BUILDER, rebuilder());
  }
 
  /**
   * Create a simple graph with no bifurcations and serialize, then deserialize
   * <BR>
   * <BR>
   * Expected: 1. before and after graph should have same structure.
   *
   */
  public void test_0() throws Exception{
    final int nnodes = 100;
    GraphTestUtil.buildNoBifurcations(builder(), nnodes);   
    File victim = File.createTempFile( "graph", null );
    victim.deleteOnExit();
   
    m_serializer.setProperty(SerializedReaderWriter.FILENAME, victim.getAbsolutePath() );
     
      m_serializer.write(builder().getGraph());
     
      Graph before = builder().getGraph();
      Graph after = m_serializer.read();
     
      //ensure same number of nodes and edges
      assertTrue(before.getNodes().size() == after.getNodes().size());
      assertTrue(before.getEdges().size() == after.getEdges().size());
     
      //ensure same graph structure
      GraphVisitor visitor = new GraphVisitor() {
        public int visit(Graphable component) {
          Edge e = (Edge)component;
         
          assertTrue(e.getNodeA().getID() == e.getID());
          assertTrue(e.getNodeB().getID() == e.getID()+1);
         
          return(0);
        }
      };
      after.visitEdges(visitor);
     
      visitor = new GraphVisitor() {
        public int visit(Graphable component) {
          Node n = (Node)component;
         
          if (n.getDegree() == 1) {
            assertTrue(n.getID() == 0 || n.getID() == nnodes-1)
          }
          else {
            assertTrue(n.getDegree() == 2);
           
            Edge e0 = (Edge)n.getEdges().get(0);
            Edge e1 = (Edge)n.getEdges().get(1);
           
            assertTrue(
              (e0.getID() == n.getID()-1 && e1.getID() == n.getID()) ||
              (e1.getID() == n.getID()-1 && e0.getID() == n.getID())
            );
           
          }
         
          return(0);
        }
      };
      after.visitNodes(visitor);
  }
 
  /**
   * Create a perfect binary tree, serialize it and deserialize it. <BR>
   * <BR>
   * Expected: 1. Same structure before and after.
   *
   */
  public void test_1() {
    final int k = 5;
    Object[] obj = GraphTestUtil.buildPerfectBinaryTree(builder(), k);
    final Node root = (Node)obj[0];
    final Map obj2node = (Map)obj[1];   
   
    try {
      File victim = File.createTempFile( "graph", null );
      victim.deleteOnExit();
      m_serializer.setProperty(SerializedReaderWriter.FILENAME, victim.getAbsolutePath() );
     
      m_serializer.write(builder().getGraph());
     
      Graph before = builder().getGraph();
      Graph after = m_serializer.read();
     
      //ensure same number of nodes and edges
      assertTrue(before.getNodes().size() == after.getNodes().size());
      assertTrue(before.getEdges().size() == after.getEdges().size());
     
      //ensure same structure
      GraphVisitor visitor = new GraphVisitor() {
        public int visit(Graphable component) {
          Node n = (Node)component;
          String id = (String)n.getObject();
         
          assertTrue(obj2node.get(id) != null);
         
          StringTokenizer st = new StringTokenizer(id, ".");
         
          if (st.countTokens() == 1) {
            //root
            assertTrue(n.getDegree() == 2);
           
            Node n0 = ((Edge)n.getEdges().get(0)).getOtherNode(n);
            Node n1 = ((Edge)n.getEdges().get(1)).getOtherNode(n);
           
            assertTrue(
              n0.getObject().equals("0.0") && n1.getObject().equals("0.1")
           || n0.getObject().equals("0.1") && n1.getObject().equals("0.0")
            );
          }
          else if (st.countTokens() == k+1) {
            //leaf
            assertTrue(n.getDegree() == 1);
           
            Node parent = ((Edge)n.getEdges().get(0)).getOtherNode(n);
            String parentid = (String)parent.getObject();
           
            assertTrue(parentid.equals(id.substring(0, id.length()-2)));  
          }
          else {
            //internal
            assertTrue(n.getDegree() == 3);
           
            String id0 = ((Edge)n.getEdges().get(0)).getOtherNode(n).getObject()
                           .toString();
            String id1 = ((Edge)n.getEdges().get(1)).getOtherNode(n).getObject()
                           .toString();
            String id2 = ((Edge)n.getEdges().get(2)).getOtherNode(n).getObject()
                           .toString();
           
            String parentid = id.substring(0, id.length()-2);
           
            assertTrue(
             id0.equals(parentid) && id1.equals(id+".0") && id2.equals(id+".1")
          || id0.equals(parentid) && id2.equals(id+".0") && id1.equals(id+".1")
          || id1.equals(parentid) && id0.equals(id+".0") && id2.equals(id+".1")
          || id1.equals(parentid) && id2.equals(id+".0") && id0.equals(id+".1")
          || id2.equals(parentid) && id0.equals(id+".0") && id1.equals(id+".1")
          || id2.equals(parentid) && id1.equals(id+".0") && id0.equals(id+".1")
            );
         
         
          return(0);
        }
      };
      after.visitNodes(visitor);
     
    }
    catch(Exception e) {
      e.printStackTrace();
      assertTrue(false)
    }
  }
 
  /**
   * Create a simple graph and disconnect two nodes (remove all edges)
   * then serialize and deserialize. <BR>
   * <BR>
   * Exepcted: 1. Same graph structure.
   *
   */
  public void test_2() {
    final int nnodes = 100;
    Node[] ends = GraphTestUtil.buildNoBifurcations(builder(), nnodes);
   
    HashSet toRemove = new HashSet();
    toRemove.addAll(ends[0].getEdges());
    toRemove.addAll(ends[1].getEdges());
   
    //disconnect end nodes
    builder().removeEdges(toRemove);
   
    assertTrue(builder().getGraph().getNodes().size() == nnodes);
    assertTrue(builder().getGraph().getEdges().size() == nnodes-3);
   
    try {
        File victim = File.createTempFile( "graph", null );
        victim.deleteOnExit();
      m_serializer.setProperty(SerializedReaderWriter.FILENAME, victim.getAbsolutePath());
     
      m_serializer.write(builder().getGraph());
     
      Graph before = builder().getGraph();
      Graph after = m_serializer.read();
     
      //ensure same number of nodes and edges
      assertTrue(before.getNodes().size() == after.getNodes().size());
      assertTrue(before.getEdges().size() == after.getEdges().size());
     
      GraphVisitor visitor = new GraphVisitor() {
        public int visit(Graphable component) {
          Node n = (Node)component;
          if (n.getID() == 0 || n.getID() == nnodes-1)
            assertTrue(n.getDegree() == 0);
          else if (n.getID() == 1 || n.getID() == nnodes-2)
            assertTrue(n.getDegree() == 1);
          else assertTrue(n.getDegree() == 2);
          
          return(0);
        }
      };
      after.visitNodes(visitor);
    }
    catch(Exception e) {
      e.printStackTrace();
      assertTrue(false);
    }
  }
 
  protected GraphBuilder createBuilder() {
    return(new BasicGraphBuilder())
  }
 
  protected GraphBuilder createRebuilder() {
    return(new BasicGraphBuilder())
  }
 
  protected GraphBuilder builder() {
    return(m_builder)
  }

  protected GraphBuilder rebuilder() {
    return(m_rebuilder)
  }
 
  protected SerializedReaderWriter serializer() {
    return(m_serializer)
  }
   
}
TOP

Related Classes of org.geotools.graph.io.standard.BasicGraphSerializerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.