/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.provider.calculator.generic; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import org.testng.annotations.Test; import org.threeten.bp.Period; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.datasets.CalendarTarget; import com.opengamma.analytics.financial.instrument.index.GeneratorAttributeIR; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIbor; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedIborMaster; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapIborIbor; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapIborIborMaster; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.swap.SwapDefinition; import com.opengamma.analytics.financial.instrument.swap.SwapFixedIborDefinition; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIbor; import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.util.time.DateUtils; /** * Test related to the last time calculator for the times related to a specific index. */ public class LastFixingTimeIndexCalculatorTest { /** Generators */ private static final Calendar TARGET = new CalendarTarget("TARGET"); private static final GeneratorSwapFixedIborMaster GENERATOR_SWAP_MASTER = GeneratorSwapFixedIborMaster.getInstance(); private static final GeneratorSwapFixedIbor EUR1YEURIBOR3M = GENERATOR_SWAP_MASTER.getGenerator("EUR1YEURIBOR3M", TARGET); private static final GeneratorSwapFixedIbor EUR1YEURIBOR6M = GENERATOR_SWAP_MASTER.getGenerator("EUR1YEURIBOR6M", TARGET); private static final IborIndex EURIBOR3M = EUR1YEURIBOR3M.getIborIndex(); private static final IborIndex EURIBOR6M = EUR1YEURIBOR6M.getIborIndex(); private static final GeneratorSwapIborIborMaster GENERATOR_BS_MASTER = GeneratorSwapIborIborMaster.getInstance(); private static final GeneratorSwapIborIbor EUREURIBOR3MEURIBOR6M = GENERATOR_BS_MASTER.getGenerator("EUREURIBOR3MEURIBOR6M", TARGET); /** Dates */ private static final ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2014, 7, 17); /** Instruments */ private static final GeneratorAttributeIR ATTRIBUTE_1 = new GeneratorAttributeIR(Period.ofYears(5)); private static final SwapFixedIborDefinition IRS_1_DEFINITION = EUR1YEURIBOR3M.generateInstrument(REFERENCE_DATE, 0.01, 1, ATTRIBUTE_1); private static final Swap<?, ?> IRS_1 = IRS_1_DEFINITION.toDerivative(REFERENCE_DATE); private static final SwapDefinition BS_1_DEFINITION = EUREURIBOR3MEURIBOR6M.generateInstrument(REFERENCE_DATE, 0.0010, 1, ATTRIBUTE_1); private static final Swap<?, ?> BS_1 = BS_1_DEFINITION.toDerivative(REFERENCE_DATE); /** Calculators with different indexes **/ private static final LastFixingTimeIndexCalculator LAST_TIME_EURIBOR3M = new LastFixingTimeIndexCalculator(EURIBOR3M); private static final LastFixingTimeIndexCalculator LAST_TIME_EURIBOR6M = new LastFixingTimeIndexCalculator(EURIBOR6M); private static final double TOLERANCE_TIME = 1.0E-10; @Test public void fixedLeg() { Double lastFixed = IRS_1.getFirstLeg().accept(LAST_TIME_EURIBOR3M); assertEquals("LastFixingTimeIndexCalculator: fixed leg", lastFixed, 0.0, TOLERANCE_TIME); } @Test public void iborLeg() { double lastTimeComputed = IRS_1.getSecondLeg().accept(LAST_TIME_EURIBOR3M); double lastTimeExpected = ((CouponIbor) (IRS_1.getSecondLeg().getNthPayment(IRS_1.getSecondLeg().getNumberOfPayments() - 1))).getFixingPeriodEndTime(); assertEquals("LastFixingTimeIndexCalculator: Ibor leg", lastTimeComputed, lastTimeExpected, TOLERANCE_TIME); } @Test public void irs() { double lastTimeComputed = IRS_1.accept(LAST_TIME_EURIBOR3M); double lastTimeExpected = ((CouponIbor) (IRS_1.getSecondLeg().getNthPayment(IRS_1.getSecondLeg().getNumberOfPayments() - 1))).getFixingPeriodEndTime(); assertEquals("LastFixingTimeIndexCalculator: IRS", lastTimeComputed, lastTimeExpected, TOLERANCE_TIME); } @Test public void basisSwap() { // The reference date has been chosen such that the last date of the two legs are different. double lastTimeComputedE3Swap = BS_1.accept(LAST_TIME_EURIBOR3M); double lastTimeComputedE3Leg = BS_1.getFirstLeg().accept(LAST_TIME_EURIBOR3M); double lastTimeComputedE6Swap = BS_1.accept(LAST_TIME_EURIBOR6M); double lastTimeComputedE6Leg = BS_1.getSecondLeg().accept(LAST_TIME_EURIBOR6M); assertEquals("LastFixingTimeIndexCalculator: basis swap", lastTimeComputedE3Leg, lastTimeComputedE3Swap, TOLERANCE_TIME); assertEquals("LastFixingTimeIndexCalculator: basis swap", lastTimeComputedE6Leg, lastTimeComputedE6Swap, TOLERANCE_TIME); assertFalse("LastFixingTimeIndexCalculator: basis swap", Math.abs(lastTimeComputedE3Swap - lastTimeComputedE6Swap) < TOLERANCE_TIME); } }