/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.instrument.index;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.forex.method.FXMatrix;
import com.opengamma.analytics.financial.instrument.swap.SwapDefinition;
import com.opengamma.analytics.financial.instrument.swap.SwapXCcyIborIborDefinition;
import com.opengamma.analytics.financial.schedule.ScheduleCalculator;
import com.opengamma.financial.convention.businessday.BusinessDayConventions;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Test related to cross-currency Ibor/Ibor swap generators.
*/
@Test(groups = TestGroup.UNIT)
public class GeneratorSwapXCcyIborIborTest {
private static final Calendar NYC = new MondayToFridayCalendar("NYC");
private static final Calendar TARGET = new MondayToFridayCalendar("TARGET");
private static final IndexIborMaster IBOR_MASTER = IndexIborMaster.getInstance();
private static final GeneratorLegIborMaster MASTER_LEG_IBOR = GeneratorLegIborMaster.getInstance();
private static final IborIndex USDLIBOR3M = IBOR_MASTER.getIndex("USDLIBOR3M");
private static final IborIndex EURIBOR3M = IBOR_MASTER.getIndex("EURIBOR3M");
private static final GeneratorSwapXCcyIborIbor EURIBOR3MUSDLIBOR3M =
new GeneratorSwapXCcyIborIbor("EURIBOR3MUSDLIBOR3M", EURIBOR3M, USDLIBOR3M, TARGET, NYC);
private static final GeneratorLegIbor LEG_EUREURIBOR3M = MASTER_LEG_IBOR.getGenerator("EUREURIBOR3M_X", TARGET);
private static final GeneratorLegIbor LEG_USDLIBOR3M = MASTER_LEG_IBOR.getGenerator("USDLIBOR3M_X", NYC);
private static final GeneratorSwapCrossCurrency EURIBOR3MUSDLIBOR3M_2 =
new GeneratorSwapCrossCurrency("EURIBOR3MUSDLIBOR3M_2", LEG_EUREURIBOR3M, LEG_USDLIBOR3M);
@Test
/**
* Tests the getter for the swap generator.
*/
public void getter() {
assertEquals("GeneratorSwapIborIbor: getter", EURIBOR3M, EURIBOR3MUSDLIBOR3M.getIborIndex1());
assertEquals("GeneratorSwapIborIbor: getter", USDLIBOR3M, EURIBOR3MUSDLIBOR3M.getIborIndex2());
assertTrue("GeneratorSwapIborIbor: getter", EURIBOR3MUSDLIBOR3M.getName().equals("EURIBOR3MUSDLIBOR3M"));
assertEquals("GeneratorSwapIborIbor: getter", EURIBOR3M.getBusinessDayConvention(),
EURIBOR3MUSDLIBOR3M.getBusinessDayConvention());
assertEquals("GeneratorSwapIborIbor: getter", EURIBOR3M.getSpotLag(), EURIBOR3MUSDLIBOR3M.getSpotLag());
assertTrue("GeneratorSwapIborIbor: getter", EURIBOR3M.isEndOfMonth() == EURIBOR3MUSDLIBOR3M.isEndOfMonth());
}
@Test
/**
* Tests the constructor with business day convention and end-of-month.
*/
public void constructor() {
final GeneratorSwapXCcyIborIbor generator2 = new GeneratorSwapXCcyIborIbor("Generator 2", EURIBOR3M, USDLIBOR3M,
BusinessDayConventions.FOLLOWING, false, 1, NYC, NYC);
assertEquals("GeneratorSwapIborIbor: getter", EURIBOR3M, EURIBOR3MUSDLIBOR3M.getIborIndex1());
assertEquals("GeneratorSwapIborIbor: getter", USDLIBOR3M, EURIBOR3MUSDLIBOR3M.getIborIndex2());
assertTrue("GeneratorSwapIborIbor: getter", generator2.getName().equals("Generator 2"));
assertEquals("GeneratorSwapIborIbor: getter", BusinessDayConventions.FOLLOWING, generator2.getBusinessDayConvention());
assertTrue("GeneratorSwapIborIbor: getter", generator2.isEndOfMonth() == false);
assertEquals("GeneratorSwapIborIbor: getter", generator2.getSpotLag(), 1);
}
@Test
public void generateInstrument() {
final ZonedDateTime referenceDate = DateUtils.getUTCDate(2012, 7, 17);
final Period tenor = Period.ofMonths(6);
final double spread = -0.0050;
final double notional = 12345;
final double fxRateEURUSD = 1.25;
final FXMatrix fxMatrix = new FXMatrix(EURIBOR3M.getCurrency(), USDLIBOR3M.getCurrency(), fxRateEURUSD);
final GeneratorAttributeFX attribute = new GeneratorAttributeFX(tenor, fxMatrix);
final SwapXCcyIborIborDefinition insGenerated = EURIBOR3MUSDLIBOR3M.generateInstrument(referenceDate,
spread, notional, attribute);
final ZonedDateTime settleDate = ScheduleCalculator.getAdjustedDate(referenceDate, EURIBOR3MUSDLIBOR3M.getSpotLag(), NYC);
final SwapXCcyIborIborDefinition insExpected = SwapXCcyIborIborDefinition.from(settleDate, tenor,
EURIBOR3MUSDLIBOR3M, notional, notional * fxRateEURUSD, spread, true, NYC, NYC);
assertEquals("GeneratorSwap: generate instrument", insExpected, insGenerated);
final SwapDefinition insGenerated2 = EURIBOR3MUSDLIBOR3M_2.generateInstrument(referenceDate,
spread, -notional, attribute);
assertEquals("GeneratorSwap: generate instrument", insExpected.getFirstLeg(), insGenerated2.getFirstLeg());
assertEquals("GeneratorSwap: generate instrument", insExpected.getSecondLeg(), insGenerated2.getSecondLeg());
}
}