/* ========================================== * JGraphT : a free Java graph-theory library * ========================================== * * Project Info: http://jgrapht.sourceforge.net/ * Project Creator: Barak Naveh (http://sourceforge.net/users/barak_naveh) * * (C) Copyright 2003-2008, by Barak Naveh and Contributors. * * This program and the accompanying materials are dual-licensed under * either * * (a) the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation, or (at your option) any * later version. * * or (per the licensee's choosing) * * (b) the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation. */ /* -------------------------- * EqualsAndHashCodeTest.java * -------------------------- * (C) Copyright 2012, by Vladimir Kostyukov and Contributors. * * Original Author: Vladimir Kostyukov * Contributor(s): - * * $Id$ * * Changes * ------- * 14-Jun-2012 : Initial revision (VK); * */ package org.jgrapht.graph; import java.util.HashMap; import java.util.Map; import org.jgrapht.*; public class EqualsAndHashCodeTest extends EnhancedTestCase { //~ Instance fields -------------------------------------------------------- private String v1 = "v1"; private String v2 = "v2"; private String v3 = "v3"; private String v4 = "v4"; //~ Constructors ----------------------------------------------------------- /** * @see junit.framework.TestCase#TestCase(java.lang.String) */ public EqualsAndHashCodeTest(String name) { super(name); } /** * Tests equals/hashCode methods for directed graphs. */ public void testDefaultDirectedGraph() { DirectedGraph<String, DefaultEdge> g1 = new DefaultDirectedGraph<String, DefaultEdge>( DefaultEdge.class); g1.addVertex(v1); g1.addVertex(v2); g1.addVertex(v3); g1.addVertex(v4); DefaultEdge e12 = g1.addEdge(v1, v2); DefaultEdge e23 = g1.addEdge(v2, v3); DefaultEdge e31 = g1.addEdge(v3, v1); DirectedGraph<String, DefaultEdge> g2 = new DefaultDirectedGraph<String, DefaultEdge>( DefaultEdge.class); g2.addVertex(v4); g2.addVertex(v3); g2.addVertex(v2); g2.addVertex(v1); g2.addEdge(v3, v1, e31); g2.addEdge(v2, v3, e23); g2.addEdge(v1, v2, e12); DirectedGraph<String, DefaultEdge> g3 = new DefaultDirectedGraph<String, DefaultEdge>( DefaultEdge.class); g3.addVertex(v4); g3.addVertex(v3); g3.addVertex(v2); g3.addVertex(v1); g3.addEdge(v3, v1, e31); g3.addEdge(v2, v3, e23); assertTrue(g2.equals(g1)); assertTrue(!g3.equals(g2)); assertEquals(g2.hashCode(), g1.hashCode()); } /** * Tests equals/hashCode methods for undirected graphs. */ public void testSimpleGraph() { UndirectedGraph<String, DefaultEdge> g1 = new SimpleGraph<String, DefaultEdge>( DefaultEdge.class); g1.addVertex(v1); g1.addVertex(v2); g1.addVertex(v3); g1.addVertex(v4); DefaultEdge e12 = g1.addEdge(v1, v2); DefaultEdge e23 = g1.addEdge(v2, v3); DefaultEdge e31 = g1.addEdge(v3, v1); UndirectedGraph<String, DefaultEdge> g2 = new SimpleGraph<String, DefaultEdge>( DefaultEdge.class); g2.addVertex(v4); g2.addVertex(v3); g2.addVertex(v2); g2.addVertex(v1); g2.addEdge(v3, v1, e31); g2.addEdge(v2, v3, e23); g2.addEdge(v1, v2, e12); UndirectedGraph<String, DefaultEdge> g3 = new SimpleGraph<String, DefaultEdge>( DefaultEdge.class); g3.addVertex(v4); g3.addVertex(v3); g3.addVertex(v2); g3.addVertex(v1); g3.addEdge(v3, v1, e31); g3.addEdge(v2, v3, e23); assertTrue(g2.equals(g1)); assertTrue(!g3.equals(g2)); assertEquals(g2.hashCode(), g1.hashCode()); } /** * Tests equals/hashCode methods for graphs with non-Intrusive edges. */ public void testGraphsWithNonIntrusiveEdge() { DirectedGraph<String, String> g1 = new DefaultDirectedGraph<String, String>( String.class); g1.addVertex(v1); g1.addVertex(v2); g1.addVertex(v3); g1.addEdge(v1, v2, v1 + v2); g1.addEdge(v3, v1, v3 + v1); DirectedGraph<String, String> g2 = new DefaultDirectedGraph<String, String>( String.class); g2.addVertex(v3); g2.addVertex(v2); g2.addVertex(v1); g2.addEdge(v3, v1, v3 + v1); g2.addEdge(v1, v2, v1 + v2); DirectedGraph<String, String> g3 = new DefaultDirectedGraph<String, String>( String.class); g3.addVertex(v3); g3.addVertex(v2); g3.addVertex(v1); g3.addEdge(v3, v1, v3 + v1); g3.addEdge(v1, v2, v1 + v2); g3.addEdge(v2, v3, v2 + v3); assertTrue(g1.equals(g2)); assertTrue(!g2.equals(g3)); assertEquals(g2.hashCode(), g1.hashCode()); } /** * Tests equals/hashCode methods for graphs with multiple edges and loops. */ public void testPseudograph() { UndirectedGraph<String, DefaultEdge> g1 = new Pseudograph<String, DefaultEdge>(DefaultEdge.class); g1.addVertex(v1); g1.addVertex(v2); g1.addVertex(v3); DefaultEdge e121 = g1.addEdge(v1, v2); DefaultEdge e23 = g1.addEdge(v2, v3); DefaultEdge e31 = g1.addEdge(v3, v1); DefaultEdge e122 = g1.addEdge(v1, v2); DefaultEdge e11 = g1.addEdge(v1, v1); UndirectedGraph<String, DefaultEdge> g2 = new Pseudograph<String, DefaultEdge>(DefaultEdge.class); g2.addVertex(v3); g2.addVertex(v2); g2.addVertex(v1); g2.addEdge(v1, v1, e11); g2.addEdge(v1, v2, e121); g2.addEdge(v3, v1, e31); g2.addEdge(v2, v3, e23); g2.addEdge(v1, v2, e122); UndirectedGraph<String, DefaultEdge> g3 = new Pseudograph<String, DefaultEdge>(DefaultEdge.class); g3.addVertex(v3); g3.addVertex(v2); g3.addVertex(v1); g3.addEdge(v1, v1, e11); g3.addEdge(v1, v2, e121); g3.addEdge(v3, v1, e31); g3.addEdge(v2, v3, e23); assertTrue(g1.equals(g2)); assertTrue(!g2.equals(g3)); assertEquals(g2.hashCode(), g1.hashCode()); } /** * Tests equals/hashCode methods for graphs with custom edges. */ public void testGrapshWithCustomEdges() { UndirectedGraph<String, CustomEdge> g1 = new SimpleGraph<String, CustomEdge>( CustomEdge.class); g1.addVertex(v1); g1.addVertex(v2); g1.addVertex(v3); g1.addEdge(v1, v2, new CustomEdge("v1-v2")); g1.addEdge(v3, v1, new CustomEdge("v3-v1")); UndirectedGraph<String, CustomEdge> g2 = new SimpleGraph<String, CustomEdge>( CustomEdge.class); g2.addVertex(v1); g2.addVertex(v2); g2.addVertex(v3); g2.addEdge(v1, v2, new CustomEdge("v1-v2")); g2.addEdge(v3, v1, new CustomEdge("v3-v1")); UndirectedGraph<String, CustomEdge> g3 = new SimpleGraph<String, CustomEdge>( CustomEdge.class); g3.addVertex(v1); g3.addVertex(v2); g3.addVertex(v3); g3.addEdge(v1, v2, new CustomEdge("v1::v2")); g3.addEdge(v3, v1, new CustomEdge("v3-v1")); assertTrue(g1.equals(g2)); assertTrue(!g2.equals(g3)); assertEquals(g2.hashCode(), g1.hashCode()); } /** * Tests equals/hashCode for graphs transformed to weighted. */ public void testAsWeightedGraphs() { UndirectedGraph<String, DefaultEdge> g1 = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); g1.addVertex(v1); g1.addVertex(v2); g1.addVertex(v3); DefaultEdge e12 = g1.addEdge(v1, v2); DefaultEdge e23 = g1.addEdge(v2, v3); DefaultEdge e31 = g1.addEdge(v3, v1); UndirectedGraph<String, DefaultEdge> g2 = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); g2.addVertex(v1); g2.addVertex(v2); g2.addVertex(v3); g2.addEdge(v1, v2, e12); g2.addEdge(v2, v3, e23); g2.addEdge(v3, v1, e31); Map<DefaultEdge, Double> weightMap1 = new HashMap<DefaultEdge, Double>(); weightMap1.put(e12, 10.0); weightMap1.put(e23, 20.0); weightMap1.put(e31, 30.0); WeightedGraph<String, DefaultEdge> g3 = new AsWeightedGraph<String, DefaultEdge>( g1, weightMap1); Map<DefaultEdge, Double> weightMap2 = new HashMap<DefaultEdge, Double>(); weightMap2.put(e12, 10.0); weightMap2.put(e23, 20.0); weightMap2.put(e31, 30.0); WeightedGraph<String, DefaultEdge> g4 = new AsWeightedGraph<String, DefaultEdge>( g2, weightMap2); Map<DefaultEdge, Double> weightMap3 = new HashMap<DefaultEdge, Double>(); weightMap3.put(e12, 100.0); weightMap3.put(e23, 200.0); weightMap3.put(e31, 300.0); WeightedGraph<String, DefaultEdge> g5 = new AsWeightedGraph<String, DefaultEdge>( g2, weightMap3); assertTrue(g1.equals(g2)); assertEquals(g2.hashCode(), g1.hashCode()); assertTrue(g3.equals(g4)); assertEquals(g4.hashCode(), g3.hashCode()); assertTrue(!g4.equals(g5)); } /** * Simple custom edge class. */ public static class CustomEdge extends DefaultEdge { private static final long serialVersionUID = 1L; private String label; public CustomEdge(String label) { this.label = label; } public int hashCode() { return label.hashCode(); } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof CustomEdge)) { return false; } CustomEdge edge = (CustomEdge) obj; return label.equals(edge.label); } } }