/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.Set; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.LocalTime; import org.threeten.bp.Period; import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.opengamma.analytics.financial.instrument.InstrumentDefinitionVisitor; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.instrument.payment.CouponFixedAccruedCompoundingDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponFixedDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborAverageFixingDatesCompoundingDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborAverageFixingDatesCompoundingFlatSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborAverageFixingDatesDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborAverageIndexDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborCompoundingDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborCompoundingFlatSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborCompoundingSimpleSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborCompoundingSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborGearingDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborRatchetDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponIborSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONArithmeticAverageDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONArithmeticAverageSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONArithmeticAverageSpreadSimplifiedDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONSimplifiedDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONSpreadDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponONSpreadSimplifiedDefinition; import com.opengamma.analytics.util.time.TimeCalculator; import com.opengamma.financial.convention.StubType; import com.opengamma.financial.convention.businessday.BusinessDayConventions; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.util.money.Currency; import com.opengamma.util.time.Tenor; /** * Unit test for {@link CouponTenorVisitor}. */ public class CouponTenorVisitorTest { private static final InstrumentDefinitionVisitor<Void, Set<Tenor>> INSTANCE = CouponTenorVisitor.getInstance(); private static final ZonedDateTime START_DATE = ZonedDateTime.of(LocalDate.of(2014, 1, 18), LocalTime.NOON, ZoneOffset.UTC); private static final ZonedDateTime END_DATE = ZonedDateTime.of(LocalDate.of(2014, 3, 18), LocalTime.NOON, ZoneOffset.UTC); private static final IborIndex USD_LIBOR_3M = new IborIndex(Currency.USD, Period.ofMonths(3), 0, DayCounts.ACT_360, BusinessDayConventions.MODIFIED_FOLLOWING, true, ""); private static final IborIndex USD_LIBOR_6M = new IborIndex(Currency.USD, Period.ofMonths(6), 0, DayCounts.ACT_360, BusinessDayConventions.MODIFIED_FOLLOWING, true, ""); private static final IndexON USD_FEDFUNDS = new IndexON("USD FED FUNDS", Currency.USD, DayCounts.ACT_360, 1); private static final Calendar TEST_CALENDAR = new MondayToFridayCalendar(""); private static final CouponIborDefinition USD_LIBOR_3M_COUPON = CouponIborDefinition.from(1, START_DATE, USD_LIBOR_3M, TEST_CALENDAR); @Test public void testCouponIborDefinition() { assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(USD_LIBOR_3M_COUPON.accept(INSTANCE))); } @Test public void testCouponIborSpreadDefinition() { CouponIborSpreadDefinition coupon = CouponIborSpreadDefinition.from(USD_LIBOR_3M_COUPON, 0.01); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborGearingDefinition() { CouponIborGearingDefinition coupon = CouponIborGearingDefinition.from(USD_LIBOR_3M_COUPON, 0., 1.); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborCompoundingDefinition() { CouponIborCompoundingDefinition coupon = CouponIborCompoundingDefinition.from(1, START_DATE, Period.ofMonths(1), USD_LIBOR_3M, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborCompoundingFlatSpreadDefinition() { CouponIborCompoundingFlatSpreadDefinition coupon = CouponIborCompoundingFlatSpreadDefinition.from(1, START_DATE, END_DATE, USD_LIBOR_3M, 0.01, StubType.NONE, BusinessDayConventions.MODIFIED_FOLLOWING, true, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborAverageIndexDefinition() { CouponIborAverageIndexDefinition coupon = CouponIborAverageIndexDefinition.from(USD_LIBOR_3M_COUPON, END_DATE, USD_LIBOR_3M, USD_LIBOR_6M, 1, 1, TEST_CALENDAR, TEST_CALENDAR); assertEquals("Expected two tenors", Sets.newHashSet(Tenor.of(USD_LIBOR_3M.getTenor()), Tenor.of(USD_LIBOR_6M.getTenor())), coupon.accept(INSTANCE)); } @Test public void testCouponIborAverageFixingDatesCompoundingDefinition() { double accrualFactor = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponIborAverageFixingDatesCompoundingDefinition coupon = CouponIborAverageFixingDatesCompoundingDefinition.from(Currency.USD, END_DATE, START_DATE, END_DATE, accrualFactor, 1., new double[] { accrualFactor }, USD_LIBOR_3M, new ZonedDateTime[][] {{ START_DATE }}, new double[][] {{ 1. }}, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborAverageFixingDatesDefinition() { double accrualFactor = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponIborAverageFixingDatesDefinition coupon = CouponIborAverageFixingDatesDefinition.from(Currency.USD, END_DATE, START_DATE, END_DATE, accrualFactor, 1., USD_LIBOR_3M, new ZonedDateTime[] { START_DATE }, new double[] { 1. }, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborAverageFixingDatesCompoundingFlatSpreadDefinition() { double accrualFactor = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponIborAverageFixingDatesCompoundingFlatSpreadDefinition coupon = CouponIborAverageFixingDatesCompoundingFlatSpreadDefinition.from(Currency.USD, END_DATE, START_DATE, END_DATE, accrualFactor, 1., new double[] { accrualFactor }, USD_LIBOR_3M, new ZonedDateTime[][] {{ START_DATE }}, new double[][] {{ 1. }}, TEST_CALENDAR, 0.01); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborCompoundingSimpleSpreadDefinition() { double accrualFactor = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponIborCompoundingSimpleSpreadDefinition coupon = CouponIborCompoundingSimpleSpreadDefinition.from(END_DATE, 1., USD_LIBOR_3M, new ZonedDateTime[] { START_DATE }, new ZonedDateTime[] { END_DATE }, new double[] { accrualFactor }, 0.01, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponIborRatchetDefinition() { double accrualFactor = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponIborRatchetDefinition coupon = new CouponIborRatchetDefinition(Currency.USD, END_DATE, START_DATE, END_DATE, accrualFactor, 1., START_DATE, USD_LIBOR_3M, new double[] { 1., 2., 3. }, new double[] { 1., 2., 3. }, new double[] { 1., 2., 3. }, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponONDefinition() { CouponONDefinition coupon = CouponONDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1, 1, TEST_CALENDAR); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponONSimplifiedDefinition() { CouponONSimplifiedDefinition coupon = CouponONSimplifiedDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1., 0, TEST_CALENDAR); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponArithmeticAverageONDefinition() { CouponONArithmeticAverageDefinition coupon = CouponONArithmeticAverageDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1, 0, TEST_CALENDAR); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponArithmeticAverageONSpreadDefinition() { CouponONArithmeticAverageSpreadDefinition coupon = CouponONArithmeticAverageSpreadDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1, 0, 0.01, TEST_CALENDAR); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponArithmeticAverageONSpreadSimplifiedDefinition() { CouponONArithmeticAverageSpreadSimplifiedDefinition coupon = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1, 0, 0.01, TEST_CALENDAR); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponONSpreadDefinition() { CouponONSpreadDefinition coupon = CouponONSpreadDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1, 0, TEST_CALENDAR, 0.01); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponONSpreadSimplifiedDefinition() { CouponONSpreadSimplifiedDefinition coupon = CouponONSpreadSimplifiedDefinition.from(USD_FEDFUNDS, START_DATE, END_DATE, 1, 0.01, 1, TEST_CALENDAR); assertEquals("Expected ON tenor", Tenor.ON, Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponFixedDefinition() { double paymentYearFrac = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponFixedDefinition coupon = CouponFixedDefinition.from(Currency.USD, END_DATE, START_DATE, END_DATE, paymentYearFrac, 1, 0.01); assertTrue("Expected no tenor", coupon.accept(INSTANCE).isEmpty()); } @Test public void testCouponIborCompoundingSpreadDefinition() { CouponIborCompoundingSpreadDefinition coupon = CouponIborCompoundingSpreadDefinition.from(1.0, // notional START_DATE, // accrualStartDate END_DATE, // accrualEndDate USD_LIBOR_3M, 0.01, // spread StubType.NONE, BusinessDayConventions.MODIFIED_FOLLOWING, true, TEST_CALENDAR); assertEquals("Expected index tenor", Tenor.of(USD_LIBOR_3M.getTenor()), Iterables.getOnlyElement(coupon.accept(INSTANCE))); } @Test public void testCouponFixedAccruedCompoundingDefinition() { double paymentYearFrac = TimeCalculator.getTimeBetween(START_DATE, END_DATE); CouponFixedAccruedCompoundingDefinition coupon = CouponFixedAccruedCompoundingDefinition.from(Currency.USD, END_DATE, START_DATE, END_DATE, paymentYearFrac, 1., 0.01, TEST_CALENDAR); assertTrue("Expected no tenor", coupon.accept(INSTANCE).isEmpty()); } }