package rabbitescape.engine.util;
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.CoreMatchers.equalTo;
import org.junit.Test;
public class TestPosition
{
@Test
public void Compare_to_compares()
{
int[] x = { -1, 0, 1, -1, 0, 1, -1, 0, 1 };
int[] y = { -1, -1, -1, 0, 0, 0, 1, 1, 1 };
int[] e = { 1, 1, 1, 1, 0, -1, -1, -1, -1 };
Position p1 = new Position( 0, 0 );
for ( int i = 0; i < 9; i++ )
{
Position p2 = new Position( x[i], y[i] );
assertThat( sign( p1.compareTo( p2 ) ),
equalTo( sign( e[i] ) ) );
}
}
/**
* @see Java API spec for Comparable
*/
@Test
public void Comparison_is_reversible()
{
int[] x = { -1, 0, 2, -3, 0, 4, -5, 0, 6 };
int[] y = { -7, -8, -9, 0, 0, 0, 1, 2, 3 };
Position p1 = new Position( 0, 0 );
for ( int i = 0; i < 9; i++ )
{
Position p2 = new Position( x[i], y[i] );
assertThat( sign( p1.compareTo( p2 ) ),
equalTo( - sign( p2.compareTo( p1 ) ) ) );
}
}
/**
* @see Java API spec for Comparable
*/
@Test
public void Comparison_is_transitive()
{
Position p1 = new Position( 10, 12 );
Position p2 = new Position( 9, 8 );
Position p3 = new Position( 8, 8 );
assertThat( p1.compareTo( p2 ) > 0 , equalTo( true ) );
assertThat( p2.compareTo( p3 ) > 0 , equalTo( true ) );
assertThat( p1.compareTo( p3 ) > 0 , equalTo( true ) );
}
/**
* @see Java API spec for Comparable
*/
@Test
public void Comparison_three_way_sign_correct()
{
Position p1 = new Position( 10, 12 );
Position p2 = new Position( 10, 12 );
Position p3 = new Position( 8, 8 );
assertThat( p1.compareTo( p2 ) , equalTo( 0 ) );
assertThat( sign( p1.compareTo( p3 ) ) , equalTo( sign( p2.compareTo( p3 ) ) ) );
}
/**
* @see Java API spec for Comparable
*/
@Test
public void Comparison_and_equals_agree()
{
int[] x = { -1, 0, 2, -3, 0, 4, -5, 0, 6 };
int[] y = { -7, -8, -9, 0, 0, 0, 1, 2, 3 };
Position p1 = new Position( 0, 0 );
for ( int i = 0; i < 9; i++ )
{
Position p2 = new Position( x[i], y[i] );
assertThat( p1.compareTo( p2 ) == 0,
equalTo( p1.equals( p2 ) ) );
}
}
// ----------------
private int sign( int i )
{
if ( i == 0 )
{
return 0;
}
return i / Math.abs( i );
}
}