--- /dev/null
+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);
+ }
+}