/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.provider.sensitivity; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.testng.annotations.Test; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.analytics.financial.interestrate.InterestRateCurveSensitivityUtils; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MulticurveSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.SimplyCompoundedForwardSensitivity; import com.opengamma.analytics.financial.util.AssertSensitivityObjects; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.DoublesPair; /** * Tests the MultipleCurrencyCurveSensitivityMarket class. */ @Test(groups = TestGroup.UNIT) public class MultipleCurrencyMulticurveSensitivityTest { private static final List<DoublesPair> SENSI_DATA_1 = Arrays.asList(new DoublesPair[] {DoublesPair.of(1d, 10d), DoublesPair.of(2d, 20d), DoublesPair.of(3d, 30d), DoublesPair.of(4d, 40d) }); private static final List<DoublesPair> SENSI_DATA_2 = Arrays.asList(new DoublesPair[] {DoublesPair.of(1d, 40d), DoublesPair.of(2d, 30d), DoublesPair.of(3d, 20d), DoublesPair.of(4d, 10d) }); private static final List<DoublesPair> SENSI_DATA_3 = Arrays.asList(new DoublesPair[] {DoublesPair.of(11d, 40d), DoublesPair.of(12d, 30d), DoublesPair.of(13d, 20d), DoublesPair.of(14d, 10d) }); private static final List<ForwardSensitivity> SENSI_FWD_1 = new ArrayList<>(); static { SENSI_FWD_1.add(new SimplyCompoundedForwardSensitivity(0.5, 0.75, 0.26, 11)); SENSI_FWD_1.add(new SimplyCompoundedForwardSensitivity(0.75, 1.00, 0.26, 12)); SENSI_FWD_1.add(new SimplyCompoundedForwardSensitivity(1.00, 1.25, 0.24, 13)); } private static final String CURVE_NAME_1 = "A"; private static final String CURVE_NAME_2 = "B"; private static final String CURVE_NAME_3 = "C"; private static final Map<String, List<DoublesPair>> SENSI_11 = new HashMap<>(); private static final Map<String, List<DoublesPair>> SENSI_12 = new HashMap<>(); private static final Map<String, List<DoublesPair>> SENSI_22 = new HashMap<>(); private static final Map<String, List<DoublesPair>> SENSI_33 = new HashMap<>(); private static final Map<String, List<ForwardSensitivity>> SENSI_FWD_11 = new HashMap<>(); static { SENSI_11.put(CURVE_NAME_1, SENSI_DATA_1); SENSI_22.put(CURVE_NAME_2, SENSI_DATA_2); SENSI_12.put(CURVE_NAME_1, SENSI_DATA_2); SENSI_33.put(CURVE_NAME_3, SENSI_DATA_3); SENSI_FWD_11.put(CURVE_NAME_2, SENSI_FWD_1); } private static final double TOLERANCE = 1.0E-10; @Test(expectedExceptions = IllegalArgumentException.class) public void nullCcy() { MultipleCurrencyMulticurveSensitivity.of(null, new MulticurveSensitivity()); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullSensi() { MultipleCurrencyMulticurveSensitivity.of(Currency.AUD, null); } @Test public void of() { final MulticurveSensitivity cs = MulticurveSensitivity.of(SENSI_11, SENSI_FWD_11); final Currency ccy1 = Currency.AUD; final MultipleCurrencyMulticurveSensitivity mcs = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs); assertEquals("MultipleCurrencyCurveSensitivityMarket: of", cs, mcs.getSensitivity(ccy1)); MultipleCurrencyMulticurveSensitivity constructor = new MultipleCurrencyMulticurveSensitivity(); constructor = constructor.plus(ccy1, cs); AssertSensitivityObjects.assertEquals("MultipleCurrencyCurveSensitivityMarket: of", mcs.cleaned(), constructor.cleaned(), TOLERANCE); AssertSensitivityObjects.assertEquals("MultipleCurrencyCurveSensitivityMarket: getSensitivity", new MulticurveSensitivity(), mcs.getSensitivity(Currency.CAD), TOLERANCE); } @Test public void plusMultipliedBy() { final Currency ccy1 = Currency.AUD; final Currency ccy2 = Currency.CAD; final MulticurveSensitivity cs = MulticurveSensitivity.of(SENSI_11, SENSI_FWD_11); MultipleCurrencyMulticurveSensitivity mcs = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs); final MulticurveSensitivity cs2 = MulticurveSensitivity.ofYieldDiscounting(SENSI_22); final MultipleCurrencyMulticurveSensitivity mcs2 = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs2); final MultipleCurrencyMulticurveSensitivity mcs3 = mcs.plus(mcs2); final Map<String, List<DoublesPair>> sum = InterestRateCurveSensitivityUtils.addSensitivity(SENSI_11, SENSI_22); final MultipleCurrencyMulticurveSensitivity mcs3Expected = MultipleCurrencyMulticurveSensitivity.of(ccy1, MulticurveSensitivity.of(sum, SENSI_FWD_11)); AssertSensitivityObjects.assertEquals("", mcs3Expected.cleaned(), mcs3.cleaned(), TOLERANCE); mcs = mcs.plus(ccy2, cs); assertEquals("MultipleCurrencyCurveSensitivityMarket: plusMultipliedBy", cs, mcs.getSensitivity(ccy1)); assertEquals("MultipleCurrencyCurveSensitivityMarket: plusMultipliedBy", cs, mcs.getSensitivity(ccy2)); AssertSensitivityObjects.assertEquals("", mcs.plus(mcs).cleaned(), mcs.multipliedBy(2.0).cleaned(), TOLERANCE); } @Test public void cleaned() { final Currency ccy1 = Currency.AUD; final Currency ccy2 = Currency.CAD; final MulticurveSensitivity cs1 = MulticurveSensitivity.of(SENSI_11, SENSI_FWD_11); final MulticurveSensitivity cs2 = MulticurveSensitivity.of(SENSI_22, SENSI_FWD_11); MultipleCurrencyMulticurveSensitivity mcs1 = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs1); mcs1 = mcs1.plus(ccy2, cs2); MultipleCurrencyMulticurveSensitivity mcs2 = MultipleCurrencyMulticurveSensitivity.of(ccy2, cs2); mcs2 = mcs2.plus(ccy1, cs1); AssertSensitivityObjects.assertEquals("MultipleCurrencyCurveSensitivityMarket: cleaned", mcs1.cleaned(), mcs2.cleaned(), TOLERANCE); } @Test public void converted() { final Currency ccy1 = Currency.EUR; final Currency ccy2 = Currency.USD; final FXMatrix fxMatrix = new FXMatrix(ccy1, ccy2, 1.25); final MulticurveSensitivity cs = MulticurveSensitivity.of(SENSI_11, SENSI_FWD_11); final MultipleCurrencyMulticurveSensitivity mcs = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs); final MultipleCurrencyMulticurveSensitivity mcsConverted = mcs.converted(ccy2, fxMatrix); final MultipleCurrencyMulticurveSensitivity mcsExpected = MultipleCurrencyMulticurveSensitivity.of(ccy2, cs.multipliedBy(fxMatrix.getFxRate(ccy1, ccy2))); AssertSensitivityObjects.assertEquals("MultipleCurrencyCurveSensitivityMarket: converted", mcsExpected.cleaned(), mcsConverted.cleaned(), TOLERANCE); } @Test public void equalHash() { final Currency ccy1 = Currency.EUR; final Currency ccy2 = Currency.USD; final MulticurveSensitivity cs = MulticurveSensitivity.of(SENSI_11, SENSI_FWD_11); final MultipleCurrencyMulticurveSensitivity mcs = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs); assertEquals("MultipleCurrencyCurveSensitivityMarket: equalHash", mcs, mcs); assertEquals("MultipleCurrencyCurveSensitivityMarket: equalHash", mcs.hashCode(), mcs.hashCode()); assertFalse("MultipleCurrencyCurveSensitivityMarket: equalHash", mcs.equals(null)); assertFalse("MultipleCurrencyCurveSensitivityMarket: equalHash", mcs.equals(SENSI_11)); final MultipleCurrencyMulticurveSensitivity other = MultipleCurrencyMulticurveSensitivity.of(ccy1, cs); assertEquals("MultipleCurrencyCurveSensitivityMarket: equalHash", mcs, other); MultipleCurrencyMulticurveSensitivity modified; modified = MultipleCurrencyMulticurveSensitivity.of(ccy2, cs); assertFalse("MultipleCurrencyCurveSensitivityMarket: equalHash", mcs.equals(modified)); } }