/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.pdfbox.cos; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.NumberFormat; import java.util.Random; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.pdfbox.pdfwriter.COSWriter; /** * Tests {@link COSFloat}. */ public class TestCOSFloat extends TestCOSNumber { // Use random number to ensure various float values are expressed in the test private Random rnd; private DecimalFormat formatDecimal; { formatDecimal = (DecimalFormat) NumberFormat.getNumberInstance(); formatDecimal.setMaximumFractionDigits(10); formatDecimal.setGroupingUsed(false); DecimalFormatSymbols symbols = formatDecimal.getDecimalFormatSymbols(); symbols.setDecimalSeparator('.'); formatDecimal.setDecimalFormatSymbols(symbols); } public void setUp() { rnd = new Random(); try { testCOSBase = COSNumber.get("1.1"); } catch (IOException e) { fail("Failed to create a COSNumber in setUp()"); } } /** * Tests equals() - ensures that the Object.equals() contract is obeyed. These are tested over * a range of arbitrary values to ensure Consistency, Reflexivity, Symmetry, Transitivity and * non-nullity. */ public void testEquals() { // Consistency for (int i = -100000; i < 300000; i += 20000) { float num = i * rnd.nextFloat(); COSFloat test1 = new COSFloat(num); COSFloat test2 = new COSFloat(num); COSFloat test3 = new COSFloat(num); // Reflexive (x == x) assertTrue(test1.equals(test1)); // Symmetric is preserved ( x==y then y==x) assertTrue(test2.equals(test1)); assertTrue(test1.equals(test2)); // Transitive (if x==y && y==z then x==z) assertTrue(test1.equals(test2)); assertTrue(test2.equals(test3)); assertTrue(test1.equals(test3)); // Non-nullity assertFalse(test1.equals(null)); assertFalse(test2.equals(null)); assertFalse(test3.equals(null)); float nf = Float.intBitsToFloat(Float.floatToIntBits(num)+1); COSFloat test4 = new COSFloat(nf); assertFalse(test4.equals(test1)); } } /** * Tests hashCode() - ensures that the Object.hashCode() contract is obeyed over a range of * arbitrary values. */ public void testHashCode() { for (int i = -100000; i < 300000; i += 20000) { float num = i * rnd.nextFloat(); COSFloat test1 = new COSFloat(num); COSFloat test2 = new COSFloat(num); assertEquals(test1.hashCode(), test2.hashCode()); float nf = Float.intBitsToFloat(Float.floatToIntBits(num)+1); COSFloat test3 = new COSFloat(nf); assertFalse(test3.hashCode()==test1.hashCode()); } } @Override public void testFloatValue() { for (int i = -100000; i < 300000; i += 20000) { float num = i * rnd.nextFloat(); COSFloat testFloat = new COSFloat(num); assertEquals(num, testFloat.floatValue()); } } @Override public void testDoubleValue() { for (int i = -100000; i < 300000; i += 20000) { float num = i * rnd.nextFloat(); COSFloat testFloat = new COSFloat(num); assertEquals((double) num, testFloat.doubleValue()); } } @Override public void testIntValue() { for (int i = -100000; i < 300000; i += 20000) { float num = i * rnd.nextFloat(); COSFloat testFloat = new COSFloat(num); assertEquals((int) num, testFloat.intValue()); } } @Override public void testLongValue() { for (int i = -100000; i < 300000; i += 20000) { float num = i * rnd.nextFloat(); COSFloat testFloat = new COSFloat(num); assertEquals((long) num, testFloat.longValue()); } } @Override public void testAccept() { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); COSWriter visitor = new COSWriter(outStream); float num = 0; try { for (int i = -100000; i < 300000; i += 20000) { num = i * rnd.nextFloat(); COSFloat cosFloat = new COSFloat(num); cosFloat.accept(visitor); testByteArrays(formatDecimal.format(num).getBytes("ISO-8859-1"), outStream.toByteArray()); outStream.reset(); } } catch (Exception e) { fail("Failed to write " + num + " exception: " + e.getMessage()); } } /** * Tests writePDF() - this method takes an {@link OutputStream} and writes this object to it. */ public void testWritePDF() { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); float num = 0; try { for (int i = -1000; i < 3000; i += 200) { num = i * rnd.nextFloat(); COSFloat cosFloat = new COSFloat(num); cosFloat.writePDF(outStream); testByteArrays(formatDecimal.format(num).getBytes("ISO-8859-1"), outStream.toByteArray()); outStream.reset(); } } catch (IOException e) { fail("Failed to write " + num + " exception: " + e.getMessage()); } } /** * This will get the suite of test that this class holds. * * @return All of the tests that this class holds. */ public static Test suite() { return new TestSuite(TestCOSFloat.class); } }