package net.objectlab.kit.fxcalc; import static net.objectlab.kit.util.BigDecimalUtil.bd; import static org.assertj.core.api.Assertions.assertThat; import java.math.BigDecimal; import net.objectlab.kit.util.BigDecimalUtil; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CrossRateCalculatorTest { private static final Logger LOG = LoggerFactory.getLogger(CrossRateCalculatorTest.class); @Test(expected = IllegalArgumentException.class) public void tesCrossWithoutCrossCcy() { LOG.debug("badCross --------------------------------"); final CurrencyPair tgt = new CurrencyPair("EUR", "CHF"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("GBP", "CHF"), null, true, bd("2.1702"), bd("2.1707"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("EUR", "AED"), null, true, bd("0.7374"), bd("0.7379"), new JdkCurrencyProvider()); CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); } @Test(expected = IllegalArgumentException.class) public void tesCrossWithCrossInTarget() { LOG.debug("badCross --------------------------------"); final CurrencyPair tgt = new CurrencyPair("EUR", "CHF"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("EUR", "JPY"), null, true, bd("2.1702"), bd("2.1707"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("EUR", "AED"), null, true, bd("0.7374"), bd("0.7379"), new JdkCurrencyProvider()); CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); } @Test public void crossWithNonUsdCross2() { LOG.debug("crossWithNonUsdCross2 --------------------------------"); final CurrencyPair tgt = new CurrencyPair("EUR", "CHF"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("GBP", "CHF"), null, true, bd("2.1702"), bd("2.1707"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("EUR", "GBP"), null, true, bd("0.7374"), bd("0.7379"), new JdkCurrencyProvider()); FxRate fxRate = CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid non USD Cross 2 {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.6003")); assertThat(fxRate.getAsk()).describedAs("Ask non USD Cross 2 {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.6018")); fxRate = CrossRateCalculator.calculateCross(tgt, fx2, fx1, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid non USD Cross 2 {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.6003")); assertThat(fxRate.getAsk()).describedAs("Ask non USD Cross 2 {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.6018")); CurrencyPair tgtInverse = tgt.createInverse(); fxRate = CrossRateCalculator.calculateCross(tgtInverse, fx1, fx2, 6, 6, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgtInverse); assertThat(fxRate.getBid()).describedAs("Bid non USD Cross 2 {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.624313")); assertThat(fxRate.getAsk()).describedAs("Ask non USD Cross 2 {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.624881")); fxRate = CrossRateCalculator.calculateCross(tgtInverse, fx2, fx1, 6, 6, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgtInverse); assertThat(fxRate.getBid()).describedAs("Bid non USD Cross 2 {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.624313")); assertThat(fxRate.getAsk()).describedAs("Ask non USD Cross 2 {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.624881")); } @Test public void crossWithNonUsdCross() { LOG.debug("crossWithNonUsdCross --------------------------------"); final CurrencyPair tgt = new CurrencyPair("CHF", "JPY"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("GBP", "CHF"), null, true, bd("2.1702"), bd("2.1707"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("GBP", "JPY"), null, true, bd("192.70"), bd("193"), new JdkCurrencyProvider()); FxRate fxRate = CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid Non-USD Cross {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("88.7732")); assertThat(fxRate.getAsk()).describedAs("Ask Non-USD Cross {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("88.9319")); fxRate = CrossRateCalculator.calculateCross(tgt, fx2, fx1, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid Non-USD Cross {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("88.7732")); assertThat(fxRate.getAsk()).describedAs("Ask Non-USD Cross {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("88.9319")); CurrencyPair tgtInverse = tgt.createInverse(); fxRate = CrossRateCalculator.calculateCross(tgtInverse, fx1, fx2, 6, 6, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgtInverse); assertThat(fxRate.getBid()).describedAs("Bid Non-USD Cross {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.011245")); assertThat(fxRate.getAsk()).describedAs("Ask Non-USD Cross {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.011265")); fxRate = CrossRateCalculator.calculateCross(tgtInverse, fx2, fx1, 6, 6, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgtInverse); assertThat(fxRate.getBid()).describedAs("Bid Non-USD Cross {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.011245")); assertThat(fxRate.getAsk()).describedAs("Ask Non-USD Cross {}", tgtInverse).isEqualByComparingTo(BigDecimalUtil.bd("0.011265")); } @Test public void crossWithMixedUsd() { LOG.debug("crossWithMixedUsd --------------------------------"); final CurrencyPair tgt = new CurrencyPair("EUR", "SGD"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("EUR", "USD"), null, true, bd("1.2166"), bd("1.2171"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("USD", "SGD"), null, true, bd("1.6782"), bd("1.6792"), new JdkCurrencyProvider()); FxRate fxRate = CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid Mixed USD {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("2.0417")); assertThat(fxRate.getAsk()).describedAs("Ask Mixed USD {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("2.0438")); fxRate = CrossRateCalculator.calculateCross(tgt, fx2, fx1, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid Mixed USD {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("2.0417")); assertThat(fxRate.getAsk()).describedAs("Ask Mixed USD {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("2.0438")); } @Test public void crossWithUsdMinor() { LOG.debug("crossWithUsdMinor --------------------------------"); final CurrencyPair tgt = new CurrencyPair("EUR", "AUD"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("EUR", "USD"), null, true, bd("1.2166"), bd("1.2171"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("AUD", "USD"), null, true, bd("0.6834"), bd("0.6839"), new JdkCurrencyProvider()); FxRate fxRate = CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid USD Minor {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.7789")); assertThat(fxRate.getAsk()).describedAs("Ask USD Minor {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.7809")); fxRate = CrossRateCalculator.calculateCross(tgt, fx2, fx1, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid USD Minor {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.7789")); assertThat(fxRate.getAsk()).describedAs("Ask USD Minor {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.7809")); } @Test public void crossWithUsdMajorInversed() { LOG.debug("crossWithUsdMajorInversed --------------------------------"); final CurrencyPair tgt = new CurrencyPair("CAD", "SGD"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("USD", "CAD"), null, true, bd("1.4874"), bd("1.4879"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("USD", "SGD"), null, true, bd("1.6782"), bd("1.6792"), new JdkCurrencyProvider()); FxRate fxRate = CrossRateCalculator.calculateCross(tgt, fx1.createInverse(), fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid USD Major Inverted {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1279")); assertThat(fxRate.getAsk()).describedAs("Ask USD Major Inverted {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1289")); fxRate = CrossRateCalculator.calculateCross(tgt, fx1.createInverse(), fx2.createInverse(), 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid USD Major Inverted {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1279")); assertThat(fxRate.getAsk()).describedAs("Ask USD Major Inverted {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1289")); CurrencyPair tgtInverted = tgt.createInverse(); fxRate = CrossRateCalculator.calculateCross(tgtInverted, fx1.createInverse(), fx2.createInverse(), 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgtInverted); assertThat(fxRate.getBid()).describedAs("Bid USD Major Inverted {}", tgtInverted).isEqualByComparingTo(BigDecimalUtil.bd("0.8857")); assertThat(fxRate.getAsk()).describedAs("Ask USD Major Inverted {}", tgtInverted).isEqualByComparingTo(BigDecimalUtil.bd("0.8866")); } @Test public void testWithUsdMajor() { final CurrencyPair tgt = new CurrencyPair("CAD", "SGD"); final FxRateImpl fx1 = new FxRateImpl(new CurrencyPair("USD", "CAD"), null, true, bd("1.4874"), bd("1.4879"), new JdkCurrencyProvider()); final FxRateImpl fx2 = new FxRateImpl(new CurrencyPair("USD", "SGD"), null, true, bd("1.6782"), bd("1.6792"), new JdkCurrencyProvider()); FxRate fxRate = CrossRateCalculator.calculateCross(tgt, fx1, fx2, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid USD Major {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1279")); assertThat(fxRate.getAsk()).describedAs("Ask USD Major {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1289")); fxRate = CrossRateCalculator.calculateCross(tgt, fx2, fx1, 4, 4, StandardMajorCurrencyRanking.getDefault(), BigDecimal.ROUND_HALF_UP, BigDecimal.ROUND_HALF_UP, new JdkCurrencyProvider()); assertThat(fxRate.getCurrencyPair()).isEqualTo(tgt); assertThat(fxRate.getBid()).describedAs("Bid USD Major {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1279")); assertThat(fxRate.getAsk()).describedAs("Ask USD Major {}", tgt).isEqualByComparingTo(BigDecimalUtil.bd("1.1289")); } }