/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.pricer.fx;
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.JPY;
import static com.opengamma.strata.basics.currency.Currency.USD;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static com.opengamma.strata.collect.TestHelper.date;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertSame;
import java.time.LocalDate;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.basics.currency.CurrencyPair;
import com.opengamma.strata.basics.currency.FxMatrix;
import com.opengamma.strata.market.sensitivity.MutablePointSensitivities;
import com.opengamma.strata.market.sensitivity.PointSensitivities;
import com.opengamma.strata.market.sensitivity.PointSensitivityBuilder;
import com.opengamma.strata.pricer.ZeroRateSensitivity;
/**
* Test {@link FxForwardSensitivity}.
*/
@Test
public class FxForwardSensitivityTest {
private static final CurrencyPair CURRENCY_PAIR = CurrencyPair.of(EUR, GBP);
private static final LocalDate REFERENCE_DATE = LocalDate.of(2015, 11, 23);
private static final double SENSITIVITY = 1.34d;
public void test_of_withoutCurrency() {
FxForwardSensitivity test = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
assertEquals(test.getCurrency(), EUR);
assertEquals(test.getCurrencyPair(), CURRENCY_PAIR);
assertEquals(test.getReferenceCounterCurrency(), EUR);
assertEquals(test.getReferenceCurrency(), GBP);
assertEquals(test.getReferenceDate(), REFERENCE_DATE);
assertEquals(test.getSensitivity(), SENSITIVITY);
}
public void test_of_withCurrency() {
FxForwardSensitivity test = FxForwardSensitivity.of(CURRENCY_PAIR, EUR, REFERENCE_DATE, USD, SENSITIVITY);
assertEquals(test.getCurrency(), USD);
assertEquals(test.getCurrencyPair(), CURRENCY_PAIR);
assertEquals(test.getReferenceCounterCurrency(), GBP);
assertEquals(test.getReferenceCurrency(), EUR);
assertEquals(test.getReferenceDate(), REFERENCE_DATE);
assertEquals(test.getSensitivity(), SENSITIVITY);
}
public void test_of_wrongRefCurrency() {
assertThrowsIllegalArg(() -> FxForwardSensitivity.of(CURRENCY_PAIR, USD, REFERENCE_DATE, SENSITIVITY));
assertThrowsIllegalArg(() -> FxForwardSensitivity.of(CURRENCY_PAIR, USD, REFERENCE_DATE, USD, SENSITIVITY));
}
//-------------------------------------------------------------------------
public void test_withCurrency_same() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.withCurrency(EUR);
assertEquals(test, base);
}
public void test_withCurrency_other() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.withCurrency(USD);
assertEquals(test.getCurrency(), USD);
assertEquals(test.getCurrencyPair(), CURRENCY_PAIR);
assertEquals(test.getReferenceCounterCurrency(), EUR);
assertEquals(test.getReferenceCurrency(), GBP);
assertEquals(test.getReferenceDate(), REFERENCE_DATE);
assertEquals(test.getSensitivity(), SENSITIVITY);
}
//-------------------------------------------------------------------------
public void test_withSensitivity() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.withSensitivity(13.5d);
assertEquals(test.getCurrency(), EUR);
assertEquals(test.getCurrencyPair(), CURRENCY_PAIR);
assertEquals(test.getReferenceCounterCurrency(), EUR);
assertEquals(test.getReferenceCurrency(), GBP);
assertEquals(test.getReferenceDate(), REFERENCE_DATE);
assertEquals(test.getSensitivity(), 13.5d);
}
//-------------------------------------------------------------------------
public void test_compareKey() {
FxForwardSensitivity a1 = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, EUR, SENSITIVITY);
FxForwardSensitivity a2 = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, EUR, SENSITIVITY);
FxForwardSensitivity b = FxForwardSensitivity.of(CurrencyPair.of(GBP, USD), GBP, REFERENCE_DATE, EUR, SENSITIVITY);
FxForwardSensitivity c = FxForwardSensitivity.of(CURRENCY_PAIR, EUR, REFERENCE_DATE, GBP, SENSITIVITY);
FxForwardSensitivity d = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, JPY, SENSITIVITY);
FxForwardSensitivity e = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, date(2015, 9, 27), SENSITIVITY);
ZeroRateSensitivity other = ZeroRateSensitivity.of(GBP, 2d, SENSITIVITY);
assertEquals(a1.compareKey(a2), 0);
assertEquals(a1.compareKey(b) < 0, true);
assertEquals(b.compareKey(a1) > 0, true);
assertEquals(a1.compareKey(c) < 0, true);
assertEquals(c.compareKey(a1) > 0, true);
assertEquals(a1.compareKey(d) < 0, true);
assertEquals(d.compareKey(a1) > 0, true);
assertEquals(a1.compareKey(e) > 0, true);
assertEquals(e.compareKey(a1) < 0, true);
assertEquals(a1.compareKey(other) < 0, true);
assertEquals(other.compareKey(a1) > 0, true);
}
//-------------------------------------------------------------------------
public void test_convertedTo() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
double rate = 1.4d;
FxMatrix matrix = FxMatrix.of(CurrencyPair.of(EUR, USD), rate);
FxForwardSensitivity test1 = (FxForwardSensitivity) base.convertedTo(USD, matrix);
FxForwardSensitivity expected = FxForwardSensitivity.of(
CURRENCY_PAIR, GBP, REFERENCE_DATE, USD, SENSITIVITY * rate);
assertEquals(test1, expected);
FxForwardSensitivity test2 = (FxForwardSensitivity) base.convertedTo(EUR, matrix);
assertEquals(test2, base);
}
//-------------------------------------------------------------------------
public void test_multipliedBy() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.multipliedBy(2.4d);
FxForwardSensitivity expected = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY * 2.4d);
assertEquals(test, expected);
}
//-------------------------------------------------------------------------
public void test_mapSensitivity() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.mapSensitivity(s -> 1d / s);
FxForwardSensitivity expected = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, 1d / SENSITIVITY);
assertEquals(test, expected);
}
//-------------------------------------------------------------------------
public void test_normalize() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.normalize();
assertEquals(test, base);
}
//-------------------------------------------------------------------------
public void test_combinedWith() {
FxForwardSensitivity base1 = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity base2 = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, 1.56d);
MutablePointSensitivities expected = new MutablePointSensitivities();
expected.add(base1).add(base2);
PointSensitivityBuilder test = base1.combinedWith(base2);
assertEquals(test, expected);
}
public void test_combinedWith_mutable() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
MutablePointSensitivities expected = new MutablePointSensitivities();
expected.add(base);
PointSensitivityBuilder test = base.combinedWith(new MutablePointSensitivities());
assertEquals(test, expected);
}
//-------------------------------------------------------------------------
public void test_buildInto() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
MutablePointSensitivities combo = new MutablePointSensitivities();
MutablePointSensitivities test = base.buildInto(combo);
assertSame(test, combo);
assertEquals(test.getSensitivities(), ImmutableList.of(base));
}
//-------------------------------------------------------------------------
public void test_build() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
PointSensitivities test = base.build();
assertEquals(test.getSensitivities(), ImmutableList.of(base));
}
//-------------------------------------------------------------------------
public void test_cloned() {
FxForwardSensitivity base = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
FxForwardSensitivity test = base.cloned();
assertSame(test, base);
}
//-------------------------------------------------------------------------
public void coverage() {
FxForwardSensitivity test1 = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
coverImmutableBean(test1);
FxForwardSensitivity test2 = FxForwardSensitivity.of(CurrencyPair.of(USD, JPY), JPY, date(2015, 9, 27), 4.25d);
coverBeanEquals(test1, test2);
}
public void test_serialization() {
FxForwardSensitivity test = FxForwardSensitivity.of(CURRENCY_PAIR, GBP, REFERENCE_DATE, SENSITIVITY);
assertSerialization(test);
}
}