/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.basics.currency;
import static com.opengamma.strata.basics.currency.Currency.AUD;
import static com.opengamma.strata.basics.currency.Currency.BHD;
import static com.opengamma.strata.basics.currency.Currency.BRL;
import static com.opengamma.strata.basics.currency.Currency.CAD;
import static com.opengamma.strata.basics.currency.Currency.EUR;
import static com.opengamma.strata.basics.currency.Currency.GBP;
import static com.opengamma.strata.basics.currency.Currency.USD;
import static com.opengamma.strata.collect.TestHelper.assertJodaConvert;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.Optional;
import java.util.Set;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Test {@link CurrencyPair}.
*/
@Test
public class CurrencyPairTest {
//-----------------------------------------------------------------------
public void test_getAvailable() {
Set<CurrencyPair> available = CurrencyPair.getAvailablePairs();
assertTrue(available.contains(CurrencyPair.of(EUR, USD)));
assertTrue(available.contains(CurrencyPair.of(EUR, GBP)));
assertTrue(available.contains(CurrencyPair.of(GBP, USD)));
}
//-------------------------------------------------------------------------
public void test_of_CurrencyCurrency() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertEquals(test.getBase(), GBP);
assertEquals(test.getCounter(), USD);
assertEquals(test.isIdentity(), false);
assertEquals(test.toString(), "GBP/USD");
}
public void test_of_CurrencyCurrency_reverseStandardOrder() {
CurrencyPair test = CurrencyPair.of(USD, GBP);
assertEquals(test.getBase(), USD);
assertEquals(test.getCounter(), GBP);
assertEquals(test.isIdentity(), false);
assertEquals(test.toString(), "USD/GBP");
}
public void test_of_CurrencyCurrency_same() {
CurrencyPair test = CurrencyPair.of(USD, USD);
assertEquals(test.getBase(), USD);
assertEquals(test.getCounter(), USD);
assertEquals(test.isIdentity(), true);
assertEquals(test.toString(), "USD/USD");
}
public void test_of_CurrencyCurrency_null() {
assertThrowsIllegalArg(() -> CurrencyPair.of(null, USD));
assertThrowsIllegalArg(() -> CurrencyPair.of(USD, null));
assertThrowsIllegalArg(() -> CurrencyPair.of(null, null));
}
//-------------------------------------------------------------------------
@DataProvider(name = "parseGood")
Object[][] data_parseGood() {
return new Object[][] {
{"USD/EUR", USD, EUR},
{"EUR/USD", EUR, USD},
{"EUR/EUR", EUR, EUR},
{"cAd/GbP", CAD, GBP},
};
}
@Test(dataProvider = "parseGood")
public void test_parse_String_good(String input, Currency base, Currency counter) {
assertEquals(CurrencyPair.parse(input), CurrencyPair.of(base, counter));
}
@DataProvider(name = "parseBad")
Object[][] data_parseBad() {
return new Object[][] {
{"AUD"},
{"AUD/GB"},
{"AUD GBP"},
{"AUD:GBP"},
{"123/456"},
{""},
{null},
};
}
@Test(dataProvider = "parseBad", expectedExceptions = IllegalArgumentException.class)
public void test_parse_String_bad(String input) {
CurrencyPair.parse(input);
}
//-------------------------------------------------------------------------
public void test_inverse() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertEquals(test.inverse(), CurrencyPair.of(USD, GBP));
}
public void test_inverse_same() {
CurrencyPair test = CurrencyPair.of(GBP, GBP);
assertEquals(test.inverse(), CurrencyPair.of(GBP, GBP));
}
//-------------------------------------------------------------------------
public void test_contains_Currency() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertEquals(test.contains(GBP), true);
assertEquals(test.contains(USD), true);
assertEquals(test.contains(EUR), false);
}
public void test_contains_Currency_same() {
CurrencyPair test = CurrencyPair.of(GBP, GBP);
assertEquals(test.contains(GBP), true);
assertEquals(test.contains(USD), false);
assertEquals(test.contains(EUR), false);
}
public void test_contains_Currency_null() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertThrowsIllegalArg(() -> test.contains(null));
}
//-------------------------------------------------------------------------
public void test_isInverse_CurrencyPair() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertEquals(test.isInverse(test), false);
assertEquals(test.isInverse(CurrencyPair.of(GBP, USD)), false);
assertEquals(test.isInverse(CurrencyPair.of(USD, GBP)), true);
assertEquals(test.isInverse(CurrencyPair.of(GBP, EUR)), false);
assertEquals(test.isInverse(CurrencyPair.of(EUR, GBP)), false);
assertEquals(test.isInverse(CurrencyPair.of(USD, EUR)), false);
assertEquals(test.isInverse(CurrencyPair.of(EUR, USD)), false);
}
public void test_isInverse_CurrencyPair_null() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertThrowsIllegalArg(() -> test.isInverse(null));
}
//-------------------------------------------------------------------------
public void test_cross_CurrencyPair() {
CurrencyPair gbpGbp = CurrencyPair.of(GBP, GBP);
CurrencyPair gbpUsd = CurrencyPair.of(GBP, USD);
CurrencyPair usdGbp = CurrencyPair.of(USD, GBP);
CurrencyPair eurGbp = CurrencyPair.of(EUR, GBP);
CurrencyPair eurUsd = CurrencyPair.of(EUR, USD);
CurrencyPair usdEur = CurrencyPair.of(USD, EUR);
assertEquals(gbpUsd.cross(gbpUsd), Optional.empty());
assertEquals(gbpUsd.cross(usdGbp), Optional.empty());
assertEquals(gbpGbp.cross(gbpUsd), Optional.empty());
assertEquals(gbpUsd.cross(gbpGbp), Optional.empty());
assertEquals(gbpUsd.cross(usdEur), Optional.of(eurGbp));
assertEquals(gbpUsd.cross(eurUsd), Optional.of(eurGbp));
assertEquals(usdGbp.cross(usdEur), Optional.of(eurGbp));
assertEquals(usdGbp.cross(eurUsd), Optional.of(eurGbp));
assertEquals(usdEur.cross(gbpUsd), Optional.of(eurGbp));
assertEquals(usdEur.cross(usdGbp), Optional.of(eurGbp));
assertEquals(eurUsd.cross(gbpUsd), Optional.of(eurGbp));
assertEquals(eurUsd.cross(usdGbp), Optional.of(eurGbp));
}
public void test_cross_CurrencyPair_null() {
CurrencyPair test = CurrencyPair.of(GBP, USD);
assertThrowsIllegalArg(() -> test.cross(null));
}
//-----------------------------------------------------------------------
public void test_isConventional() {
assertEquals(CurrencyPair.of(GBP, USD).isConventional(), true);
assertEquals(CurrencyPair.of(USD, GBP).isConventional(), false);
// There is no configuration for GBP/BRL or BRL/GBP so the ordering list is used to choose a convention pair
// GBP is in the currency order list and BRL isn't so GBP is the base
assertEquals(CurrencyPair.of(GBP, BRL).isConventional(), true);
assertEquals(CurrencyPair.of(BRL, GBP).isConventional(), false);
// There is no configuration for BHD/BRL or BRL/BHD and neither are in the list specifying currency priority order.
// Lexicographical ordering is used
assertEquals(CurrencyPair.of(BHD, BRL).isConventional(), true);
assertEquals(CurrencyPair.of(BRL, BHD).isConventional(), false);
assertEquals(CurrencyPair.of(GBP, GBP).isConventional(), true);
}
public void test_toConventional() {
assertEquals(CurrencyPair.of(GBP, USD).toConventional(), CurrencyPair.of(GBP, USD));
assertEquals(CurrencyPair.of(USD, GBP).toConventional(), CurrencyPair.of(GBP, USD));
assertEquals(CurrencyPair.of(GBP, BRL).toConventional(), CurrencyPair.of(GBP, BRL));
assertEquals(CurrencyPair.of(BRL, GBP).toConventional(), CurrencyPair.of(GBP, BRL));
assertEquals(CurrencyPair.of(BHD, BRL).toConventional(), CurrencyPair.of(BHD, BRL));
assertEquals(CurrencyPair.of(BRL, BHD).toConventional(), CurrencyPair.of(BHD, BRL));
}
public void test_rateDigits() {
assertEquals(CurrencyPair.of(GBP, USD).getRateDigits(), 4);
assertEquals(CurrencyPair.of(USD, GBP).getRateDigits(), 4);
assertEquals(CurrencyPair.of(BRL, GBP).getRateDigits(), 4);
assertEquals(CurrencyPair.of(GBP, BRL).getRateDigits(), 4);
assertEquals(CurrencyPair.of(BRL, BHD).getRateDigits(), 5);
assertEquals(CurrencyPair.of(BHD, BRL).getRateDigits(), 5);
}
//-------------------------------------------------------------------------
public void test_equals_hashCode() {
CurrencyPair a1 = CurrencyPair.of(AUD, GBP);
CurrencyPair a2 = CurrencyPair.of(AUD, GBP);
CurrencyPair b = CurrencyPair.of(USD, GBP);
CurrencyPair c = CurrencyPair.of(USD, EUR);
assertEquals(a1.equals(a1), true);
assertEquals(a1.equals(a2), true);
assertEquals(a1.equals(b), false);
assertEquals(a1.equals(c), false);
assertEquals(b.equals(a1), false);
assertEquals(b.equals(a2), false);
assertEquals(b.equals(b), true);
assertEquals(b.equals(c), false);
assertEquals(c.equals(a1), false);
assertEquals(c.equals(a2), false);
assertEquals(c.equals(b), false);
assertEquals(c.equals(c), true);
assertEquals(a1.hashCode(), a2.hashCode());
}
public void test_equals_bad() {
CurrencyPair test = CurrencyPair.of(AUD, GBP);
assertFalse(test.equals(""));
assertFalse(test.equals(null));
}
//-----------------------------------------------------------------------
public void test_serialization() {
assertSerialization(CurrencyPair.of(GBP, USD));
assertSerialization(CurrencyPair.of(GBP, GBP));
}
public void test_jodaConvert() {
assertJodaConvert(CurrencyPair.class, CurrencyPair.of(GBP, USD));
assertJodaConvert(CurrencyPair.class, CurrencyPair.of(GBP, GBP));
}
}