package name.abuchen.portfolio.money.impl;
import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.hamcrest.number.OrderingComparison.comparesEqualTo;
import static org.junit.Assert.assertThat;
import java.math.BigDecimal;
import java.time.LocalDate;
import org.junit.Test;
import name.abuchen.portfolio.money.ExchangeRateProviderFactory;
import name.abuchen.portfolio.money.ExchangeRateTimeSeries;
@SuppressWarnings("nls")
public class GBXExchangeRateProviderTest
{
@Test
public void testIt()
{
ExchangeRateProviderFactory factory = new ExchangeRateProviderFactory();
// default value EUR -> GBP is 0.72666
ExchangeRateTimeSeries eur_gbx = factory.getTimeSeries("EUR", "GBX");
assertThat(eur_gbx.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal("72.666")));
// inverse of default EUR -> GBP
ExchangeRateTimeSeries gbx_eur = factory.getTimeSeries("GBX", "EUR");
assertThat(gbx_eur.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(
BigDecimal.ONE.divide(new BigDecimal("72.666"), 12, BigDecimal.ROUND_HALF_DOWN)));
// GBX -> GBP
ExchangeRateTimeSeries gbx_gbp = factory.getTimeSeries("GBX", "GBP");
assertThat(gbx_gbp.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal("0.01")));
// GBP -> GBX
ExchangeRateTimeSeries gbp_gbx = factory.getTimeSeries("GBP", "GBX");
assertThat(gbp_gbx.lookupRate(LocalDate.now()).get().getValue(), comparesEqualTo(new BigDecimal(100.0)));
// GBX -> USD
// default value EUR -> GBP is 0.72666
// default value EUR -> USD is 1.0836
double calculatedRate = 0.01d * (1 / 0.72666d) * 1.0836d;
ExchangeRateTimeSeries gbx_usd = factory.getTimeSeries("GBX", "USD");
assertThat(gbx_usd.lookupRate(LocalDate.now()).get().getValue().doubleValue(),
closeTo(calculatedRate, 0.00000001));
// USD -> GBX
calculatedRate = (1 / 1.0836d) * 0.72666d * 100;
ExchangeRateTimeSeries usd_gbx = factory.getTimeSeries("USD", "GBX");
assertThat(usd_gbx.lookupRate(LocalDate.now()).get().getValue().doubleValue(),
closeTo(calculatedRate, 0.00000001));
}
}