package org.marketcetera.core; import junit.framework.TestCase; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; /** * @author Graham Miller */ @ClassVersion("$Id: BigDecimalUtilsTest.java 16154 2012-07-14 16:34:05Z colin $") //$NON-NLS-1$ public class BigDecimalUtilsTest extends TestCase { /* * Test method for 'org.marketcetera.core.BigDecimalUtils.add(BigDecimal, BigDecimal)' */ public void testAddBigDecimalBigDecimal() { assertEquals((double)123.0+87.5, BigDecimalUtils.add(new BigDecimal(123.0), new BigDecimal(87.5)).doubleValue(), .000001); assertEquals((double)-123.0+87.5, BigDecimalUtils.add(new BigDecimal(-123.0), new BigDecimal(87.5)).doubleValue(), .000001); assertEquals((double)8888.0+.0001, BigDecimalUtils.add(new BigDecimal(8888.0), new BigDecimal(.0001)).doubleValue(), .000001); assertEquals((double)92384.5+0, BigDecimalUtils.add(new BigDecimal(92384.5), new BigDecimal(0)).doubleValue(), .000001); } /* * Test method for 'org.marketcetera.core.BigDecimalUtils.multiply(double, double)' */ public void testMultiplyDoubleDouble() { assertEquals((double)123.0*87.5, BigDecimalUtils.multiply((double)123.0, (double)87.5).doubleValue(), .000001); assertEquals((double)-123.0*87.5, BigDecimalUtils.multiply((double)-123.0, (double)87.5).doubleValue(), .000001); assertEquals((double)8888.0*.0001, BigDecimalUtils.multiply((double)8888.0, (double).0001).doubleValue(), .000001); assertEquals((double)92384.5*0, BigDecimalUtils.multiply((double)92384.5, (double)0).doubleValue(), .000001); } /* * Test method for 'org.marketcetera.core.BigDecimalUtils.multiply(BigDecimal, double)' */ public void testMultiplyBigDecimalDouble() { assertEquals((double)123.0*87.5, BigDecimalUtils.multiply(new BigDecimal(123.0), (double)87.5).doubleValue(), .000001); assertEquals((double)-123.0*87.5, BigDecimalUtils.multiply(new BigDecimal(-123.0), (double)87.5).doubleValue(), .000001); assertEquals((double)8888.0*.0001, BigDecimalUtils.multiply(new BigDecimal(8888.0), (double).0001).doubleValue(), .000001); assertEquals((double)92384.5*0, BigDecimalUtils.multiply(new BigDecimal(92384.5), (double)0).doubleValue(), .000001); } /* * Test method for 'org.marketcetera.core.BigDecimalUtils.multiply(BigDecimal, BigDecimal)' */ public void testMultiplyBigDecimalBigDecimal() { assertEquals((double)123.0*87.5, BigDecimalUtils.multiply(new BigDecimal(123.0), new BigDecimal(87.5)).doubleValue(), .000001); assertEquals((double)-123.0*87.5, BigDecimalUtils.multiply(new BigDecimal(-123.0), new BigDecimal(87.5)).doubleValue(), .000001); assertEquals((double)8888.0*.0001, BigDecimalUtils.multiply(new BigDecimal(8888.0), new BigDecimal(.0001)).doubleValue(), .000001); assertEquals((double)92384.5*0, BigDecimalUtils.multiply(new BigDecimal(92384.5), new BigDecimal(0)).doubleValue(), .000001); } /* * Test method for 'org.marketcetera.core.BigDecimalUtils.multiply(BigDecimal, BigDecimal)' */ public void testDivideBigDecimalBigDecimal() { assertEquals((double)123.0/87.5, BigDecimalUtils.divide(new BigDecimal(123.0), new BigDecimal(87.5)).doubleValue(), .000001); assertEquals((double)-123.0/87.5, BigDecimalUtils.divide(new BigDecimal(-123.0), new BigDecimal(87.5)).doubleValue(), .000001); assertEquals((double)8888.0/.0001, BigDecimalUtils.divide(new BigDecimal(8888.0), new BigDecimal(0.0001)).doubleValue(), .000001); new ExpectedTestFailure(ArithmeticException.class) { protected void execute() throws Throwable { BigDecimalUtils.divide(new BigDecimal(92384.5), new BigDecimal(0)); } }.run(); } public void testBigDecimalAssumptions() throws Exception { // This is what round and scale do: // Round is used to set the total number of significant digits. So even though we // use RoundingMode.HALF_UP on 10.5, its rounding to 1 significant digit, so it // rounds to 10. assertEquals(new BigDecimal("10").toPlainString(), new BigDecimal("10.5").round(new MathContext(1, RoundingMode.HALF_UP)).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ // Set scale sets the scale (the number of digits to the right of the // decimal place (this is often what we mean by "round"). assertEquals(new BigDecimal("11").toPlainString(), new BigDecimal("10.5").setScale(0, RoundingMode.HALF_UP).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals(new BigDecimal("10").toPlainString(), new BigDecimal("10.5").setScale(0, RoundingMode.HALF_DOWN).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("10.3000", new BigDecimal("10.3000").toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("10.3000", new BigDecimal("10.3000").toString()); //$NON-NLS-1$ //$NON-NLS-2$ } public void testTrim() throws Exception { assertEquals("1.5", BigDecimalUtils.trim(new BigDecimal("1.5")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("1", BigDecimalUtils.trim(new BigDecimal("1.0")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("1", BigDecimalUtils.trim(new BigDecimal("1")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("1.5", BigDecimalUtils.trim(new BigDecimal("1.50")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("0", BigDecimalUtils.trim(new BigDecimal("0")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("0", BigDecimalUtils.trim(new BigDecimal("-0")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("0", BigDecimalUtils.trim(new BigDecimal("0.0")).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ } /** * Test the assumption that the String constructor for BigDecimal preserves * scale, and trailing zeroes. * */ public void testToPlainStringAssumptions() { assertEquals("23.45", new BigDecimal("23.45").toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("23.40", new BigDecimal("23.40").toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("23.450", new BigDecimal("23.45").setScale(3).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("23.400", new BigDecimal("23.40").setScale(3).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("23.4", new BigDecimal("23.40").setScale(1).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ new ExpectedTestFailure(ArithmeticException.class){ @Override protected void execute() throws Throwable { assertEquals("23.5", new BigDecimal("23.46").setScale(1).toPlainString()); //$NON-NLS-1$ //$NON-NLS-2$ } }.run(); } }