/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.description;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.instrument.index.IndexIborMaster;
import com.opengamma.analytics.financial.instrument.index.IndexPrice;
import com.opengamma.analytics.financial.model.interestrate.curve.PriceIndexCurveSimple;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve;
import com.opengamma.analytics.financial.provider.description.inflation.InflationProviderForward;
import com.opengamma.analytics.math.curve.ConstantDoublesCurve;
import com.opengamma.analytics.math.curve.DoublesCurve;
import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve;
import com.opengamma.analytics.math.interpolation.CombinedInterpolatorExtrapolatorFactory;
import com.opengamma.analytics.math.interpolation.Interpolator1D;
import com.opengamma.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
/**
* Tests related to the Market bundle with forward provided directly my forward curves.
*/
@Test(groups = TestGroup.UNIT)
public class CurveForwardProviderTest {
private static final Interpolator1D LINEAR_FLAT = CombinedInterpolatorExtrapolatorFactory.getInterpolator(Interpolator1DFactory.LINEAR, Interpolator1DFactory.FLAT_EXTRAPOLATOR,
Interpolator1DFactory.FLAT_EXTRAPOLATOR);
private static final InflationProviderForward MARKET_1 = new InflationProviderForward();
private static final YieldAndDiscountCurve CURVE_50 = YieldCurve.from(ConstantDoublesCurve.from(0.0500));
private static final YieldAndDiscountCurve CURVE_45 = YieldCurve.from(ConstantDoublesCurve.from(0.0450));
private static final DoublesCurve CURVE_INT_1 = InterpolatedDoublesCurve.from(new double[] {0.0, 0.5, 1.0 }, new double[] {0.01, 0.02, 0.01 }, LINEAR_FLAT);;
private static final DoublesCurve CURVE_35 = ConstantDoublesCurve.from(0.0350);
private static final DoublesCurve CURVE_30 = ConstantDoublesCurve.from(0.0300);
private static final IborIndex EURIBOR_3M = IndexIborMaster.getInstance().getIndex("EURIBOR3M");
private static final IborIndex EURIBOR_6M = IndexIborMaster.getInstance().getIndex("EURIBOR6M");
private static final IborIndex USDLIBOR_3M = IndexIborMaster.getInstance().getIndex("USDLIBOR3M");
private static final String NAME_EUR_PRICE_INDEX = "Euro HICP x";
private static final IndexPrice PRICE_INDEX_EUR = new IndexPrice(NAME_EUR_PRICE_INDEX, Currency.EUR);
private static double[] INDEX_VALUE = new double[] {108.23, 108.64, 111.0, 119.0, 129.0, 149.0 };
private static double[] TIME_VALUE = new double[] {-3.0 / 12.0, -2.0 / 12.0, 9.0 / 12.0, 4.0 + 9.0 / 12.0, 9.0 + 9.0 / 12.0, 19.0 + 9.0 / 12.0 };
private static final InterpolatedDoublesCurve CURVE_HICP = InterpolatedDoublesCurve.from(TIME_VALUE, INDEX_VALUE, LINEAR_FLAT);
private static final PriceIndexCurveSimple PRICE_INDEX_HICP_CURVE = new PriceIndexCurveSimple(CURVE_HICP);
static {
MARKET_1.setCurve(Currency.EUR, CURVE_50);
MARKET_1.setCurve(Currency.USD, CURVE_45);
MARKET_1.setCurve(EURIBOR_3M, CURVE_INT_1);
MARKET_1.setCurve(EURIBOR_6M, CURVE_35);
MARKET_1.setCurve(USDLIBOR_3M, CURVE_30);
MARKET_1.setCurve(PRICE_INDEX_EUR, PRICE_INDEX_HICP_CURVE);
}
private static final double TOLERANCE_RATE = 1.0E-8;
@Test(expectedExceptions = IllegalArgumentException.class)
public void setExisitingDscCurve() {
MARKET_1.setCurve(Currency.EUR, CURVE_50);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void setExisitingFwdCurve() {
MARKET_1.setCurve(EURIBOR_3M, CURVE_INT_1);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void setExisitingPriceCurve() {
MARKET_1.setCurve(PRICE_INDEX_EUR, PRICE_INDEX_HICP_CURVE);
}
@Test
public void setterGetter() {
assertEquals("Market: getter", CURVE_50, MARKET_1.getCurve(Currency.EUR));
assertEquals("Market: getter", CURVE_45, MARKET_1.getCurve(Currency.USD));
assertEquals("Market: getter", CURVE_INT_1, MARKET_1.getCurve(EURIBOR_3M));
assertEquals("Market: getter", CURVE_35, MARKET_1.getCurve(EURIBOR_6M));
assertEquals("Market: getter", CURVE_30, MARKET_1.getCurve(USDLIBOR_3M));
assertEquals("Market: getter", PRICE_INDEX_HICP_CURVE, MARKET_1.getCurve(PRICE_INDEX_EUR));
}
@Test
public void forwardRate() {
final double[] time = new double[] {0.0, 0.75, 2.50 };
for (final double element : time) {
assertEquals("MarketForward: forward rate", CURVE_INT_1.getYValue(element), MARKET_1.getForwardRate(EURIBOR_3M, element, element + 0.25, 0.25), TOLERANCE_RATE);
}
}
}