/*
* 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.FastMoney;
import org.javamoney.moneta.Money;
import org.javamoney.moneta.RoundedMoney;
import org.junit.Test;
import javax.money.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.Currency;
import java.util.Locale;
import static org.junit.Assert.*;
/**
* Test class to ensure the basic core API is well understood.
* Created by Anatole on 07.03.14.
*/
public class BasicsTest {
private Basics basics = new Basics();
@Test
public void testGetProvidedCurrency() throws Exception {
for (Currency cur : Currency.getAvailableCurrencies()) {
assertNotNull(basics.getProvidedCurrency(cur.getCurrencyCode()));
}
}
@Test
public void testGetProvidedCurrency1() throws Exception {
for (String country : Locale.getISOCountries()) {
Locale locale = new Locale("", country);
try {
Currency.getInstance(locale);
} catch (Exception e) {
continue;
}
assertNotNull(basics.getProvidedCurrency(locale));
}
}
@Test
public void testBuildCustomCurrency() throws Exception {
CurrencyUnit cur = basics.buildCustomCurrency("BTC", -1, 10);
assertEquals("BTC", cur.getCurrencyCode());
assertEquals(-1, cur.getNumericCode());
assertEquals(10, cur.getDefaultFractionDigits());
cur = basics.buildCustomCurrency("BarFoo15-t3", 1234, 3);
assertEquals("BarFoo15-t3", cur.getCurrencyCode());
assertEquals(1234, cur.getNumericCode());
assertEquals(3, cur.getDefaultFractionDigits());
}
@Test
public void testBuildAndRegisterCustomCurrency() throws Exception {
CurrencyUnit cur = basics.buildAndRegisterCustomCurrency("GeeCOIN", 2014, 0);
assertEquals("GeeCOIN", cur.getCurrencyCode());
assertEquals(2014, cur.getNumericCode());
assertEquals(0, cur.getDefaultFractionDigits());
CurrencyUnit unit = Monetary.getCurrency("GeeCOIN");
assertNotNull("Currency not registered.", unit);
assertEquals("GeeCOIN", unit.getCurrencyCode());
assertEquals(2014, unit.getNumericCode());
assertEquals(0, unit.getDefaultFractionDigits());
}
@Test
public void testGetMonetaryAmountTypes() throws Exception {
Collection<Class<? extends MonetaryAmount>> types = basics.getMonetaryAmountTypes();
assertNotNull(types);
assertTrue(types.contains(Money.class));
assertTrue(types.contains(FastMoney.class));
assertTrue(types.contains(RoundedMoney.class));
}
@Test
public void testGetDefaultMonetaryAmountType() throws Exception {
Class<? extends MonetaryAmount> type = basics.getDefaultMonetaryAmountType();
assertNotNull(type);
assertEquals(type, Money.class);
}
@Test
public void testGetMoneyFactory() throws Exception {
assertNotNull(basics.getMoneyFactory(Money.class));
assertNotNull(basics.getMoneyFactory(FastMoney.class));
}
@Test
public void testGetMoney() throws Exception {
MonetaryAmount amt = basics.getMoney(10.50d, "CHF");
assertNotNull(amt);
assertEquals("CHF", amt.getCurrency().getCurrencyCode());
assertEquals(10.50d, amt.getNumber().doubleValue(), 0.0d);
amt = basics.getMoney(Long.MAX_VALUE, "USD");
assertNotNull(amt);
assertEquals("USD", amt.getCurrency().getCurrencyCode());
assertEquals(Long.MAX_VALUE, amt.getNumber().longValue());
}
@Test
public void testGetMoneyWithContext() throws Exception {
MonetaryContext preciseCtx = MonetaryContextBuilder.of().set("AmountFlavor", "PRECISION").build();
MonetaryContext fastCtx = MonetaryContextBuilder.of().set("AmountFlavor", "PERFORMANCE").build();
MonetaryAmount amt =
basics.getMoneyWithContext(new BigDecimal("10.50792323200000000000236823"), "CHF", preciseCtx);
assertNotNull(amt);
assertEquals("CHF", amt.getCurrency().getCurrencyCode());
assertEquals(new BigDecimal("10.50792323200000000000236823"), amt.getNumber().numberValue(BigDecimal.class));
amt = basics.getMoneyWithContext(6546546464L, "USD", fastCtx);
assertNotNull(amt);
assertEquals("USD", amt.getCurrency().getCurrencyCode());
assertEquals(6546546464L, amt.getNumber().longValueExact());
}
@Test
public void testGetMoneyWithSpecification() throws Exception {
MonetaryAmount amt =
basics.getMoneyWithSpecificCapabilities(new BigDecimal("10.50792323200000000000236823"), "CHF");
assertNotNull(amt);
assertEquals("CHF", amt.getCurrency().getCurrencyCode());
assertEquals(new BigDecimal("10.50792323200000000000236823"), amt.getNumber().numberValue(BigDecimal.class));
MonetaryContext ctx = amt.getContext();
assertTrue(ctx.getMaxScale() >= 128);
assertTrue(ctx.getPrecision() >= 256 || ctx.getPrecision() == 0);
assertEquals(ctx.get(RoundingMode.class), RoundingMode.FLOOR);
amt = basics.getMoneyWithSpecificCapabilities(6546546464L, "USD");
assertNotNull(amt);
assertEquals("USD", amt.getCurrency().getCurrencyCode());
assertEquals(6546546464L, amt.getNumber().longValueExact());
assertTrue(ctx.getMaxScale() >= 128);
assertTrue(ctx.getPrecision() >= 256 || ctx.getPrecision() == 0);
assertEquals(ctx.get(RoundingMode.class), RoundingMode.FLOOR);
}
@Test
public void testConvertAmount() {
MonetaryAmount converted =
basics.convertAmount(Money.of(200, "USD"), new BigDecimal("23628732374387462.87638476"), "GBP");
assertNotNull(converted);
assertEquals(new BigDecimal("23628732374387462.87638476"),
converted.getNumber().numberValue(BigDecimal.class).stripTrailingZeros());
assertEquals("GBP", converted.getCurrency().getCurrencyCode());
}
@Test
public void testConvertAmountAdvanced() {
MonetaryAmount converted = basics.convertAmount(Money.of(200.234, "USD"), 100, 200, MathContext.UNLIMITED);
assertNotNull(converted);
assertEquals(new BigDecimal("200.234"),
converted.getNumber().numberValue(BigDecimal.class).stripTrailingZeros());
assertEquals("USD", converted.getCurrency().getCurrencyCode());
assertEquals(200, converted.getNumber().getPrecision());
assertEquals(200, converted.getContext().getPrecision());
assertEquals(100, converted.getContext().getMaxScale());
assertEquals(MathContext.UNLIMITED, converted.getContext().get(MathContext.class));
}
}