/** * 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.provider.sensitivity.inflation.InflationSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity; import com.opengamma.analytics.financial.provider.sensitivity.multicurve.SimplyCompoundedForwardSensitivity; import com.opengamma.analytics.financial.util.AssertSensitivityObjects; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.DoublesPair; /** * Class to test the PresentValueSensitivity class. */ @Test(groups = TestGroup.UNIT) public class InflationSensitivityTest { 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 double TOLERANCE = 1.0E-10; @Test(expectedExceptions = IllegalArgumentException.class) public void nullDsc1() { InflationSensitivity.of(null, new HashMap<String, List<ForwardSensitivity>>(), new HashMap<String, List<DoublesPair>>()); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullFwd1() { InflationSensitivity.of(new HashMap<String, List<DoublesPair>>(), null, new HashMap<String, List<DoublesPair>>()); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullPrice1() { InflationSensitivity.of(new HashMap<String, List<DoublesPair>>(), new HashMap<String, List<ForwardSensitivity>>(), null); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullDsc2() { InflationSensitivity.ofYieldDiscountingAndPriceIndex(null, new HashMap<String, List<DoublesPair>>()); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullPrice2() { InflationSensitivity.ofYieldDiscountingAndPriceIndex(new HashMap<String, List<DoublesPair>>(), null); } @Test public void of() { final Map<String, List<DoublesPair>> mapDsc = new HashMap<>(); mapDsc.put(CURVE_NAME_1, SENSI_DATA_1); final Map<String, List<ForwardSensitivity>> mapFwd = new HashMap<>(); mapFwd.put(CURVE_NAME_2, SENSI_FWD_1); final Map<String, List<DoublesPair>> mapIn = new HashMap<>(); mapIn.put(CURVE_NAME_3, SENSI_DATA_3); final InflationSensitivity of = InflationSensitivity.of(mapDsc, mapFwd, mapIn); assertEquals("InflationSensitivity: of", mapDsc, of.getYieldDiscountingSensitivities()); assertEquals("InflationSensitivity: of", mapFwd, of.getForwardSensitivities()); assertEquals("InflationSensitivity: of", mapIn, of.getPriceCurveSensitivities()); final InflationSensitivity ofDscIn = InflationSensitivity.ofYieldDiscountingAndPriceIndex(mapDsc, mapIn); assertEquals("InflationSensitivity: of", mapDsc, ofDscIn.getYieldDiscountingSensitivities()); assertEquals("InflationSensitivity: of", mapIn, ofDscIn.getPriceCurveSensitivities()); AssertSensitivityObjects.assertEquals("InflationSensitivity: of", InflationSensitivity.of(mapDsc, new HashMap<String, List<ForwardSensitivity>>(), mapIn), ofDscIn, TOLERANCE); final InflationSensitivity ofFwd = InflationSensitivity.of(new HashMap<String, List<DoublesPair>>(), mapFwd, new HashMap<String, List<DoublesPair>>()); InflationSensitivity constructor = new InflationSensitivity(); constructor = constructor.plus(ofDscIn); constructor = constructor.plus(ofFwd).cleaned(); AssertSensitivityObjects.assertEquals("InflationSensitivity: of", constructor, of.cleaned(), TOLERANCE); } @Test public void plusMultipliedByDsc() { final Map<String, List<DoublesPair>> sensi11 = new HashMap<>(); final Map<String, List<DoublesPair>> sensi12 = new HashMap<>(); final Map<String, List<DoublesPair>> sensi22 = new HashMap<>(); final Map<String, List<DoublesPair>> sensi33 = new HashMap<>(); sensi11.put(CURVE_NAME_1, SENSI_DATA_1); final InflationSensitivity pvSensi_11 = InflationSensitivity.ofYieldDiscounting(sensi11); sensi22.put(CURVE_NAME_2, SENSI_DATA_2); final InflationSensitivity pvSensi_22 = InflationSensitivity.ofYieldDiscounting(sensi22); sensi12.put(CURVE_NAME_1, SENSI_DATA_2); final InflationSensitivity pvSensi_12 = InflationSensitivity.ofYieldDiscounting(sensi12); sensi33.put(CURVE_NAME_3, SENSI_DATA_3); final InflationSensitivity pvSensi_33 = InflationSensitivity.ofYieldDiscounting(sensi33); // Simple add final Map<String, List<DoublesPair>> expectedSensi11add22 = new HashMap<>(); expectedSensi11add22.put(CURVE_NAME_1, SENSI_DATA_1); expectedSensi11add22.put(CURVE_NAME_2, SENSI_DATA_2); assertEquals(expectedSensi11add22, pvSensi_11.plus(pvSensi_22).getYieldDiscountingSensitivities()); assertEquals(InflationSensitivity.ofYieldDiscounting(expectedSensi11add22), pvSensi_11.plus(pvSensi_22)); // Multiply final List<DoublesPair> sensiData1Multiply050 = Arrays.asList(new DoublesPair[] {DoublesPair.of(1d, 5.0d), DoublesPair.of(2d, 10.0d), DoublesPair.of(3d, 15.0d), DoublesPair.of(4d, 20.0d) }); final Map<String, List<DoublesPair>> expectedSensi1Multiply05 = new HashMap<>(); expectedSensi1Multiply05.put(CURVE_NAME_1, sensiData1Multiply050); assertEquals(expectedSensi1Multiply05, pvSensi_11.multipliedBy(0.5).getYieldDiscountingSensitivities()); assertEquals(InflationSensitivity.ofYieldDiscounting(expectedSensi1Multiply05), pvSensi_11.multipliedBy(0.5)); // Add on the same curve final List<DoublesPair> expectedSensiData1add2 = new ArrayList<>(); expectedSensiData1add2.addAll(SENSI_DATA_1); expectedSensiData1add2.addAll(SENSI_DATA_2); final Map<String, List<DoublesPair>> expectedSensi11add12 = new HashMap<>(); expectedSensi11add12.put(CURVE_NAME_1, expectedSensiData1add2); assertEquals(expectedSensi11add12, pvSensi_11.plus(pvSensi_12).getYieldDiscountingSensitivities()); assertEquals(InflationSensitivity.ofYieldDiscounting(expectedSensi11add12), pvSensi_11.plus(pvSensi_12)); // Add multi-curve final Map<String, List<DoublesPair>> expectedSensiAddMulti = new HashMap<>(); expectedSensiAddMulti.put(CURVE_NAME_1, expectedSensiData1add2); expectedSensiAddMulti.put(CURVE_NAME_2, SENSI_DATA_2); expectedSensiAddMulti.put(CURVE_NAME_3, SENSI_DATA_3); assertEquals(expectedSensiAddMulti, pvSensi_11.plus(pvSensi_22.plus(pvSensi_33.plus(pvSensi_12))).getYieldDiscountingSensitivities()); assertEquals(InflationSensitivity.ofYieldDiscounting(expectedSensiAddMulti), pvSensi_11.plus(pvSensi_22.plus(pvSensi_33.plus(pvSensi_12)))); } @Test public void plusMultipliedByDscIn() { final Map<String, List<DoublesPair>> sensi11 = new HashMap<>(); sensi11.put(CURVE_NAME_1, SENSI_DATA_1); final Map<String, List<DoublesPair>> sensi22 = new HashMap<>(); sensi22.put(CURVE_NAME_2, SENSI_DATA_2); final InflationSensitivity pvSensiDscIn = InflationSensitivity.ofYieldDiscountingAndPriceIndex(sensi11, sensi22); AssertSensitivityObjects.assertEquals("CurveSensitivityMarket: plusMultipliedBy", pvSensiDscIn.plus(pvSensiDscIn).cleaned(), pvSensiDscIn.multipliedBy(2.0).cleaned(), TOLERANCE); } @Test public void cleaned() { final Map<String, List<DoublesPair>> sensi11 = new HashMap<>(); final Map<String, List<DoublesPair>> sensi12 = new HashMap<>(); sensi11.put(CURVE_NAME_1, SENSI_DATA_1); final InflationSensitivity pvSensi_11 = InflationSensitivity.ofYieldDiscounting(sensi11); sensi12.put(CURVE_NAME_1, SENSI_DATA_2); final InflationSensitivity pvSensi_12 = InflationSensitivity.ofYieldDiscounting(sensi12); final List<DoublesPair> expectedSensiDataClean12 = Arrays.asList(new DoublesPair[] {DoublesPair.of(1d, 50d), DoublesPair.of(2d, 50d), DoublesPair.of(3d, 50d), DoublesPair.of(4d, 50d) }); final Map<String, List<DoublesPair>> expectedSensiClean12 = new HashMap<>(); expectedSensiClean12.put(CURVE_NAME_1, expectedSensiDataClean12); assertEquals(InflationSensitivity.ofYieldDiscounting(expectedSensiClean12).getYieldDiscountingSensitivities(), pvSensi_11.plus(pvSensi_12).cleaned().getYieldDiscountingSensitivities()); } @Test public void equalHash() { final Map<String, List<DoublesPair>> mapDsc = new HashMap<>(); mapDsc.put(CURVE_NAME_1, SENSI_DATA_1); final Map<String, List<ForwardSensitivity>> mapFwd = new HashMap<>(); mapFwd.put(CURVE_NAME_2, SENSI_FWD_1); final Map<String, List<DoublesPair>> mapIn = new HashMap<>(); mapIn.put(CURVE_NAME_3, SENSI_DATA_3); final InflationSensitivity cs = InflationSensitivity.of(mapDsc, mapFwd, mapIn); assertEquals("ParameterSensitivity: equalHash", cs, cs); assertEquals("ParameterSensitivity: equalHash", cs.hashCode(), cs.hashCode()); assertFalse("ParameterSensitivity: equalHash", cs.equals(mapDsc)); InflationSensitivity modified; modified = InflationSensitivity.of(mapDsc, mapFwd, mapDsc); assertFalse("ParameterSensitivity: equalHash", cs.equals(modified)); modified = InflationSensitivity.of(mapIn, mapFwd, mapIn); assertFalse("ParameterSensitivity: equalHash", cs.equals(modified)); final Map<String, List<ForwardSensitivity>> mapFwd2 = new HashMap<>(); mapFwd2.put(CURVE_NAME_3, SENSI_FWD_1); modified = InflationSensitivity.of(mapDsc, mapFwd2, mapIn); assertFalse("ParameterSensitivity: equalHash", cs.equals(modified)); } }