Author: lehmi Date: Sun Jun 14 15:43:59 2020 New Revision: 1878834 URL: http://svn.apache.org/viewvc?rev=1878834&view=rev Log: PDFBOX-4883: add test cases by Alfred Faltiska
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java?rev=1878834&r1=1878833&r2=1878834&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/cos/TestCOSFloat.java Sun Jun 14 15:43:59 2020 @@ -117,7 +117,7 @@ public class TestCOSFloat extends TestCO assertTrue(test1.equals(test1)); // Symmetric is preserved ( x==y then y==x) assertTrue(test2.equals(test3)); - assertTrue(test1.equals(test2)); + assertTrue(test3.equals(test2)); // Transitive (if x==y && y==z then x==z) assertTrue(test1.equals(test2)); assertTrue(test2.equals(test3)); @@ -275,9 +275,17 @@ public class TestCOSFloat extends TestCO { COSFloat cosFloat = new COSFloat(num); cosFloat.writePDF(outStream); - assertEquals(floatToString(cosFloat.floatValue()), outStream.toString("ISO-8859-1")); - assertEquals(floatToString(num), outStream.toString("ISO-8859-1")); - testByteArrays(floatToString(num).getBytes(StandardCharsets.ISO_8859_1), outStream.toByteArray()); + + String expected = floatToString(cosFloat.floatValue()); + assertEquals(expected, outStream.toString("ISO-8859-1")); + assertEquals("COSFloat{" + expected + "}", cosFloat.toString()); + + expected = floatToString(num); + assertEquals(expected, outStream.toString("ISO-8859-1")); + assertEquals("COSFloat{" + expected + "}", cosFloat.toString()); + testByteArrays(expected.getBytes(StandardCharsets.ISO_8859_1), + outStream.toByteArray()); + outStream.reset(); } catch (IOException e) @@ -308,6 +316,117 @@ public class TestCOSFloat extends TestCO assertEquals(-16.33f, cosFloat.floatValue()); } + public void testVerySmallValues() throws IOException + { + double smallValue = Float.MIN_VALUE / 10d; + + assertEquals("Test must be performed with a value smaller than Float.MIN_VALUE.", -1, + Double.compare(smallValue, Float.MIN_VALUE)); + + // 1.4012984643248171E-46 + String asString = String.valueOf(smallValue); + COSFloat cosFloat = new COSFloat(asString); + assertEquals(Float.MIN_NORMAL, cosFloat.floatValue()); + + // 0.00000000000000000000000000000000000000000000014012984643248171 + asString = new BigDecimal(asString).toPlainString(); + cosFloat = new COSFloat(asString); + assertEquals(Float.MIN_NORMAL, cosFloat.floatValue()); + + smallValue *= -1; + + // -1.4012984643248171E-46 + asString = String.valueOf(smallValue); + cosFloat = new COSFloat(asString); + assertEquals(-Float.MIN_NORMAL, cosFloat.floatValue()); + + // -0.00000000000000000000000000000000000000000000014012984643248171 + asString = new BigDecimal(asString).toPlainString(); + cosFloat = new COSFloat(asString); + assertEquals(-Float.MIN_NORMAL, cosFloat.floatValue()); + } + + public void testVeryLargeValues() throws IOException + { + double largeValue = Float.MAX_VALUE * 10d; + + assertEquals("Test must be performed with a value larger than Float.MAX_VALUE.", 1, + Double.compare(largeValue, Float.MIN_VALUE)); + + // 1.4012984643248171E-46 + String asString = String.valueOf(largeValue); + COSFloat cosFloat = new COSFloat(asString); + assertEquals(Float.MAX_VALUE, cosFloat.floatValue()); + + // 0.00000000000000000000000000000000000000000000014012984643248171 + asString = new BigDecimal(asString).toPlainString(); + cosFloat = new COSFloat(asString); + assertEquals(Float.MAX_VALUE, cosFloat.floatValue()); + + largeValue *= -1; + + // -1.4012984643248171E-46 + asString = String.valueOf(largeValue); + cosFloat = new COSFloat(asString); + assertEquals(-Float.MAX_VALUE, cosFloat.floatValue()); + + // -0.00000000000000000000000000000000000000000000014012984643248171 + asString = new BigDecimal(asString).toPlainString(); + cosFloat = new COSFloat(asString); + assertEquals(-Float.MAX_VALUE, cosFloat.floatValue()); + } + + public void testMisplacedNegative() throws IOException + { + // PDFBOX-2990, PDFBOX-3369 have 0.00000-33917698 + // PDFBOX-3500 has 0.-262 + + COSFloat cosFloat = new COSFloat("0.00000-33917698"); + assertEquals(new COSFloat("-0.0000033917698"), cosFloat); + + cosFloat = new COSFloat("0.-262"); + assertEquals(new COSFloat("-0.262"), cosFloat); + } + + public void testDuplicateMisplacedNegative() + { + try + { + new COSFloat("0.-26-2"); + fail("Was expecting an IOException"); + } + catch (IOException expected) + { + } + + try + { + new COSFloat("-0.-262"); + fail("Was expecting an IOException"); + } + catch (IOException expected) + { + } + + try + { + new COSFloat("---0.262"); + fail("Was expecting an IOException"); + } + catch (IOException expected) + { + } + + try + { + new COSFloat("--0.2-62"); + fail("Was expecting an IOException"); + } + catch (IOException expected) + { + } + } + private String floatToString(float value) { // use a BigDecimal as intermediate state to avoid