/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.market.param;
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 org.testng.Assert.assertEquals;
import java.util.List;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.basics.currency.FxRate;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.collect.array.DoubleMatrix;
import com.opengamma.strata.collect.tuple.Pair;
import com.opengamma.strata.data.MarketDataName;
import com.opengamma.strata.market.curve.CurveName;
/**
* Test {@link CrossGammaParameterSensitivity}.
*/
@Test
public class CrossGammaParameterSensitivityTest {
private static final double FACTOR1 = 3.14;
private static final DoubleMatrix MATRIX_USD1 = DoubleMatrix.of(2, 2, 100, 200, 300, 123);
private static final DoubleMatrix MATRIX_USD_FACTOR =
DoubleMatrix.of(2, 2, 100 * FACTOR1, 200 * FACTOR1, 300 * FACTOR1, 123 * FACTOR1);
private static final DoubleMatrix MATRIX_EUR1 = DoubleMatrix.of(2, 2, 1000, 250, 321, 123);
private static final DoubleMatrix MATRIX_EUR1_IN_USD =
DoubleMatrix.of(2, 2, 1000 * 1.5, 250 * 1.5, 321 * 1.5, 123 * 1.5);
private static final DoubleMatrix MATRIX_USD_EUR = DoubleMatrix.of(2, 4, 100, 200, 1000, 250, 300, 123, 321, 123);
private static final Currency USD = Currency.USD;
private static final Currency EUR = Currency.EUR;
private static final FxRate FX_RATE = FxRate.of(EUR, USD, 1.5d);
private static final MarketDataName<?> NAME1 = CurveName.of("NAME-1");
private static final MarketDataName<?> NAME2 = CurveName.of("NAME-2");
private static final List<ParameterMetadata> METADATA_USD1 = ParameterMetadata.listOfEmpty(2);
private static final List<ParameterMetadata> METADATA_EUR1 = ParameterMetadata.listOfEmpty(2);
private static final List<ParameterMetadata> METADATA_BAD = ParameterMetadata.listOfEmpty(1);
//-------------------------------------------------------------------------
public void test_of_metadata() {
CrossGammaParameterSensitivity test = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
assertEquals(test.getMarketDataName(), NAME1);
assertEquals(test.getParameterCount(), 2);
assertEquals(test.getParameterMetadata(), METADATA_USD1);
assertEquals(test.getParameterMetadata(0), METADATA_USD1.get(0));
assertEquals(test.getCurrency(), USD);
assertEquals(test.getSensitivity(), MATRIX_USD1);
assertEquals(test.getOrder(), ImmutableList.of(Pair.of(NAME1, METADATA_USD1)));
}
public void test_of_eurUsd() {
CrossGammaParameterSensitivity test = CrossGammaParameterSensitivity.of(
NAME1, METADATA_USD1, ImmutableList.of(Pair.of(NAME1, METADATA_USD1), Pair.of(NAME2, METADATA_EUR1)), USD,
MATRIX_USD_EUR);
assertEquals(test.getMarketDataName(), NAME1);
assertEquals(test.getParameterCount(), 2);
assertEquals(test.getParameterMetadata(), METADATA_USD1);
assertEquals(test.getParameterMetadata(0), METADATA_USD1.get(0));
assertEquals(test.getCurrency(), USD);
assertEquals(test.getSensitivity(), MATRIX_USD_EUR);
assertEquals(test.getOrder(), ImmutableList.of(Pair.of(NAME1, METADATA_USD1), Pair.of(NAME2, METADATA_EUR1)));
}
public void test_of_metadata_badMetadata() {
assertThrowsIllegalArg(() -> CrossGammaParameterSensitivity.of(NAME1, METADATA_BAD, USD, MATRIX_USD1));
}
//-------------------------------------------------------------------------
public void test_convertedTo() {
CrossGammaParameterSensitivity base = CrossGammaParameterSensitivity.of(NAME1, METADATA_EUR1, EUR, MATRIX_EUR1);
CrossGammaParameterSensitivity test = base.convertedTo(USD, FX_RATE);
assertEquals(base.convertedTo(EUR, FX_RATE), base);
assertEquals(test, CrossGammaParameterSensitivity.of(NAME1, METADATA_EUR1, USD, MATRIX_EUR1_IN_USD));
}
//-------------------------------------------------------------------------
public void test_multipliedBy() {
CrossGammaParameterSensitivity base = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
CrossGammaParameterSensitivity test = base.multipliedBy(FACTOR1);
assertEquals(test, CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD_FACTOR));
}
//-------------------------------------------------------------------------
public void test_withSensitivity() {
CrossGammaParameterSensitivity base = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
CrossGammaParameterSensitivity test = base.withSensitivity(MATRIX_USD_FACTOR);
assertEquals(test, CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD_FACTOR));
assertThrowsIllegalArg(() -> base.withSensitivity(DoubleMatrix.of(1, 1, 1d)));
}
//-------------------------------------------------------------------------
public void test_total() {
CrossGammaParameterSensitivity base = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
CurrencyAmount test = base.total();
assertEquals(test.getCurrency(), USD);
double expected = MATRIX_USD1.get(0, 0) + MATRIX_USD1.get(0, 1) + MATRIX_USD1.get(1, 0) + MATRIX_USD1.get(1, 1);
assertEquals(test.getAmount(), expected);
}
public void test_diagonal() {
CrossGammaParameterSensitivity base = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
CurrencyParameterSensitivity test = base.diagonal();
DoubleArray value = DoubleArray.of(MATRIX_USD1.get(0, 0), MATRIX_USD1.get(1, 1));
assertEquals(test, CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, value));
}
public void test_diagonal_eurUsd() {
CrossGammaParameterSensitivity base = CrossGammaParameterSensitivity.of(
NAME1, METADATA_USD1, ImmutableList.of(Pair.of(NAME1, METADATA_USD1), Pair.of(NAME2, METADATA_EUR1)), USD,
MATRIX_USD_EUR);
CurrencyParameterSensitivity test = base.diagonal();
DoubleArray value = DoubleArray.of(MATRIX_USD1.get(0, 0), MATRIX_USD1.get(1, 1));
assertEquals(test, CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, value));
}
public void test_getSensitivity_eurUsd() {
CrossGammaParameterSensitivity test = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1,
ImmutableList.of(Pair.of(NAME1, METADATA_USD1), Pair.of(NAME2, METADATA_EUR1)), USD, MATRIX_USD_EUR);
CrossGammaParameterSensitivity expected1 = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
assertEquals(test.getSensitivity(NAME1), expected1);
CrossGammaParameterSensitivity expected2 =
CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, NAME2, METADATA_EUR1, USD, MATRIX_EUR1);
assertEquals(test.getSensitivity(NAME2), expected2);
assertThrowsIllegalArg(() -> test.getSensitivity(CurveName.of("NAME-3")));
}
//-------------------------------------------------------------------------
public void coverage() {
CrossGammaParameterSensitivity test = CrossGammaParameterSensitivity.of(NAME1, METADATA_USD1, USD, MATRIX_USD1);
coverImmutableBean(test);
CrossGammaParameterSensitivity test2 = CrossGammaParameterSensitivity.of(NAME2, METADATA_EUR1, EUR, MATRIX_EUR1);
coverBeanEquals(test, test2);
}
}