You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by bl...@apache.org on 2003/05/20 21:41:56 UTC

cvs commit: avalon/src/test/org/apache/avalon/framework/test VersionTestCase.java

bloritsch    2003/05/20 12:41:55

  Modified:    src/java/org/apache/avalon/framework Version.java
               src/test/org/apache/avalon/framework/test
                        VersionTestCase.java
  Log:
  add some more stuff to Version to ensure its flexible use in the bundle API--all dealing with comparisons
  
  Revision  Changes    Path
  1.27      +61 -23    avalon/src/java/org/apache/avalon/framework/Version.java
  
  Index: Version.java
  ===================================================================
  RCS file: /home/cvs/avalon/src/java/org/apache/avalon/framework/Version.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- Version.java	11 Feb 2003 16:19:27 -0000	1.26
  +++ Version.java	20 May 2003 19:41:55 -0000	1.27
  @@ -90,7 +90,7 @@
    * @version CVS $Revision$ $Date$
    */
   public final class Version
  -    implements Serializable
  +    implements Comparable, Serializable
   {
       private int m_major;
       private int m_minor;
  @@ -200,22 +200,19 @@
        */
       public boolean equals( final Version other )
       {
  -        if( m_major != other.m_major )
  -        {
  -            return false;
  -        }
  -        else if( m_minor != other.m_minor )
  -        {
  -            return false;
  -        }
  -        else if( m_micro != other.m_micro )
  -        {
  -            return false;
  -        }
  -        else
  -        {
  -            return true;
  -        }
  +    	boolean isEqual = ( getMajor() == other.getMajor() );
  +    	
  +		if ( isEqual )
  +		{
  +			isEqual = ( getMinor() == other.getMinor() );
  +		}
  +    	
  +		if ( isEqual )
  +		{
  +			isEqual = ( getMicro() == other.getMicro() );
  +		}
  +
  +        return isEqual;
       }
   
       /**
  @@ -228,14 +225,33 @@
        */
       public boolean equals( final Object other )
       {
  +    	boolean isEqual = false;
  +    	
           if( other instanceof Version )
           {
  -            return equals( (Version)other );
  -        }
  -        else
  -        {
  -            return false;
  +            isEqual = equals( (Version)other );
           }
  +
  +        return isEqual;
  +    }
  +    
  +    /**
  +     * Add a hashing function to ensure the Version object is
  +     * treated as expected in hashmaps and sets.  NOTE: any
  +     * time the equals() is overridden, hashCode() should also
  +     * be overridden.
  +     * 
  +     * @return the hashCode
  +     */
  +    public int hashCode()
  +    {
  +    	int hash = getMajor();
  +    	hash >>>= 17;
  +    	hash += getMinor();
  +    	hash >>>= 17;
  +    	hash += getMicro();
  +    	
  +    	return hash;
       }
   
       /**
  @@ -300,4 +316,26 @@
       {
           return m_major + "." + m_minor + "." + m_micro;
       }
  +
  +    /**
  +     * Compare two versions together according to the
  +     * Comparable interface.
  +     * 
  +     * @return number indicating relative value (-1, 0, 1)
  +     */
  +	public int compareTo(Object o) {
  +		Version other = (Version)o;
  +		int val = 0;
  +
  +		if ( getMajor() < other.getMajor() ) val = -1;
  +		if ( 0 == val && getMajor() > other.getMajor() ) val = 1;
  +
  +		if ( 0 == val && getMinor() < other.getMinor() ) val = -1;
  +		if ( 0 == val && getMinor() > other.getMinor() ) val = 1;
  +
  +		if ( 0 == val && getMicro() < other.getMicro() ) val = -1;
  +		if ( 0 == val && getMicro() > other.getMicro() ) val = 1;
  +
  +		return val;
  +	}
   }
  
  
  
  1.6       +46 -0     avalon/src/test/org/apache/avalon/framework/test/VersionTestCase.java
  
  Index: VersionTestCase.java
  ===================================================================
  RCS file: /home/cvs/avalon/src/test/org/apache/avalon/framework/test/VersionTestCase.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- VersionTestCase.java	22 Mar 2003 10:59:18 -0000	1.5
  +++ VersionTestCase.java	20 May 2003 19:41:55 -0000	1.6
  @@ -117,4 +117,50 @@
           assertTrue( ! v1.complies( v4 ) );
           assertTrue( ! v4.complies( v1 ) );
       }
  +    
  +    public void testHashCode()
  +    {
  +    	final Version v1 = new Version( 5, 1, 0 );
  +    	final Version v2 = new Version( 1, 0, 3 );
  +    	final Version v3 = new Version( 1, 0, 3 );
  +    	
  +		assertEquals( calculateHash(v1), v1.hashCode() );
  +		assertEquals( calculateHash(v2), v2.hashCode() );
  +		
  +		assertTrue( v1.hashCode() != v2.hashCode() );
  +		assertTrue( ! v1.equals(v2) );
  +		
  +		assertEquals( v2.hashCode(), v3.hashCode() );
  +		assertEquals( v2, v3 );
  +    }
  +    
  +    public void testComparable()
  +    {
  +    	final Version v1 = new Version( 1, 0, 0 );
  +    	final Version v2 = new Version( 2, 0, 0 );
  +    	final Version v3 = new Version( 2, 1, 0 );
  +    	final Version v4 = new Version( 2, 1, 1 );
  +    	final Version v5 = new Version( 1, 0, 0 );
  +    	
  +    	assertEquals( 0, v1.compareTo(v5) );
  +    	assertEquals( 0, v5.compareTo(v1) );
  +    	
  +		assertEquals( -1, v1.compareTo(v2) );
  +		assertEquals( 1, v2.compareTo(v1) );
  +    	
  +		assertEquals( -1, v2.compareTo(v3) );
  +		assertEquals( 1, v3.compareTo(v2) );
  +    	
  +		assertEquals( -1, v3.compareTo(v4) );
  +		assertEquals( 1, v4.compareTo(v3) );
  +    }
  +
  +	private int calculateHash(final Version v) {
  +		int hash = v.getMajor();
  +		hash >>>= 17;
  +		hash += v.getMinor();
  +		hash >>>= 17;
  +		hash += v.getMicro();
  +		return hash;
  +	}
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org