content: package tim.prune.jpeg.drew;
  
  import static org.junit.jupiter.api.Assertions.*;
  
  import org.junit.jupiter.api.Test;
  
  /**
   * JUnit tests for the Rational values used by the Exif
   */
  class RationalTest
  {
  	@Test
  	void testManyInts()
  	{
  		testIntVal(0, 0, 0);
  		testIntVal(1, 0, 0);
  		testIntVal(0, 1, 0);
  		for (int i=0; i<16000; i++)
  		{
  			testIntVal(0, i, 0);
  			testIntVal(i, 0, 0);
  			testIntVal(i, 1, i);
  			testIntVal(-i, 1, -i);
  			testIntVal(i*2, 2, i);
  			testIntVal(i*2+1, 2, i);	// rounding down the 0.5
  			testIntVal(-i*2, 2, -i);
  			testIntVal(i*2, -2, -i);
  			testIntVal(-i*2, -2, i);
  		}
  	}
  
  	/**
  	 * Check that a rational converts to an integer properly
  	 * @param inTop number on top of the rational (numerator)
  	 * @param inBottom number on bottom of the rational (denominator)
  	 * @param inExpected expected int value
  	 */
  	private void testIntVal(long inTop, long inBottom, int inExpected)
  	{
  		Rational value = new Rational(inTop, inBottom);
  		assertEquals(inExpected, value.intValue(), "" + inTop + "/" + inBottom);
  	}
  
  	@Test
  	void testManyDoubles()
  	{
  		for (int i=0; i<16000; i++)
  		{
  			testDoubleVal(0, i, 0.0);
  			testDoubleVal(i, 0, 0.0);
  			testDoubleVal(i, 1, i);
  			testDoubleVal(i*2, 2, i);
  			testDoubleVal(i*2+1, 2, i+0.5);
  			testDoubleVal(i*2, -2, -i);
  		}
  
  		testDoubleVal(123, 3, 123.0/3.0);
  	}
  
  	/**
  	 * Check that a rational converts to a double properly
  	 * @param inTop number on top of the rational (numerator)
  	 * @param inBottom number on bottom of the rational (denominator)
  	 * @param inExpected expected double value (exact)
  	 */
  	private void testDoubleVal(long inTop, long inBottom, double inExpected)
  	{
  		Rational value = new Rational(inTop, inBottom);
  		assertEquals(inExpected, value.doubleValue(), 0.0, "" + inTop + "/" + inBottom);
  	}
  }
  