/**
* 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 static org.testng.Assert.assertSame;
import java.util.List;
import java.util.Optional;
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.data.MarketDataName;
import com.opengamma.strata.market.curve.CurveName;
/**
* Test {@link CurrencyParameterSensitivity}.
*/
@Test
public class CurrencyParameterSensitivityTest {
private static final double FACTOR1 = 3.14;
private static final DoubleArray VECTOR_USD1 = DoubleArray.of(100, 200, 300, 123);
private static final DoubleArray VECTOR_USD2 = DoubleArray.of(150, 250, 350, 153, 550);
private static final DoubleArray VECTOR_USD_COMBINED = VECTOR_USD1.concat(VECTOR_USD2);
private static final DoubleArray VECTOR_USD_FACTOR =
DoubleArray.of(100 * FACTOR1, 200 * FACTOR1, 300 * FACTOR1, 123 * FACTOR1);
private static final DoubleArray VECTOR_EUR1 = DoubleArray.of(1000, 250, 321, 123, 321);
private static final DoubleArray VECTOR_EUR1_IN_USD =
DoubleArray.of(1000 * 1.5, 250 * 1.5, 321 * 1.5, 123 * 1.5, 321 * 1.5);
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 MarketDataName<?> NAME_COMBINED = CurveName.of("NAME_COMBINED");
private static final List<ParameterMetadata> METADATA_USD1 = ParameterMetadata.listOfEmpty(4);
private static final List<ParameterMetadata> METADATA_USD2 = ParameterMetadata.listOfEmpty(5);
private static final List<ParameterMetadata> METADATA_EUR1 = ParameterMetadata.listOfEmpty(5);
private static final List<ParameterMetadata> METADATA_BAD = ParameterMetadata.listOfEmpty(1);
private static final ImmutableList<ParameterMetadata> METADATA_COMBINED =
ImmutableList.<ParameterMetadata>builder().addAll(METADATA_USD1).addAll(METADATA_USD2).build();
private static final List<ParameterSize> PARAM_SPLIT = ImmutableList.of(ParameterSize.of(NAME1, 4), ParameterSize.of(NAME2, 5));
//-------------------------------------------------------------------------
public void test_of_metadata() {
CurrencyParameterSensitivity test = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
assertEquals(test.getMarketDataName(), NAME1);
assertEquals(test.getParameterCount(), VECTOR_USD1.size());
assertEquals(test.getParameterMetadata(), METADATA_USD1);
assertEquals(test.getParameterMetadata(0), METADATA_USD1.get(0));
assertEquals(test.getCurrency(), USD);
assertEquals(test.getSensitivity(), VECTOR_USD1);
}
public void test_of_metadata_badMetadata() {
assertThrowsIllegalArg(() -> CurrencyParameterSensitivity.of(NAME1, METADATA_BAD, USD, VECTOR_USD1));
}
public void test_of_metadataParamSplit() {
CurrencyParameterSensitivity test =
CurrencyParameterSensitivity.of(NAME_COMBINED, METADATA_COMBINED, USD, VECTOR_USD_COMBINED, PARAM_SPLIT);
assertEquals(test.getMarketDataName(), NAME_COMBINED);
assertEquals(test.getParameterCount(), VECTOR_USD_COMBINED.size());
assertEquals(test.getParameterMetadata(), METADATA_COMBINED);
assertEquals(test.getParameterMetadata(0), METADATA_COMBINED.get(0));
assertEquals(test.getSensitivity(), VECTOR_USD_COMBINED);
assertEquals(test.getParameterSplit(), Optional.of(PARAM_SPLIT));
}
public void test_of_metadataParamSplit_badSplit() {
assertThrowsIllegalArg(() -> CurrencyParameterSensitivity.of(NAME_COMBINED, METADATA_USD1, USD, VECTOR_USD1, PARAM_SPLIT));
}
public void test_combine() {
CurrencyParameterSensitivity base1 = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity base2 = CurrencyParameterSensitivity.of(NAME2, METADATA_USD2, USD, VECTOR_USD2);
CurrencyParameterSensitivity test = CurrencyParameterSensitivity.combine(NAME_COMBINED, base1, base2);
assertEquals(test.getMarketDataName(), NAME_COMBINED);
assertEquals(test.getParameterCount(), VECTOR_USD_COMBINED.size());
assertEquals(test.getParameterMetadata(), METADATA_COMBINED);
assertEquals(test.getParameterMetadata(0), METADATA_COMBINED.get(0));
assertEquals(test.getSensitivity(), VECTOR_USD_COMBINED);
assertEquals(test.getParameterSplit(), Optional.of(PARAM_SPLIT));
}
public void test_combine_arraySize0() {
assertThrowsIllegalArg(() -> CurrencyParameterSensitivity.combine(NAME_COMBINED));
}
public void test_combine_arraySize1() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
assertThrowsIllegalArg(() -> CurrencyParameterSensitivity.combine(NAME_COMBINED, base));
}
public void test_combine_duplicateNames() {
CurrencyParameterSensitivity base1 = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity base2 = CurrencyParameterSensitivity.of(NAME1, METADATA_USD2, USD, VECTOR_USD2);
assertThrowsIllegalArg(() -> CurrencyParameterSensitivity.combine(NAME_COMBINED, base1, base2));
}
//-------------------------------------------------------------------------
public void test_convertedTo() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_EUR1, EUR, VECTOR_EUR1);
CurrencyParameterSensitivity test = base.convertedTo(USD, FX_RATE);
assertEquals(test, CurrencyParameterSensitivity.of(NAME1, METADATA_EUR1, USD, VECTOR_EUR1_IN_USD));
}
public void test_convertedTo_sameCurrency() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_EUR1, EUR, VECTOR_EUR1);
CurrencyParameterSensitivity test = base.convertedTo(EUR, FX_RATE);
assertSame(test, base);
}
//-------------------------------------------------------------------------
public void test_multipliedBy() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity test = base.multipliedBy(FACTOR1);
assertEquals(test, CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD_FACTOR));
}
//-------------------------------------------------------------------------
public void test_withSensitivity() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity test = base.withSensitivity(VECTOR_USD_FACTOR);
assertEquals(test, CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD_FACTOR));
assertThrowsIllegalArg(() -> base.withSensitivity(DoubleArray.of(1d)));
}
//-------------------------------------------------------------------------
public void test_plus_array() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity test = base.plus(VECTOR_USD1);
assertEquals(test, base.multipliedBy(2));
}
public void test_plus_array_wrongSize() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
assertThrowsIllegalArg(() -> base.plus(VECTOR_USD2));
}
//-------------------------------------------------------------------------
public void test_plus_sensitivity() {
CurrencyParameterSensitivity base1 = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity test = base1.plus(base1);
assertEquals(test, base1.multipliedBy(2));
}
public void test_plus_sensitivity_wrongName() {
CurrencyParameterSensitivity base1 = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity base2 = CurrencyParameterSensitivity.of(NAME2, METADATA_USD1, USD, VECTOR_USD1);
assertThrowsIllegalArg(() -> base1.plus(base2));
}
//-------------------------------------------------------------------------
public void test_split1() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
ImmutableList<CurrencyParameterSensitivity> test = base.split();
assertEquals(test.size(), 1);
assertEquals(test.get(0), base);
}
public void test_split2() {
CurrencyParameterSensitivity base1 = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyParameterSensitivity base2 = CurrencyParameterSensitivity.of(NAME2, METADATA_USD2, USD, VECTOR_USD2);
CurrencyParameterSensitivity combined = CurrencyParameterSensitivity.combine(NAME_COMBINED, base1, base2);
ImmutableList<CurrencyParameterSensitivity> test = combined.split();
assertEquals(test.size(), 2);
assertEquals(test.get(0), base1);
assertEquals(test.get(1), base2);
}
//-------------------------------------------------------------------------
public void test_total() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
CurrencyAmount test = base.total();
assertEquals(test.getCurrency(), USD);
double expected = VECTOR_USD1.get(0) + VECTOR_USD1.get(1) + VECTOR_USD1.get(2) + VECTOR_USD1.get(3);
assertEquals(test.getAmount(), expected);
}
//-------------------------------------------------------------------------
public void test_toUnitParameterSensitivity() {
CurrencyParameterSensitivity base = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
UnitParameterSensitivity test = base.toUnitParameterSensitivity();
assertEquals(test, UnitParameterSensitivity.of(NAME1, METADATA_USD1, VECTOR_USD1));
}
//-------------------------------------------------------------------------
public void coverage() {
CurrencyParameterSensitivity test = CurrencyParameterSensitivity.of(NAME1, METADATA_USD1, USD, VECTOR_USD1);
coverImmutableBean(test);
CurrencyParameterSensitivity test2 = CurrencyParameterSensitivity.of(NAME2, METADATA_EUR1, EUR, VECTOR_EUR1);
coverBeanEquals(test, test2);
}
}