/** * Copyright (c) 2012, 2014, Credit Suisse (Anatole Tresch), Werner Keil and others by the @author tag. * * Licensed 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.javamoney.moneta; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import javax.money.CurrencyUnit; import javax.money.MonetaryAmount; import javax.money.Monetary; import javax.money.MonetaryContext; import javax.money.MonetaryContextBuilder; import javax.money.MonetaryException; import javax.money.MonetaryOperator; import javax.money.MonetaryQuery; import org.junit.Assert; import org.testng.annotations.Test; /** * @author Anatole * @author Werner */ public class MoneyTest { // TODO break this down into smaller test classes, 1.5k LOC seems a bit large;-) private static final BigDecimal TEN = new BigDecimal(10.0d); protected static final CurrencyUnit EURO = Monetary.getCurrency("EUR"); protected static final CurrencyUnit DOLLAR = Monetary.getCurrency("USD"); protected static final CurrencyUnit BRAZILIAN_REAL = Monetary.getCurrency("BRL"); /** * Test method for * {@link org.javamoney.moneta.Money#of(java.math.BigDecimal, javax.money.CurrencyUnit)} . */ @Test public void testOfCurrencyUnitBigDecimal() { Money m = Money.of(TEN, Monetary.getCurrency("EUR")); assertEquals(TEN, m.getNumber().numberValue(BigDecimal.class)); } @Test public void testOfCurrencyUnitDouble() { Money m = Money.of(10.0d, Monetary.getCurrency("EUR")); assertTrue(TEN.doubleValue() == m.getNumber().doubleValue()); } /** * Test method for {@link org.javamoney.moneta.Money#getCurrency()}. */ @Test public void testGetCurrency() { MonetaryAmount money = Money.of(BigDecimal.TEN, EURO); assertNotNull(money.getCurrency()); assertEquals("EUR", money.getCurrency().getCurrencyCode()); } @Test public void testSubtractMonetaryAmount() { Money money1 = Money.of(BigDecimal.TEN, EURO); Money money2 = Money.of(BigDecimal.ONE, EURO); Money moneyResult = money1.subtract(money2); assertNotNull(moneyResult); assertEquals(9d, moneyResult.getNumber().doubleValue(), 0d); } @Test public void testDivideAndRemainder_BigDecimal() { Money money1 = Money.of(BigDecimal.ONE, EURO); Money[] divideAndRemainder = money1.divideAndRemainder(new BigDecimal("0.50000000000000000001")); assertEquals(divideAndRemainder[0].getNumber().numberValue(BigDecimal.class), BigDecimal.ONE); assertEquals(divideAndRemainder[1].getNumber().numberValue(BigDecimal.class), new BigDecimal("0.49999999999999999999")); } @Test public void testDivideToIntegralValue_BigDecimal() { Money money1 = Money.of(BigDecimal.ONE, EURO); Money result = money1.divideToIntegralValue(new BigDecimal("0.50000000000000000001")); assertEquals(result.getNumber().numberValue(BigDecimal.class), BigDecimal.ONE); result = money1.divideToIntegralValue(new BigDecimal("0.2001")); assertEquals(result.getNumber().numberValue(BigDecimal.class).stripTrailingZeros(), new BigDecimal("4.0").stripTrailingZeros()); result = money1.divideToIntegralValue(new BigDecimal("5.0")); assertTrue(result.getNumber().numberValue(BigDecimal.class).intValueExact() == 0); } /** * Test method for {@link org.javamoney.moneta.Money#hashCode()}. */ @Test public void testHashCode() { Money money1 = Money.of(BigDecimal.ONE, EURO); Money money2 = Money.of(new BigDecimal("1"), EURO); assertEquals(money1.hashCode(), money2.hashCode()); Money money3 = Money.of(1.0, DOLLAR); assertTrue(money1.hashCode() != money3.hashCode()); assertTrue(money2.hashCode() != money3.hashCode()); Money money4 = Money.of(BigDecimal.ONE, DOLLAR); assertTrue(money1.hashCode() != money4.hashCode()); assertTrue(money2.hashCode() != money4.hashCode()); Money money5 = Money.of(BigDecimal.ONE, DOLLAR); Money money6 = Money.of(1.0, DOLLAR); assertTrue(money1.hashCode() != money5.hashCode()); assertTrue(money2.hashCode() != money5.hashCode()); assertTrue(money1.hashCode() != money6.hashCode()); assertTrue(money2.hashCode() != money6.hashCode()); // Test equality for values with different scales, but same numeric // values assertTrue(Money.of(BigDecimal.valueOf(0d), "CHF").hashCode() == Money.of(BigDecimal.valueOf(0), "CHF").hashCode()); assertTrue(Money.of(BigDecimal.ZERO, "CHF").hashCode() == Money.of(BigDecimal.valueOf(0), "CHF").hashCode()); assertTrue( Money.of(BigDecimal.valueOf(5), "CHF").hashCode() == Money.of(new BigDecimal("5.0"), "CHF").hashCode()); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").hashCode() == Money.of(new BigDecimal("5.00"), "CHF").hashCode()); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").hashCode() == Money.of(new BigDecimal("5.000"), "CHF").hashCode()); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").hashCode() == Money.of(new BigDecimal("5.0000"), "CHF").hashCode()); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").hashCode() == Money.of(new BigDecimal("-1.230"), "CHF").hashCode()); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").hashCode() == Money.of(new BigDecimal("-1.2300"), "CHF").hashCode()); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").hashCode() == Money.of(new BigDecimal("-1.23000"), "CHF").hashCode()); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").hashCode() == Money.of(new BigDecimal("-1.230000000000000000000"), "CHF").hashCode()); } /** * Test method for {@link org.javamoney.moneta.Money#getContext()}. */ @Test public void testGetDefaultMathContext() { Money money1 = Money.of(BigDecimal.ONE, EURO); assertEquals(Money.DEFAULT_MONETARY_CONTEXT, money1.getContext()); } /** * Test method for * {@link org.javamoney.moneta.Money#of(java.math.BigDecimal, javax.money.CurrencyUnit, * javax.money.MonetaryContext)} * . */ @Test public void testOfCurrencyUnitBigDecimalMathContext() { Money m = Money.of( BigDecimal.valueOf(2.15), EURO, MonetaryContextBuilder.of(Money.class).setPrecision(2).setFixedScale(true).set(RoundingMode.DOWN) .build()); Money m2 = Money.of(BigDecimal.valueOf(2.1), EURO); assertEquals(m, m2); Money m3 = m.multiply(100); assertEquals(Money.of(210, EURO), m3.abs()); } /** * Test method for * {@link org.javamoney.moneta.Money#of(java.lang.Number, javax.money.CurrencyUnit)} . */ @Test public void testOfCurrencyUnitNumber() { Money m = Money.of((byte) 2, EURO); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(Byte.valueOf((byte) 2), m.getNumber().numberValue(Byte.class)); m = Money.of((short) -2, DOLLAR); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Short.valueOf((short) -2), m.getNumber().numberValue(Short.class)); m = Money.of(-12, EURO); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(m.getNumber().numberValue(Integer.class), Integer.valueOf(-12)); m = Money.of((long) 12, DOLLAR); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Long.valueOf(12), m.getNumber().numberValue(Long.class)); m = Money.of((float) 12.23, EURO); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals((float) 12.23, m.getNumber().numberValue(Float.class)); m = Money.of(-12.23, DOLLAR); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(-12.23, m.getNumber().numberValue(Double.class)); m = Money.of((Number) BigDecimal.valueOf(234.2345), EURO); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(BigDecimal.valueOf(234.2345), m.getNumber().numberValue(BigDecimal.class)); m = Money.of(BigInteger.valueOf(23232312321432432L), DOLLAR); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Long.valueOf(23232312321432432L), m.getNumber().numberValue(Long.class)); assertEquals(BigInteger.valueOf(23232312321432432L), m.getNumber().numberValue(BigInteger.class)); } /** * Test method for * {@link org.javamoney.moneta.Money#of(java.math.BigDecimal, javax.money.CurrencyUnit, * javax.money.MonetaryContext)} . * . */ @Test public void testOfCurrencyUnitNumberMathContext() { MonetaryContext mc = MonetaryContextBuilder.of(Money.class).setMaxScale(2345).setFixedScale(true).set(RoundingMode.CEILING) .build(); Money m = Money.of((byte) 2, EURO, mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(EURO, m.getCurrency()); assertEquals(Byte.valueOf((byte) 2), m.getNumber().numberValue(Byte.class)); m = Money.of((short) -2, DOLLAR, mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Short.valueOf((short) -2), m.getNumber().numberValue(Short.class)); m = Money.of(-12, EURO, mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(EURO, m.getCurrency()); assertEquals(Integer.valueOf(-12), m.getNumber().numberValue(Integer.class)); m = Money.of((long) 12, DOLLAR, mc); assertEquals(mc, m.getContext()); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Long.valueOf(12), m.getNumber().numberValue(Long.class)); m = Money.of((float) 12.23, EURO, mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(EURO, m.getCurrency()); assertEquals((float) 12.23, m.getNumber().numberValue(Float.class)); m = Money.of(-12.23, DOLLAR, mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(DOLLAR, m.getCurrency()); assertEquals(mc, m.getContext()); assertEquals(-12.23, m.getNumber().numberValue(Double.class)); m = Money.of((Number) BigDecimal.valueOf(234.2345), EURO, mc); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(mc, m.getContext()); assertEquals(BigDecimal.valueOf(234.2345), m.getNumber().numberValue(BigDecimal.class)); m = Money.of(BigInteger.valueOf(23232312321432432L), DOLLAR, mc); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(mc, m.getContext()); assertEquals(Long.valueOf(23232312321432432L), m.getNumber().numberValue(Long.class)); assertEquals(BigInteger.valueOf(23232312321432432L), m.getNumber().numberValue(BigInteger.class)); } /** * Test method for {@link org.javamoney.moneta.Money#of(java.lang.Number, java.lang.String)} . */ @Test public void testOfStringNumber() { Money m = Money.of((byte) 2, "EUR"); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(Byte.valueOf((byte) 2), m.getNumber().numberValue(Byte.class)); m = Money.of((short) -2, "USD"); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Short.valueOf((short) -2), m.getNumber().numberValue(Short.class)); m = Money.of(-12, "EUR"); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(Integer.valueOf(-12), m.getNumber().numberValue(Integer.class)); m = Money.of((long) 12, "USD"); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Long.valueOf(12), m.getNumber().numberValue(Long.class)); m = Money.of((float) 12.23, "EUR"); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals((float) 12.23, m.getNumber().numberValue(Float.class)); m = Money.of(-12.23, "USD"); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(-12.23, m.getNumber().numberValue(Double.class)); m = Money.of((Number) BigDecimal.valueOf(234.2345), "EUR"); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(BigDecimal.valueOf(234.2345), m.getNumber().numberValue(BigDecimal.class)); m = Money.of(BigInteger.valueOf(23232312321432432L), "USD"); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Long.valueOf(23232312321432432L), m.getNumber().numberValue(Long.class)); assertEquals(BigInteger.valueOf(23232312321432432L), m.getNumber().numberValue(BigInteger.class)); } /** * Test method for * {@link org.javamoney.moneta.Money#of(Number, String, javax.money.MonetaryContext)} . * . */ @Test public void testOfStringNumberMathContext() { MonetaryContext mc = MonetaryContextBuilder.of(Money.class).setMaxScale(2345).setFixedScale(true).set(RoundingMode.CEILING) .build(); Money m = Money.of((byte) 2, "EUR", mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(EURO, m.getCurrency()); assertEquals(Byte.valueOf((byte) 2), m.getNumber().numberValue(Byte.class)); m = Money.of((short) -2, "USD", mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Short.valueOf((short) -2), m.getNumber().numberValue(Short.class)); m = Money.of(-12, "EUR", mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(EURO, m.getCurrency()); assertEquals(Integer.valueOf(-12), m.getNumber().numberValue(Integer.class)); m = Money.of((long) 12, "USD", mc); assertEquals(mc, m.getContext()); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(Long.valueOf(12), m.getNumber().numberValue(Long.class)); m = Money.of((float) 12.23, "EUR", mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(EURO, m.getCurrency()); assertEquals(m.getNumber().numberValue(Float.class), (float) 12.23); m = Money.of(-12.23, "USD", mc); assertNotNull(m); assertEquals(mc, m.getContext()); assertEquals(DOLLAR, m.getCurrency()); assertEquals(mc, m.getContext()); assertEquals(m.getNumber().numberValue(Double.class), -12.23); m = Money.of((Number) BigDecimal.valueOf(234.2345), "EUR", mc); assertNotNull(m); assertEquals(EURO, m.getCurrency()); assertEquals(mc, m.getContext()); assertEquals(m.getNumber().numberValue(BigDecimal.class), BigDecimal.valueOf(234.2345)); m = Money.of(BigInteger.valueOf(23232312321432432L), "USD", mc); assertNotNull(m); assertEquals(DOLLAR, m.getCurrency()); assertEquals(mc, m.getContext()); assertEquals(Long.valueOf(23232312321432432L), m.getNumber().numberValue(Long.class)); assertEquals(BigInteger.valueOf(23232312321432432L), m.getNumber().numberValue(BigInteger.class)); } /** * Test method for {@link org.javamoney.moneta.Money#equals(java.lang.Object)}. */ @Test public void testEqualsObject() { Money[] moneys = new Money[]{Money.of(0, "CHF"), Money.of(BigDecimal.ONE, "CHF"), Money.of(BigDecimal.ONE, "XXX"), Money.of(BigDecimal.ONE.negate(), "XXX")}; for (int i = 0; i < moneys.length; i++) { for (int j = 0; j < moneys.length; j++) { if (i == j) { assertEquals(moneys[i], moneys[j]); } else { assertNotSame(moneys[i], moneys[j]); } } } // Test equality for values with different scales, but same numeric // values assertTrue(Money.of(BigDecimal.valueOf(0d), "CHF").equals(Money.of(BigDecimal.valueOf(0), "CHF"))); assertTrue(Money.of(BigDecimal.ZERO, "CHF").equals(Money.of(BigDecimal.valueOf(0), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").equals(Money.of(new BigDecimal("5.0"), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").equals(Money.of(new BigDecimal("5.00"), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").equals(Money.of(new BigDecimal("5.000"), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").equals(Money.of(new BigDecimal("5.0000"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").equals(Money.of(new BigDecimal("-1.230"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").equals(Money.of(new BigDecimal("-1.2300"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").equals(Money.of(new BigDecimal("-1.23000"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF") .equals(Money.of(new BigDecimal("-1.230000000000000000000"), "CHF"))); } /** * Test differently created MonetaryAmount or Money instances for equality * {@link org.javamoney.moneta.Money#equals(Object)}. */ @Test public void testEqualsMonetaryAmount() { MonetaryAmount m = Monetary.getDefaultAmountFactory().setCurrency("CHF").setNumber(100).create(); MonetaryAmount m2 = Money.of(100, "CHF"); Money m3 = Money.of(100, "CHF"); assertTrue(m.equals(m2)); assertTrue(m.equals(m3)); assertTrue(m2.equals(m3)); } /** * Test method for {@link org.javamoney.moneta.Money#compareTo(javax.money.MonetaryAmount)}. */ @Test public void testCompareTo() { Money m1 = Money.of(-2, "CHF"); Money m2 = Money.of(0, "CHF"); Money m3 = Money.of(-0, "CHF"); Money m4 = Money.of(2, "CHF"); assertEquals(0, m2.compareTo(m3)); assertEquals(0, m2.compareTo(m2)); assertEquals(0, m3.compareTo(m3)); assertEquals(0, m3.compareTo(m2)); assertTrue(m1.compareTo(m2) < 0); assertTrue(m2.compareTo(m1) > 0); assertTrue(m1.compareTo(m3) < 0); assertTrue(m2.compareTo(m3) == 0); assertTrue(m1.compareTo(m4) < 0); assertTrue(m3.compareTo(m4) < 0); assertTrue(m4.compareTo(m1) > 0); assertTrue(m4.compareTo(m2) > 0); } /** * Test method for {@link org.javamoney.moneta.Money#getFactory()#setContext(java.math.MathContext)}. */ @Test public void testWithMonetaryContext() { Money m = Money.of(10, "CHF"); assertEquals(Money.DEFAULT_MONETARY_CONTEXT, m.getContext()); MonetaryContext mc = MonetaryContextBuilder.of(Money.class).setPrecision(128).set(RoundingMode.HALF_EVEN).build(); MonetaryAmount m2 = m.getFactory().setContext(mc).create(); assertNotNull(m2); assertTrue(m != m2); assertEquals(Money.DEFAULT_MONETARY_CONTEXT, m.getContext()); assertEquals(mc, m2.getContext()); } /** * Test method for {@link org.javamoney.moneta.Money#abs()}. */ @Test public void testAbs() { Money m = Money.of(10, "CHF"); assertEquals(m, m.abs()); assertTrue(m == m.abs()); m = Money.of(0, "CHF"); assertEquals(m, m.abs()); assertTrue(m == m.abs()); m = Money.of(-10, "CHF"); assertEquals(m.negate(), m.abs()); assertTrue(m != m.abs()); } /** * Test method for {@link org.javamoney.moneta.Money#add(javax.money.MonetaryAmount)} . */ @Test public void testAdd() { Money money1 = Money.of(BigDecimal.TEN, EURO); Money money2 = Money.of(BigDecimal.ONE, EURO); Money moneyResult = money1.add(money2); assertNotNull(moneyResult); assertEquals(11d, moneyResult.getNumber().doubleValue(), 0d); } /** * Test method for {@link org.javamoney.moneta.Money#divide(java.lang.Number)}. */ @Test public void testDivideNumber() { Money m = Money.of(100, "CHF"); //noinspection BigDecimalMethodWithoutRoundingCalled assertEquals(Money.of(BigDecimal.valueOf(100).divide(BigDecimal.valueOf(5)), "CHF"), m.divide(BigDecimal.valueOf(5))); } /** * Test method for {@link org.javamoney.moneta.Money#divideAndRemainder(java.lang.Number)}. */ @Test public void testDivideAndRemainderNumber() { Money m = Money.of(100, "CHF"); assertEquals(Money.of(BigDecimal.valueOf(33), "CHF"), m.divideAndRemainder(BigDecimal.valueOf(3))[0]); assertEquals(Money.of(BigDecimal.valueOf(1), "CHF"), m.divideAndRemainder(BigDecimal.valueOf(3))[1]); } /** * Test method for {@link org.javamoney.moneta.Money#divideToIntegralValue(java.lang.Number)} . */ @Test public void testDivideToIntegralValueNumber() { Money m = Money.of(100, "CHF"); assertEquals(Money.of(BigDecimal.valueOf(5), "CHF"), m.divideToIntegralValue(BigDecimal.valueOf(20))); assertEquals(Money.of(BigDecimal.valueOf(33), "CHF"), m.divideToIntegralValue(BigDecimal.valueOf(3))); } /** * Test method for {@link org.javamoney.moneta.Money#multiply(java.lang.Number)}. */ @Test public void testMultiplyNumber() { Money m = Money.of(100, "CHF"); assertEquals(Money.of(400, "CHF"), m.multiply(4)); assertEquals(Money.of(200, "CHF"), m.multiply(2)); assertEquals(Money.of(new BigDecimal("50.0"), "CHF"), m.multiply(0.5)); } /** * Test method for {@link org.javamoney.moneta.Money#multiply(double)}. */ @Test public void testMultiplyBadDoubles() { double[] values = new double[]{ Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN}; Money m = Money.of(new BigDecimal("50.0"), "USD"); for (double d : values) { try { m.multiply(d); fail("multiplying with:" + d + "should not be allowed"); } catch (ArithmeticException e) { // should reach here } try { m.multiply(Double.valueOf(d)); fail("multiplying with:" + d + "should not be allowed"); } catch (ArithmeticException e) { // should reach here } } } /** * Test method for {@link org.javamoney.moneta.Money#divide(double)}. */ @Test public void testDivideBadDoubles() { Money m = Money.of(new BigDecimal("50.0"), "USD"); try { m.divide(Double.NaN); fail("dividing with:NaN should not be allowed"); } catch (ArithmeticException e) { // should reach here } try { m.divide(Double.valueOf(Double.NaN)); fail("dividing with NaN should not be allowed"); } catch (ArithmeticException e) { // should reach here } } /** * Test method for {@link org.javamoney.moneta.Money#divide(double)}. */ @Test public void testDivideInfinityDoubles() { double[] values = new double[]{Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY}; Money m = Money.of(new BigDecimal("50.0"), "USD"); for (double d : values) { assertTrue(m.divide(d).isZero()); assertTrue(m.divide(Double.valueOf(d)).isZero()); } } /** * Test method for {@link org.javamoney.moneta.Money#negate()}. */ @Test public void testNegate() { Money m = Money.of(100, "CHF"); assertEquals(Money.of(-100, "CHF"), m.negate()); m = Money.of(-123.234, "CHF"); assertEquals(Money.of(123.234, "CHF"), m.negate()); } /** * Test method for {@link org.javamoney.moneta.Money#plus()}. */ @Test public void testPlus() { Money m = Money.of(100, "CHF"); assertEquals(Money.of(100, "CHF"), m.plus()); m = Money.of(123.234, "CHF"); assertEquals(Money.of(123.234, "CHF"), m.plus()); } /** * Test method for {@link org.javamoney.moneta.Money#subtract(javax.money.MonetaryAmount)}. */ @Test public void testSubtract() { Money m = Money.of(100, "CHF"); Money s1 = Money.of(100, "CHF"); Money s2 = Money.of(200, "CHF"); Money s3 = Money.of(0, "CHF"); assertEquals(Money.of(0, "CHF"), m.subtract(s1)); assertEquals(Money.of(-100, "CHF"), m.subtract(s2)); assertEquals(Money.of(100, "CHF"), m.subtract(s3)); assertTrue(m == m.subtract(s3)); m = Money.of(-123.234, "CHF"); assertEquals(Money.of(new BigDecimal("-223.234"), "CHF"), m.subtract(s1)); assertEquals(Money.of(new BigDecimal("-323.234"), "CHF"), m.subtract(s2)); assertEquals(Money.of(new BigDecimal("-123.234"), "CHF"), m.subtract(s3)); assertTrue(m == m.subtract(s3)); m = Money.of(12.402345534, "CHF"); s1 = Money.of(2343.45, "CHF"); s2 = Money.of(12.402345534, "CHF"); s3 = Money.of(-2343.45, "CHF"); assertEquals(Money.of(new BigDecimal("12.402345534").subtract(new BigDecimal("2343.45")), "CHF"), m.subtract(s1)); assertEquals(Money.of(new BigDecimal("12.402345534").subtract(new BigDecimal("12.402345534")), "CHF"), m.subtract(s2)); assertEquals(Money.of(0, "CHF"), m.subtract(s2)); assertEquals(Money.of(new BigDecimal("2355.852345534"), "CHF"), m.subtract(s3)); assertTrue(m == m.subtract(Money.of(0, "CHF"))); } /** * Test method for {@link org.javamoney.moneta.Money#remainder(java.lang.Number)}. */ @Test public void testRemainderNumber() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF"), Money.of(0, "CHF"), Money.of(-100, "CHF"), Money.of(-723527.36532, "CHF")}; for (Money m : moneys) { assertEquals(m.getFactory().setCurrency(m.getCurrency()).setNumber( m.getNumber().numberValue(BigDecimal.class).remainder(BigDecimal.valueOf(10.50))) .create(), m.remainder(10.50), "Invalid remainder of " + 10.50); assertEquals(m.getFactory().setCurrency(m.getCurrency()).setNumber( m.getNumber().numberValue(BigDecimal.class).remainder(BigDecimal.valueOf(-30.20))) .create(), m.remainder(-30.20), "Invalid remainder of " + -30.20); assertEquals(m.getFactory().setCurrency(m.getCurrency()).setNumber( m.getNumber().numberValue(BigDecimal.class).remainder(BigDecimal.valueOf(-3))) .create(), m.remainder(-3), "Invalid remainder of " + -3); assertEquals(m.getFactory().setCurrency(m.getCurrency()).setNumber( m.getNumber().numberValue(BigDecimal.class).remainder(BigDecimal.valueOf(3))).create(), m.remainder(3)); } } /** * Test method for {@link org.javamoney.moneta.Money#scaleByPowerOfTen(int)} . */ @Test public void testScaleByPowerOfTen() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF"), Money.of(0, "CHF"), Money.of(-100, "CHF"), Money.of(-723527.36532, "CHF")}; for (Money m : moneys) { for (int p = -10; p < 10; p++) { assertEquals(m.getFactory().setCurrency(m.getCurrency()) .setNumber(m.getNumber().numberValue(BigDecimal.class).scaleByPowerOfTen(p)) .create(), m.scaleByPowerOfTen(p), "Invalid scaleByPowerOfTen."); } } } /** * Test method for {@link org.javamoney.moneta.Money#isZero()}. */ @Test public void testIsZero() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF"), Money.of(-100, "CHF"), Money.of(-723527.36532, "CHF")}; for (Money m : moneys) { assertFalse(m.isZero()); } moneys = new Money[]{Money.of(0, "CHF"), Money.of(0.0, "CHF"), Money.of(BigDecimal.ZERO, "CHF"), Money.of(new BigDecimal("0.00000000000000000"), "CHF")}; for (Money m : moneys) { assertTrue(m.isZero()); } } /** * Test method for {@link org.javamoney.moneta.Money#isPositive()}. */ @Test public void testIsPositive() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF")}; for (Money m : moneys) { assertTrue(m.isPositive()); } moneys = new Money[]{Money.of(0, "CHF"), Money.of(0.0, "CHF"), Money.of(BigDecimal.ZERO, "CHF"), Money.of(new BigDecimal("0.00000000000000000"), "CHF"), Money.of(-100, "CHF"), Money.of(-34242344, "CHF"), Money.of(-23123213.435, "CHF")}; for (Money m : moneys) { assertFalse(m.isPositive()); } } /** * Test method for {@link org.javamoney.moneta.Money#isPositiveOrZero()}. */ @Test public void testIsPositiveOrZero() { Money[] moneys = new Money[]{Money.of(0, "CHF"), Money.of(0.0, "CHF"), Money.of(BigDecimal.ZERO, "CHF"), Money.of(new BigDecimal("0.00000000000000000"), "CHF"), Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF")}; for (Money m : moneys) { assertTrue(m.isPositiveOrZero(), "Invalid positiveOrZero (expected true): " + m); } moneys = new Money[]{Money.of(-100, "CHF"), Money.of(-34242344, "CHF"), Money.of(-23123213.435, "CHF")}; for (Money m : moneys) { assertFalse(m.isPositiveOrZero(), "Invalid positiveOrZero (expected false): " + m); } } /** * Test method for {@link org.javamoney.moneta.Money#isNegative()}. */ @Test public void testIsNegative() { Money[] moneys = new Money[]{Money.of(0, "CHF"), Money.of(0.0, "CHF"), Money.of(BigDecimal.ZERO, "CHF"), Money.of(new BigDecimal("0.00000000000000000"), "CHF"), Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF")}; for (Money m : moneys) { assertFalse(m.isNegative(), "Invalid isNegative (expected false): " + m); } moneys = new Money[]{Money.of(-100, "CHF"), Money.of(-34242344, "CHF"), Money.of(-23123213.435, "CHF")}; for (Money m : moneys) { assertTrue(m.isNegative(), "Invalid isNegative (expected true): " + m); } } /** * Test method for {@link org.javamoney.moneta.Money#isNegativeOrZero()}. */ @Test public void testIsNegativeOrZero() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(23123213.435, "CHF")}; for (Money m : moneys) { assertFalse(m.isNegativeOrZero(), "Invalid negativeOrZero (expected false): " + m); } moneys = new Money[]{Money.of(0, "CHF"), Money.of(0.0, "CHF"), Money.of(BigDecimal.ZERO, "CHF"), Money.of(new BigDecimal("0.00000000000000000"), "CHF"), Money.of(-100, "CHF"), Money.of(-34242344, "CHF"), Money.of(-23123213.435, "CHF")}; for (Money m : moneys) { assertTrue(m.isNegativeOrZero(), "Invalid negativeOrZero (expected true): " + m); } } /** * Test method for {@link Money#getFactory()#setNumber(java.lang.Number)}. */ @Test public void testWithNumber() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "CHF"), Money.of(new BigDecimal("23123213.435"), "CHF"), Money.of(new BigDecimal("-23123213.435"), "CHF"), Money.of(-23123213, "CHF"), Money.of(0, "CHF")}; Money s = Money.of(10, "CHF"); MonetaryAmount[] moneys2 = new MonetaryAmount[]{s.getFactory().setCurrency(s.getCurrency()).setNumber(100).create(), s.getFactory().setCurrency(s.getCurrency()).setNumber(34242344).create(), s.getFactory().setCurrency(s.getCurrency()).setNumber(new BigDecimal("23123213.435")).create(), s.getFactory().setCurrency(s.getCurrency()).setNumber(new BigDecimal("-23123213.435")).create(), s.getFactory().setCurrency(s.getCurrency()).setNumber(-23123213).create(), s.getFactory().setCurrency(s.getCurrency()).setNumber(0).create()}; for (int i = 0; i < moneys.length; i++) { assertEquals(moneys[i], moneys2[i], "with(Number) failed."); } } /** * Test method for * {@link Money#getFactory()#setCurrency(javax.money.CurrencyUnit)} and {@link Money#getFactory()#setNumber * (Number)}. */ @Test public void testWithCurrencyUnitNumber() { Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "USD"), Money.of(23123213.435, "EUR"), Money.of(-23123213.435, "USS"), Money.of(-23123213, "USN"), Money.of(0, "GBP")}; Money s = Money.of(10, "XXX"); MonetaryAmount[] moneys2 = new MonetaryAmount[]{ s.getFactory().setCurrency(Monetary.getCurrency("CHF")).setNumber(100).create(), s.getFactory().setCurrency(Monetary.getCurrency("USD")).setNumber(34242344).create(), s.getFactory().setCurrency(Monetary.getCurrency("EUR")) .setNumber(new BigDecimal("23123213.435")).create(), s.getFactory().setCurrency(Monetary.getCurrency("USS")) .setNumber(new BigDecimal("-23123213.435")).create(), s.getFactory().setCurrency(Monetary.getCurrency("USN")).setNumber(-23123213).create(), s.getFactory().setCurrency(Monetary.getCurrency("GBP")).setNumber(0).create()}; for (int i = 0; i < moneys.length; i++) { assertEquals(moneys[i], moneys2[i], "with(Number) failed."); } } /** * Test method for {@link org.javamoney.moneta.Money#getNumber()#longValue()}. */ @Test public void testLongValue() { Money m = Money.of(100, "CHF"); assertEquals(100L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(-100, "CHF"); assertEquals(-100L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(-100.3434, "CHF"); assertEquals(-100L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(100.3434, "CHF"); assertEquals(100L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(0, "CHF"); assertEquals(0L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(-0.0, "CHF"); assertEquals(0L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(Long.MAX_VALUE, "CHF"); assertEquals(Long.MAX_VALUE, m.getNumber().longValue(), "longValue of " + m); m = Money.of(Long.MIN_VALUE, "CHF"); assertEquals(Long.MIN_VALUE, m.getNumber().longValue(), "longValue of " + m); // try { m = Money.of(new BigDecimal("12121762517652176251725178251872652765321876352187635217835378125"), "CHF"); m.getNumber().longValue(); } /** * Test method for {@link org.javamoney.moneta.Money#getNumber()#longValueExact()}. */ @Test public void testLongValueExact() { Money m = Money.of(100, "CHF"); assertEquals(100L, m.getNumber().longValueExact(), "longValue of " + m); m = Money.of(-100, "CHF"); assertEquals(-100L, m.getNumber().longValueExact(), "longValue of " + m); m = Money.of(0, "CHF"); assertEquals(0L, m.getNumber().longValueExact(), "longValue of " + m); m = Money.of(-0.0, "CHF"); assertEquals(0L, m.getNumber().longValue(), "longValue of " + m); m = Money.of(Long.MAX_VALUE, "CHF"); assertEquals(Long.MAX_VALUE, m.getNumber().longValue(), "longValue of " + m); m = Money.of(Long.MIN_VALUE, "CHF"); assertEquals(Long.MIN_VALUE, m.getNumber().longValue(), "longValue of " + m); try { m = Money.of(new BigDecimal("12121762517652176251725178251872652765321876352187635217835378125"), "CHF"); m.getNumber().longValueExact(); fail("longValueExact(12121762517652176251725178251872652765321876352187635217835378125) should fail!"); } catch (ArithmeticException e) { // OK } try { m = Money.of(-100.3434, "CHF"); m.getNumber().longValueExact(); fail("longValueExact(-100.3434) should raise an ArithmeticException."); } catch (ArithmeticException e) { // OK } try { m = Money.of(100.3434, "CHF"); m.getNumber().longValueExact(); fail("longValueExact(100.3434) should raise an ArithmeticException."); } catch (ArithmeticException e) { // OK } } /** * Test method for {@link org.javamoney.moneta.Money#getNumber()#doubleValue()}. */ @Test public void testDoubleValue() { Money m = Money.of(100, "CHF"); assertEquals(100d, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(-100, "CHF"); assertEquals(-100d, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(-100.3434, "CHF"); assertEquals(-100.3434, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(100.3434, "CHF"); assertEquals(100.3434, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(0, "CHF"); assertEquals(0d, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(-0.0, "CHF"); assertEquals(0d, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(Double.MAX_VALUE, "CHF"); assertEquals(Double.MAX_VALUE, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); m = Money.of(Double.MIN_VALUE, "CHF"); assertEquals(Double.MIN_VALUE, m.getNumber().doubleValue(), 0.0d, "doubleValue of " + m); // try { m = Money.of(new BigDecimal("12121762517652176251725178251872652765321876352187635217835378125"), "CHF"); m.getNumber().doubleValue(); // fail("doubleValue(12121762517652176251725178251872652765321876352187635217835378125) should fail!"); // } catch (ArithmeticException e) { // // OK // } } /** * Test method for {@link org.javamoney.moneta.Money#signum()}. */ @Test public void testSignum() { Money m = Money.of(100, "CHF"); assertEquals(1, m.signum(), "signum of " + m); m = Money.of(-100, "CHF"); assertEquals(-1, m.signum(), "signum of " + m); m = Money.of(100.3435, "CHF"); assertEquals(1, m.signum(), "signum of " + m); m = Money.of(-100.3435, "CHF"); assertEquals(-1, m.signum(), "signum of " + m); m = Money.of(0, "CHF"); assertEquals(0, m.signum(), "signum of " + m); m = Money.of(-0, "CHF"); assertEquals(0, m.signum(), "signum of " + m); } /** * Test method for {@link org.javamoney.moneta.Money#isLessThan(javax.money.MonetaryAmount)} . */ @Test public void testIsLessThan() { assertFalse(Money.of(BigDecimal.valueOf(0d), "CHF").isLessThan(Money.of(BigDecimal.valueOf(0), "CHF"))); assertFalse(Money.of(BigDecimal.valueOf(0.00000000001d), "CHF") .isLessThan(Money.of(BigDecimal.valueOf(0d), "CHF"))); assertFalse(Money.of(15, "CHF").isLessThan(Money.of(10, "CHF"))); assertFalse(Money.of(15.546, "CHF").isLessThan(Money.of(10.34, "CHF"))); assertTrue(Money.of(5, "CHF").isLessThan(Money.of(10, "CHF"))); assertTrue(Money.of(5.546, "CHF").isLessThan(Money.of(10.34, "CHF"))); } /** * Test method for * {@link org.javamoney.moneta.Money#isLessThanOrEqualTo(javax.money.MonetaryAmount)} . */ @Test public void testIsLessThanOrEqualTo() { assertTrue(Money.of(BigDecimal.valueOf(0d), "CHF").isLessThanOrEqualTo(Money.of(BigDecimal.valueOf(0), "CHF"))); assertFalse(Money.of(BigDecimal.valueOf(0.00000000001d), "CHF") .isLessThanOrEqualTo(Money.of(BigDecimal.valueOf(0d), "CHF"))); assertFalse(Money.of(15, "CHF").isLessThanOrEqualTo(Money.of(10, "CHF"))); assertFalse(Money.of(15.546, "CHF").isLessThan(Money.of(10.34, "CHF"))); assertTrue(Money.of(5, "CHF").isLessThanOrEqualTo(Money.of(10, "CHF"))); assertTrue(Money.of(5.546, "CHF").isLessThanOrEqualTo(Money.of(10.34, "CHF"))); } /** * Test method for {@link org.javamoney.moneta.Money#isGreaterThan(javax.money.MonetaryAmount)} * . */ @Test public void testIsGreaterThan() { assertFalse(Money.of(BigDecimal.valueOf(0d), "CHF").isGreaterThan(Money.of(BigDecimal.valueOf(0), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(0.00000000001d), "CHF") .isGreaterThan(Money.of(BigDecimal.valueOf(0d), "CHF"))); assertTrue(Money.of(15, "CHF").isGreaterThan(Money.of(10, "CHF"))); assertTrue(Money.of(15.546, "CHF").isGreaterThan(Money.of(10.34, "CHF"))); assertFalse(Money.of(5, "CHF").isGreaterThan(Money.of(10, "CHF"))); assertFalse(Money.of(5.546, "CHF").isGreaterThan(Money.of(10.34, "CHF"))); } /** * Test method for * {@link org.javamoney.moneta.Money#isGreaterThanOrEqualTo(javax.money.MonetaryAmount)} . */ @Test public void testIsGreaterThanOrEqualTo() { assertTrue( Money.of(BigDecimal.valueOf(0d), "CHF").isGreaterThanOrEqualTo(Money.of(BigDecimal.valueOf(0), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(0.00000000001d), "CHF") .isGreaterThanOrEqualTo(Money.of(BigDecimal.valueOf(0d), "CHF"))); assertTrue(Money.of(15, "CHF").isGreaterThanOrEqualTo(Money.of(10, "CHF"))); assertTrue(Money.of(15.546, "CHF").isGreaterThanOrEqualTo(Money.of(10.34, "CHF"))); assertFalse(Money.of(5, "CHF").isGreaterThanOrEqualTo(Money.of(10, "CHF"))); assertFalse(Money.of(5.546, "CHF").isGreaterThanOrEqualTo(Money.of(10.34, "CHF"))); } /** * Test method for {@link org.javamoney.moneta.Money#isEqualTo(javax.money.MonetaryAmount)}. */ @Test public void testIsEqualTo() { assertTrue(Money.of(BigDecimal.valueOf(0d), "CHF").isEqualTo(Money.of(BigDecimal.valueOf(0), "CHF"))); assertFalse( Money.of(BigDecimal.valueOf(0.00000000001d), "CHF").isEqualTo(Money.of(BigDecimal.valueOf(0d), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5d), "CHF").isEqualTo(Money.of(BigDecimal.valueOf(5), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(1d), "CHF").isEqualTo(Money.of(BigDecimal.valueOf(1.00), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(1d), "CHF").isEqualTo(Money.of(BigDecimal.ONE, "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(1), "CHF").isEqualTo(Money.of(BigDecimal.ONE, "CHF"))); assertTrue(Money.of(new BigDecimal("1.0000"), "CHF").isEqualTo(Money.of(new BigDecimal("1.00"), "CHF"))); // Test with different scales, but numeric equal values assertTrue(Money.of(BigDecimal.valueOf(0d), "CHF").isEqualTo(Money.of(BigDecimal.valueOf(0), "CHF"))); assertTrue(Money.of(BigDecimal.ZERO, "CHF").isEqualTo(Money.of(BigDecimal.valueOf(0), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").isEqualTo(Money.of(new BigDecimal("5.0"), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").isEqualTo(Money.of(new BigDecimal("5.00"), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").isEqualTo(Money.of(new BigDecimal("5.000"), "CHF"))); assertTrue(Money.of(BigDecimal.valueOf(5), "CHF").isEqualTo(Money.of(new BigDecimal("5.0000"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").isEqualTo(Money.of(new BigDecimal("-1.230"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").isEqualTo(Money.of(new BigDecimal("-1.2300"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF").isEqualTo(Money.of(new BigDecimal("-1.23000"), "CHF"))); assertTrue(Money.of(new BigDecimal("-1.23"), "CHF") .isEqualTo(Money.of(new BigDecimal("-1.230000000000000000000"), "CHF"))); } /** * Test method for {@link org.javamoney.moneta.Money#getNumber()#getNumberType()}. */ @Test public void testGetImplementationType() { assertEquals(Money.of(0, "CHF").getContext().getAmountType(), Money.class); assertEquals(Money.of(0.34738746d, "CHF").getContext().getAmountType(), Money.class); assertEquals(Money.of(100034L, "CHF").getContext().getAmountType(), Money.class); } /** * Test method for {@link org.javamoney.moneta.Money#query(javax.money.MonetaryQuery)}. */ @Test public void testQuery() { MonetaryQuery<Integer> q = amount -> Money.from(amount).getNumber().getPrecision(); Money[] moneys = new Money[]{Money.of(100, "CHF"), Money.of(34242344, "USD"), Money.of(23123213.435, "EUR"), Money.of(-23123213.435, "USS"), Money.of(-23123213, "USN"), Money.of(0, "GBP")}; for (Money money : moneys) { assertEquals(money.query(q), Integer.valueOf(money.getNumber().getPrecision())); } } /** * Test method for {@link org.javamoney.moneta.Money#getNumber()#asType(java.lang.Class)}. */ @Test public void testAsTypeClassOfT() { Money m = Money.of(13.656, "CHF"); assertEquals(m.getNumber().byteValue(), 13); assertEquals(m.getNumber().shortValue(), 13); assertEquals(m.getNumber().intValue(), 13); assertEquals(m.getNumber().longValue(), 13L); assertEquals(m.getNumber().floatValue(), 13.656f, 0.0); assertEquals(m.getNumber().doubleValue(), 13.656, 0.0); assertEquals(m.getNumber().numberValue(BigDecimal.class), BigDecimal.valueOf(13.656)); } /** * Test method for {@link org.javamoney.moneta.Money#stripTrailingZeros()}. */ @Test public void testStripTrailingZeroes() { assertEquals(BigDecimal.ZERO, Money.of(new BigDecimal("0.0"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); assertEquals(BigDecimal.ZERO, Money.of(new BigDecimal("0.00"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); assertEquals(BigDecimal.ZERO, Money.of(new BigDecimal("0.000"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); assertEquals(new BigDecimal("12.123"), Money.of(new BigDecimal("12.123000"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); assertEquals(new BigDecimal("12.123"), Money.of(new BigDecimal("12.12300"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); assertEquals(new BigDecimal("12.123"), Money.of(new BigDecimal("12.1230"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); assertEquals(new BigDecimal("12.123"), Money.of(new BigDecimal("12.123"), "CHF").stripTrailingZeros().getNumber() .numberValue(BigDecimal.class)); } /** * Test method for {@link org.javamoney.moneta.Money#toString()}. */ @Test public void testToString() { assertEquals("XXX 1.23455645", Money.of(new BigDecimal("1.23455645"), "XXX").toString()); assertEquals("CHF 1234", Money.of(1234, "CHF").toString()); assertEquals("CHF 1234", Money.of(new BigDecimal("1234.0"), "CHF").toString()); assertEquals("CHF 1234.1", Money.of(new BigDecimal("1234.1"), "CHF").toString()); assertEquals("CHF 0.01", Money.of(new BigDecimal("0.0100"), "CHF").toString()); } /** * Test method for {@link org.javamoney.moneta.Money#with(javax.money.MonetaryOperator)}. */ @Test public void testWithMonetaryOperator() { MonetaryOperator adj = amount -> Money.of(-100, amount.getCurrency()); Money m = Money.of(1.23455645d, "XXX"); Money a = m.with(adj); assertNotNull(a); assertNotSame(m, a); assertEquals(m.getCurrency(), a.getCurrency()); assertEquals(Money.of(-100, m.getCurrency()), a); adj = amount -> amount.multiply(2).getFactory().setCurrency(Monetary.getCurrency("CHF")).create(); a = m.with(adj); assertNotNull(a); assertNotSame(m, a); assertEquals(Monetary.getCurrency("CHF"), a.getCurrency()); assertEquals(Money.of(1.23455645d * 2, a.getCurrency()), a); } /** * Test method for {@link org.javamoney.moneta.Money#from(javax.money.MonetaryAmount)}. */ @Test public void testFrom() { Money m = Money.of(new BigDecimal("1.2345"), "XXX"); Money m2 = Money.from(m); assertTrue(m == m2); } @Test public void parseTest() { Money money = Money.parse("EUR 25.25"); assertEquals(money.getCurrency(), EURO); assertEquals(money.getNumber().doubleValue(), 25.25); } @Test public void testSerialization() throws IOException, ClassNotFoundException { Money m = Money.of(new BigDecimal("1.2345"), "XXX"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(m); oos.flush(); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); Money m2 = (Money) ois.readObject(); assertEquals(m, m2); assertTrue(m != m2); } // Bad cases /** * Test method for {@link org.javamoney.moneta.RoundedMoney#add(javax.money.MonetaryAmount)} . */ @Test(expectedExceptions = MonetaryException.class) public void testAdd_WrongCurrency() { Money m1 = Money.of(BigDecimal.TEN, EURO); Money m2 = Money.of(BigDecimal.TEN, "CHF"); m1.add(m2); } /** * Test method for {@link org.javamoney.moneta.RoundedMoney#add(javax.money.MonetaryAmount)} . */ @Test(expectedExceptions = MonetaryException.class) public void testSubtract_WrongCurrency() { Money m1 = Money.of(BigDecimal.TEN, EURO); Money m2 = Money.of(BigDecimal.TEN, "CHF"); m1.subtract(m2); } /** * Test method for {@link org.javamoney.moneta.RoundedMoney#add(javax.money.MonetaryAmount)} . */ @Test(expectedExceptions = MonetaryException.class) public void testDivide_WrongCurrency() { Money m1 = Money.of(BigDecimal.TEN, EURO); Money m2 = Money.of(BigDecimal.TEN, "CHF"); m1.subtract(m2); } @Test(expectedExceptions = ArithmeticException.class) public void testCreatingFromDoubleNan(){ Money.of(Double.NaN, "XXX"); } @Test(expectedExceptions = ArithmeticException.class) public void testCreatingFromDoublePositiveInfinity(){ Money.of(Double.POSITIVE_INFINITY, "XXX"); } @Test(expectedExceptions = ArithmeticException.class) public void testCreatingFromDoubleNegativeInfinity(){ Money.of(Double.NEGATIVE_INFINITY, "XXX"); } @Test(expectedExceptions = NullPointerException.class) public void shouldRerturnErrorWhenUsingZeroTheCurrencyIsNull() { Money.zero(null); Assert.fail(); } @Test public void shouldRerturnZeroWhenUsingZero() { MonetaryAmount zero = Money.zero(BRAZILIAN_REAL); assertEquals(BigDecimal.ZERO, zero.getNumber().numberValue(BigDecimal.class)); assertEquals(BRAZILIAN_REAL, zero.getCurrency()); } @Test(expectedExceptions = NullPointerException.class) public void shouldRerturnErrorWhenUsingOfMinorTheCurrencyIsNull() { Money.ofMinor(null, 1234L); Assert.fail(); } @Test public void shouldRerturnMonetaryAmount() { MonetaryAmount amount = Money.ofMinor(DOLLAR, 1234L); assertEquals(Double.valueOf(12.34), amount.getNumber().doubleValue()); assertEquals(DOLLAR, amount.getCurrency()); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldReturnErrorWhenCurrencyIsInvalid() { Money.ofMinor(new InvalidCurrency(), 1234L); } @Test(expectedExceptions = IllegalArgumentException.class) public void shouldReturnErrorWhenFractionDigitIsNegative() { Money.ofMinor(DOLLAR, 1234L, -2); } @Test public void shouldRerturnMonetaryAmountUsingFractionDigits() { MonetaryAmount amount = Money.ofMinor(DOLLAR, 1234L, 3); assertEquals(Double.valueOf(1.234), amount.getNumber().doubleValue()); assertEquals(DOLLAR, amount.getCurrency()); } }