/* * CREDIT SUISSE IS WILLING TO LICENSE THIS SPECIFICATION TO YOU ONLY UPON THE * CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS AGREEMENT. * PLEASE READ THE TERMS AND CONDITIONS OF THIS AGREEMENT CAREFULLY. BY * DOWNLOADING THIS SPECIFICATION, YOU ACCEPT THE TERMS AND CONDITIONS OF THE * AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY IT, SELECT THE "DECLINE" * BUTTON AT THE BOTTOM OF THIS PAGE. Specification: JSR-354 Money and Currency * API ("Specification") Copyright (c) 2012-2013, Credit Suisse All rights * reserved. */ package org.javamoney.adopjsr; import org.javamoney.moneta.CurrencyUnitBuilder; import org.javamoney.moneta.FastMoney; import org.javamoney.moneta.Money; import org.javamoney.moneta.function.MonetaryUtil; import org.junit.Test; import javax.money.*; import java.math.BigDecimal; import java.math.MathContext; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static org.junit.Assert.*; /** * Created by Anatole on 08.03.14. */ public class MoneyAlgorithmicsTest{ private MoneyAlgorithmics alg = new MoneyAlgorithmics(); private static final CurrencyContext CURENCY_CONTEXT = CurrencyContextBuilder.of("MoneyAlgorithmicsTest").build(); @Test public void testAddAll() throws Exception{ assertEquals(Money.of(20, "CHF"), alg.addAll(Money.of(10, "CHF"), Money.of(10, "CHF"))); assertEquals(Money.of(20.8, "CHF"), alg.addAll(Money.of(10.5, "CHF"), Money.of(10.3, "CHF"))); assertEquals(Money.of(-90, "CHF"), alg.addAll(Money.of(-100.3, "CHF"), Money.of(10.3, "CHF"))); assertEquals(Money.of(0, "CHF"), alg.addAll(Money.of(0, "CHF"), Money.of(0, "CHF"))); assertEquals(Money.of(283976.34, "CHF"), alg.addAll(Money.of(283976.34, "CHF"), Money.of(0, "CHF"))); } @Test public void testMultiply() throws Exception{ assertEquals(Money.of(100, "CHF"), alg.multiply(Money.of(10, "CHF"), 10)); assertEquals(Money.of(101, "CHF"), alg.multiply(Money.of(10.1, "CHF"), 10)); assertEquals(Money.of(21323120, "CHF"), alg.multiply(Money.of(2132312, "CHF"), 10)); assertEquals(Money.of(100, "CHF"), alg.multiply(Money.of(-100, "CHF"), -1)); } @Test public void testSubtract() throws Exception{ assertEquals(Money.of(0, "CHF"), alg.subtract(Money.of(10, "CHF"), Money.of(10, "CHF"))); assertEquals(Money.of(-110, "CHF"), alg.subtract(Money.of(10, "CHF"), Money.of(120, "CHF"))); assertEquals(Money.of(-2.5, "CHF"), alg.subtract(Money.of(10, "CHF"), Money.of(12.5, "CHF"))); assertEquals(Money.of(0.06, "CHF"), alg.subtract(Money.of(10.56, "CHF"), Money.of(10.5, "CHF"))); } @Test public void testDivide() throws Exception{ assertEquals(Money.of(1, "CHF"), alg.divide(Money.of(10, "CHF"), new BigDecimal(10))); assertEquals(Money.of(1, "CHF"), alg.divide(Money.of(10.345, "CHF"), new BigDecimal("10.345"))); assertEquals(Money.of(10.345, "CHF"), alg.divide(Money.of(10.345, "CHF"), BigDecimal.ONE)); assertEquals(Money.of(0.0837991089509923, "CHF"), alg.divide(Money.of(10.345, "CHF"), new BigDecimal("123.45"))); } @Test public void testScaleByTen() throws Exception{ assertEquals(Money.of(100, "CHF"), alg.scaleByTen(Money.of(10, "CHF"), 1)); assertEquals(Money.of(123234405.6, "CHF"), alg.scaleByTen(Money.of(123234.4056, "CHF"), 3)); } @Test public void testSortAmounts() throws Exception{ List<MonetaryAmount> amounts = alg.sortAmounts(Money.of(0, "CHF"), FastMoney.of(1, "CHF"), Money.of(-200, "CHF"), FastMoney.of(210, "USD")); List<MonetaryAmount> sortedAmounts = new ArrayList<>(); sortedAmounts.addAll(amounts); Collections.sort(sortedAmounts); } @Test public void testQuerySumOf() throws Exception{ MonetaryAmount amt = alg.querySumOf(Monetary.getCurrency("CHF"), FastMoney.of(10, "CHF"), Money.of(0, "CHF"), FastMoney.of(1, "USD"), Money.of(200.45, "CHF"), FastMoney.of(210, "USD")); assertTrue(Money.of(210.45, "CHF").isEqualTo(amt)); } @Test public void testCalculateReciprocal() throws Exception{ MonetaryAmount amt = alg.calculateReciprocal(Money.of(10, "CHF")); assertTrue(Money.of(0.1, "CHF").isEqualTo(amt)); } @Test public void testCalculatePercent() throws Exception{ MonetaryAmount amt = alg.calculatePercent(FastMoney.of(100, "EUR"), 20.5); assertTrue(Money.of(20.5, "EUR").isEqualTo(amt)); amt = alg.calculatePercent(Money.of(10.45, "EUR"), 1.345); assertTrue(Money.of(0.1405525, "EUR").isEqualTo(amt)); } @Test public void testCalculatePermil() throws Exception{ MonetaryAmount amt = alg.calculatePermil(FastMoney.of(100, "EUR"), 20.5); assertTrue(Money.of(2.05, "EUR").isEqualTo(amt)); amt = alg.calculatePermil(Money.of(10.45, "EUR"), 1.345); assertTrue(Money.of(0.01405525, "EUR").isEqualTo(amt)); } @Test public void testGetMajorPart() throws Exception{ MonetaryAmount amt1 = alg.getMajorPart(FastMoney.of(100.1223, "EUR")); assertEquals(amt1, FastMoney.of(100.1223, "EUR").with(MonetaryUtil.majorPart())); } @Test public void testGetCompoundInterest() throws Exception{ MonetaryAmount amt1 = alg.getCompoundInterest(FastMoney.of(100, "EUR"), 10.5, 1); assertTrue(Money.of(110.5, "EUR").isEqualTo(amt1)); MonetaryAmount amt2 = alg.getCompoundInterest(FastMoney.of(100, "EUR"), 10.5, 2); assertTrue(amt1.multiply(1.105).isEqualTo(amt2)); } @Test public void testMultiplyAdvanced() throws Exception{ MonetaryAmount amt1 = alg.multiplyAdvanced(FastMoney.of(100, "EUR"), BigDecimal.valueOf(Long.MAX_VALUE)); assertTrue(Monetary.getDefaultAmountFactory().setNumber(100).setCurrency("EUR") .setContext(MonetaryContextBuilder.of().set(MathContext.UNLIMITED).build()).create() .multiply(BigDecimal.valueOf(Long.MAX_VALUE)).isEqualTo(amt1)); } @Test public void testSubtractAdvanced() throws Exception{ MonetaryAmount amt1 = alg.subtractAdvanced(FastMoney.of(100, "EUR"), Money.of(new BigDecimal("0.0000000000000000000001"), "EUR")); assertTrue(Money.of(100, "EUR", MonetaryContextBuilder.of().set(MathContext.UNLIMITED).build()) .subtract(Money.of(new BigDecimal("0.0000000000000000000001"), "EUR")).isEqualTo(amt1)); } @Test public void testDivideAdvanced() throws Exception{ MonetaryAmount amt1 = alg.divideAdvanced(FastMoney.of(100, "EUR"), new BigDecimal("0.0000000000000000000001")); assertTrue(Money.of(100, "EUR", MonetaryContextBuilder.of().set(MathContext.UNLIMITED).build()) .divide(new BigDecimal("0.0000000000000000000001")).isEqualTo(amt1)); } /** * Implement a {@link javax.money.MonetaryOperator} that simply duplicates the amount given. */ @Test public void testDuplicateOperator(){ MonetaryOperator op = alg.getDuplicateOperator(); assertEquals(Money.of(20, "CHF"), Money.of(10, "CHF").with(op)); assertEquals(Money.of(20.86, "CHF"), Money.of(10.43, "CHF").with(op)); assertEquals(Money.of(-4, "CHF"), Money.of(-2, "CHF").with(op)); assertEquals(Money.of(0, "CHF"), Money.of(0, "CHF").with(op)); } /** * Implement a {@link javax.money.MonetaryOperator} that calculates the total of all amounts operated on. */ @Test public void testTotalOperator(){ MonetaryOperator op = alg.getTotalOperator(); op.apply(Money.of(2, "CHF")); op.apply(FastMoney.of(4.5, "CHF")); op.apply(Money.of(10, "CHF")); op.apply(FastMoney.of(-1.5, "CHF")); assertEquals(Money.of(35.1234, "CHF"), op.apply(Money.of(20.1234, "CHF"))); } /** * Implement a {@link javax.money.MonetaryQuery} that return {@code true} for each amount, that has an ISO * currency (as available on {@link java.util.Currency}. */ @Test public void testCountingQuery(){ MonetaryQuery<Boolean> query = alg.getCountingQuery(); assertTrue(Money.of(2, "CHF").query(query)); assertFalse(FastMoney.of(4.5, CurrencyUnitBuilder.of("GEEC", CURENCY_CONTEXT).build()).query(query)); assertTrue(Money.of(10, "INR").query(query)); assertFalse(FastMoney.of(-1.5, CurrencyUnitBuilder.of("2xx2", CURENCY_CONTEXT).build()).query(query)); } }