/*
* File: RingTestHarness.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright August 1, 2006, Sandia Corporation. Under the terms of Contract
* DE-AC04-94AL85000, there is a non-exclusive license for use of this work by
* or on behalf of the U.S. Government. Export of this program may require a
* license from the United States Government. See CopyrightHistory.txt for
* complete details.
*
*/
package gov.sandia.cognition.statistics;
import gov.sandia.cognition.math.Ring;
import java.util.Random;
import junit.framework.TestCase;
/**
* Abstract class that rigorously tests the methods in Ring using RANDOM
* subclasses.
* @param <RingType> Type of ring to test
* @author krdixon
*/
abstract public class RingTestHarness<RingType extends Ring<RingType>> extends TestCase
{
/**
* Random-number generator to use
*/
public static final Random RANDOM = new Random( 0 );
/**
* Range of the RANDOM numbers
*/
protected static double RANGE = RANDOM.nextDouble() * 100.0;
/**
* Default tolerance
*/
protected static double TOLERANCE = 1e-5;
/**
* Constructor
* @param testName name of the test
*/
public RingTestHarness( String testName )
{
super( testName );
}
/**
* Create a new random RingType object
* @return Random RingType
*/
abstract protected RingType createRandom();
/**
* Test of scaleEquals method, of class gov.sandia.isrc.math.Ring.
*/
abstract public void testScaleEquals();
/**
* Test of plusEquals method, of class gov.sandia.isrc.math.Ring.
*/
abstract public void testPlusEquals();
/**
* Test of dotTimesEquals method, of class gov.sandia.isrc.math.Ring.
*/
abstract public void testDotTimesEquals();
/**
* Test of equals method, of class gov.sandia.isrc.math.Ring.
*/
public void testEquals()
{
System.out.println( "hashCode" );
RingType r1 = this.createRandom();
assertFalse( r1.equals( null ) );
RingType r1clone = r1.clone();
assertEquals( r1, r1 );
assertEquals( r1, r1clone );
double delta = RANDOM.nextDouble() + 10.0;
RingType r2 = r1.scale( delta );
assertEquals( r1, r1clone );
assertFalse( r1.equals( r2 ) );
assertFalse( r1.equals( r2, TOLERANCE ) );
r1.zero();
r2.zero();
assertEquals( r1, r2 );
}
/**
* Test of clone method, of class gov.sandia.isrc.math.Ring.
*/
public void testClone()
{
System.out.println( "clone" );
RingType r1 = this.createRandom();
RingType r2 = r1.clone();
assertNotSame( r1, r2 );
assertEquals( r1, r2 );
r2.scaleEquals( RANDOM.nextDouble() );
assertFalse( r1.equals( r2 ) );
}
/**
* Test of plus method, of class gov.sandia.isrc.math.Ring.
*/
public void testPlus()
{
System.out.println( "plus" );
// This test assumes that plusEquals has been tested and verified, and
// that the exception conditions are equivalent
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
RingType r2 = r1.scale( RANDOM.nextDouble() * 2.0 * RANGE - RANGE );
RingType r2clone = r2.clone();
// Check that plus() doesn't modify r1 or r2
r1.plus( r2 );
assertEquals( r1, r1clone );
assertEquals( r2, r2clone );
// Check that plusEquals() doesn't modify r2, but does modify r1
r1.plusEquals( r2 );
assertEquals( r2, r2clone );
assertFalse( r1.equals( r1clone ) );
// See if the plusEquals() result is the same as plus() result
assertEquals( r1, r1clone.plus( r2 ) );
// Self-addition should equal a scale of 2.0
assertEquals( r1.plus( r1 ), r1.scale( 2.0 ) );
try
{
r1.plus( null );
fail( "Should have thrown null-pointer exception: plus() " + r1.getClass() );
}
catch (NullPointerException e)
{
}
}
/**
* Test of minus method, of class gov.sandia.isrc.math.Ring.
*/
public void testMinus()
{
System.out.println( "minus" );
// This test assumes that plus and scale have been tested and verified
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
RingType r2 = r1.scale( RANDOM.nextDouble() * 2.0 * RANGE - RANGE );
RingType r2clone = r2.clone();
assertTrue( r1.minus( r2 ).equals( r1.plus( r2.scale( -1.0 ) ), TOLERANCE ) );
// This makes sure that the minus operator didn't modify the result
assertEquals( r1, r1clone );
assertEquals( r2, r2clone );
// Make sure minus and minusEquals return the same value
// and that the r2 doesn't get modified by the methods
r1.minusEquals( r2 );
assertEquals( r2clone, r2 );
assertEquals( r1, r1clone.minus( r2 ) );
assertEquals( r2clone, r2 );
// Self minus should equal zero-ing
r2.minusEquals( r2 );
r1.zero();
// assertEquals( r1, r2 );
try
{
r1.minus( null );
fail( "Should have thrown null-pointer exception: minus() " + r1.getClass() );
}
catch (NullPointerException e)
{
}
}
/**
* Test of minusEquals method, of class gov.sandia.isrc.math.Ring.
*/
public void testMinusEquals()
{
System.out.println( "minusEquals" );
// This test assumes that plusEquals and scale have been tested and verified
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
RingType r2 = r1.scale( RANDOM.nextDouble() * 2.0 * RANGE - RANGE );
RingType r2clone = r2.clone();
r1.minusEquals( r2 );
assertEquals( r2, r2clone );
assertFalse( r1.equals( r1clone ) );
r1clone.plusEquals( r2.scale( -1.0 ) );
assertEquals( r2, r2clone );
assertTrue( r1.equals( r1clone, TOLERANCE ) );
try
{
r1.minusEquals( null );
fail( "Should have thrown null-pointer exception: minusEquals() " + r1.getClass() );
}
catch (NullPointerException e)
{
}
}
/**
* Test of dotTimes method, of class gov.sandia.isrc.math.Ring.
*/
public void testDotTimes()
{
System.out.println( "dotTimes" );
// This test assumes that dotTimesEquals has been tested and verified
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
RingType r2 = r1.scale( RANDOM.nextDouble() * 2.0 * RANGE - RANGE );
RingType r2clone = r2.clone();
r1.dotTimes( r2 );
assertEquals( r1, r1clone );
assertEquals( r2, r2clone );
r1.dotTimesEquals( r2 );
assertFalse( r1.equals( r1clone ) );
assertEquals( r2, r2clone );
assertTrue( r1.equals( r1clone.dotTimes( r2 ), TOLERANCE ) );
try
{
r1.dotTimes( null );
fail( "Should have thrown null-pointer exception: dotTimes() " + r1.getClass() );
}
catch (NullPointerException e)
{
}
}
/**
* Test of scale method, of class gov.sandia.isrc.math.Ring.
*/
public void testScale()
{
System.out.println( "scale" );
// This test assumes that scaleEquals has been tested and verified
double scaleFactor = RANDOM.nextDouble() * 2.0 * RANGE - RANGE;
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
assertEquals( r1, r1clone );
r1.scaleEquals( scaleFactor );
assertTrue( r1.equals( r1clone.scale( scaleFactor ), TOLERANCE ) );
assertFalse( r1.equals( r1clone ) );
assertEquals( r1.scale( 2.0 ), r1.plus( r1 ) );
}
/**
* Test of negative method, of class gov.sandia.isrc.math.Ring.
*/
public void testNegative()
{
System.out.println( "negative" );
// This test assumes that scale() has been tested and verified
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
r1.negative();
assertEquals( r1, r1clone );
assertTrue( r1.negative().equals( r1.scale( -1.0 ), TOLERANCE ) );
}
/**
* Test of negativeEquals method, of class gov.sandia.isrc.math.Ring.
*/
public void testNegativeEquals()
{
System.out.println( "negativeEquals" );
// This test assumes that scaleEquals() has been tested and verified
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
RingType r2 = r1.clone();
RingType r2clone = r2.clone();
assertEquals( r1, r1clone );
r1.negativeEquals();
assertFalse( r1.equals( r1clone ) );
assertEquals( r2, r2clone );
r2.scaleEquals( -1.0 );
assertFalse( r2.equals( r2clone ) );
assertTrue( r1.equals( r2, TOLERANCE ) );
}
/**
* Test of zero method, of class gov.sandia.isrc.math.Ring.
*/
public void testZero()
{
System.out.println( "zero" );
RingType r1 = this.createRandom();
RingType r1clone = r1.clone();
RingType r2 = r1.clone();
RingType r2clone = r2.clone();
assertEquals( r1, r2 );
r1.zero();
assertFalse( r1.equals( r1clone ) );
assertEquals( r1, r2.scale( 0.0 ) );
assertEquals( r2, r2clone );
}
}