package de.axone.equals;
import static org.testng.Assert.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.testng.annotations.Test;
import de.axone.tools.Mapper;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@Test( groups="tools.equals" )
public class StrongHashCodeBuilderTest {
public static void testStringHashesJenkins96() throws Exception {
testStringHashes( new Jenkins96HashCodeBuilder() );
}
public static void testCollectionHashesJenkins96() throws Exception {
testCollectionHashes( new Jenkins96HashCodeBuilder( false ) );
}
public static void testStringHashesSha1() throws Exception {
testStringHashes( new CryptoHashCodeBuilder() );
}
public static void testCollectionHashesSha1() throws Exception {
testCollectionHashes( new CryptoHashCodeBuilder() );
}
@SuppressFBWarnings( value="ES_COMPARING_STRINGS_WITH_EQ",
justification="We exactly want to test if this is another object" )
private static <T> void testStringHashes( AbstractStrongHashCodeBuilder<T> builder ) throws Exception {
StrongHashCodeBuilder<T> j = builder.builder();
assertEquals( j.toHashCode(), builder.empty() );
int a = 123;
String s1 = "Hello123";
String s2 = "Hello"+a;
assertEquals( s1, s2 );
assertFalse( s1==s2 );
assertEquals( s1.hashCode(), s2.hashCode() );
T h1 = builder.builder()
.append( s1 )
.toHashCode();
T h3 = builder.builder()
.append( s2 )
.toHashCode();
assertEquals( h1, h3 );
testHashesEquals( true, h1, h3 ); // Test test
}
private static <T> void testCollectionHashes( AbstractStrongHashCodeBuilder<T> builder ) throws Exception {
int three=3;
String s1 = "S1";
String s2 = "S2";
String s3 = "S3";
String sThree = "S"+three;
String [] a1 = new String[]{ s1, s2, s3 };
String [] a1_ = new String[]{ s1, s2, sThree };
String [] a1_x = new String[]{ s1, s3, s2 };
String [] a2 = new String[]{ s2, s3 };
String [] a3 = new String[]{ s1, s2 };
String [] a4 = new String[]{ s1, sThree };
testEquals( builder, true, null, null );
// Arrays ----------------------------------------
testEquals( builder, true, new String[0], new String[0] );
testEquals( builder, false, new String[0], null );
testEquals( builder, true, a1, a1 );
testEquals( builder, true, a1, a1_ );
testEquals( builder, false, a1, a1_x );
testEquals( builder, false, a1, a2 );
testEquals( builder, false, a1, a3 );
testEquals( builder, false, a1, a4 );
// Lists ----------------------------------------
List<String> list1 = Arrays.asList( a1 );
testEquals( builder, false, new LinkedList<String>(), null );
testEquals( builder, true, list1, list1 );
testEquals( builder, true, list1, Arrays.asList( a1_ ) );
testEquals( builder, false, list1, Arrays.asList( a1_x ) );
testEquals( builder, false, list1, Arrays.asList( a2 ) );
testEquals( builder, false, list1, Arrays.asList( a3 ) );
testEquals( builder, false, list1, Arrays.asList( a4 ) );
// Sets ----------------------------------------
Set<String> set1 = new HashSet<String>( Arrays.asList( a1 ) );
Set<String> set1_ = new HashSet<String>( Arrays.asList( a1_ ) );
Set<String> set_x = new HashSet<String>( Arrays.asList( a1_x ) );
Set<String> set2 = new HashSet<String>( Arrays.asList( a2 ) );
Set<String> set3 = new HashSet<String>( Arrays.asList( a3 ) );
Set<String> set4 = new HashSet<String>( Arrays.asList( a4 ) );
testEquals( builder, false, new HashSet<String>(), null );
testEquals( builder, true, set1, set1 );
testEquals( builder, true, set1, set1_ );
testEquals( builder, true, set1, set_x );
testEquals( builder, false, set1, set2 );
testEquals( builder, false, set1, set3 );
testEquals( builder, false, set1, set4 );
// Maps ----------------------------------------
Map<String,String> map1 = Mapper.hashMap( "a", s1, "b", s2, "c", s3 );
Map<String,String> map1_ = Mapper.hashMap( "a", s1, "b", s2, "c", sThree );
Map<String,String> map1_X = Mapper.hashMap( "b", s2, "c", s3, "a", s1 );
Map<String,String> map1_X2 = Mapper.hashMap( "a", s2, "b", s1, "c", s3 );
Map<String,String> map2 = Mapper.hashMap( "a", s1, "b", s2 );
Map<String,String> map3 = Mapper.hashMap( "b", s2, "c", s3 );
Map<String,String> map4 = Mapper.hashMap( "a", s1, "b", s2, "c", s3, "d", "s4" );
testEquals( builder, true, map1, map1_ );
testEquals( builder, true, map1, map1_X );
testEquals( builder, false, map1, map1_X2 );
testEquals( builder, false, map1, map2 );
testEquals( builder, false, map1, map3 );
testEquals( builder, false, map1, map4 );
}
private static <T> void testEquals( AbstractStrongHashCodeBuilder<T> builder,
boolean equals, Object o1, Object o2 ){
T h1 = builder.builder()
.append( o1 )
.toHashCode();
T h2 = builder.builder()
.append( o2 )
.toHashCode();
testHashesEquals( equals, h1, h2 );
}
private static void testHashesEquals( boolean equals, Object h1, Object h2 ){
boolean ok=true;
if( equals ){
assertEquals( h1, h2 );
} else {
//if( h1.equals( h2 ) ) E.rr( h1 );
assertFalse( h1.equals( h2 ) );
}
if( !ok ){
//E.rr( h1 + " / " + h2 );
assertTrue( false );
}
}
}