/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.impl.credit.isda; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.time.LocalDate; import java.time.Period; import org.testng.annotations.Test; import com.opengamma.strata.basics.date.BusinessDayConvention; import com.opengamma.strata.basics.date.BusinessDayConventions; import com.opengamma.strata.basics.date.DayCount; import com.opengamma.strata.basics.date.DayCounts; import com.opengamma.strata.basics.date.HolidayCalendar; import com.opengamma.strata.basics.date.HolidayCalendars; import com.opengamma.strata.basics.schedule.StubConvention; /** * */ @Test public class CdsCouponTest { /** * */ @SuppressWarnings("unused") @Test public void yearFractionTest() { final DayCount curveDcc = DayCounts.ACT_365F; final DayCount accrDcc = DayCounts.ACT_360; final HolidayCalendar calender = HolidayCalendars.SAT_SUN; final BusinessDayConvention following = BusinessDayConventions.FOLLOWING; final LocalDate tradeDate = LocalDate.of(2011, 4, 22); { final LocalDate accStart = ImmDateLogic.getPrevIMMDate(tradeDate); final LocalDate accEnd = following.adjust(accStart.plusMonths(3), calender); final LocalDate settle = accEnd; final boolean protectStart = true; final double toStart = -curveDcc.yearFraction(accStart.minusDays(1), tradeDate); final double toEnd = curveDcc.yearFraction(tradeDate, accEnd.minusDays(1)); final double toSettle = curveDcc.yearFraction(tradeDate, settle); final double fromStartToEnd = accrDcc.yearFraction(accStart, accEnd); final double yFracRatio = fromStartToEnd / curveDcc.yearFraction(accStart, accEnd); final CdsCoupon cp = new CdsCoupon(tradeDate, accStart, accEnd, settle, protectStart); assertEquals(toStart, cp.getEffStart()); assertEquals(toEnd, cp.getEffEnd()); assertEquals(toSettle, cp.getPaymentTime()); assertEquals(fromStartToEnd, cp.getYearFrac()); assertEquals(yFracRatio, cp.getYFRatio()); final CdsCoupon cpFromTriplet = new CdsCoupon(tradeDate, accStart, accEnd, settle); final CdsCoupon cpFromTripletWithDcc = new CdsCoupon(tradeDate, accStart, accEnd, settle, protectStart, accrDcc, curveDcc); final CdsCoupon cpFromArrayWithDcc = new CdsCoupon(tradeDate, new LocalDate[] {accStart, accEnd, settle }, protectStart, accrDcc, curveDcc); assertEquals(cp, cpFromTriplet); assertEquals(cp, cpFromTripletWithDcc); assertEquals(cp, cpFromArrayWithDcc); final LocalDate mat = accStart.plusYears(5); final IsdaPremiumLegSchedule sch = new IsdaPremiumLegSchedule(accStart, mat, Period.ofMonths(3), StubConvention.SHORT_INITIAL, following, calender, protectStart); final CdsCoupon[] coupons = CdsCoupon.makeCoupons(tradeDate, sch, protectStart, accrDcc, curveDcc); assertEquals(cp.getEffStart(), coupons[0].getEffStart()); assertEquals(cp.getEffEnd(), coupons[0].getEffEnd()); assertEquals(cp.getPaymentTime(), coupons[0].getPaymentTime()); assertEquals(cp.getYearFrac(), coupons[0].getYearFrac()); assertEquals(cp.getYFRatio(), coupons[0].getYFRatio()); /* * Error expected */ try { new CdsCoupon(tradeDate, new LocalDate[] {accStart, accEnd }, protectStart, accrDcc, curveDcc); throw new RuntimeException(); } catch (Exception e) { assertTrue(e instanceof IllegalArgumentException); } /* * hashCode & equals */ final CdsCoupon cp1 = new CdsCoupon(tradeDate, accStart, accEnd, settle, protectStart, curveDcc, curveDcc); final CdsCoupon cp2 = new CdsCoupon(tradeDate, accStart.plusDays(4), accEnd, settle, protectStart); final CdsCoupon cp3 = new CdsCoupon(tradeDate, accStart, accEnd.plusDays(4), settle, protectStart); final CdsCoupon cp4 = new CdsCoupon(tradeDate, accStart, accEnd, settle.plusDays(5), protectStart); assertTrue(cp.equals(cpFromTriplet)); assertEquals(cp.hashCode(), cpFromTriplet.hashCode()); assertTrue(cp.equals(cp)); assertTrue(!(cp.equals(null))); assertTrue(!(cp.equals(new double[] {}))); assertTrue(cp.hashCode() != cp1.hashCode()); assertTrue(!(cp.equals(cp1))); assertTrue(cp.hashCode() != cp2.hashCode()); assertTrue(!(cp.equals(cp2))); assertTrue(cp.hashCode() != cp3.hashCode()); assertTrue(!(cp.equals(cp3))); assertTrue(cp.hashCode() != cp4.hashCode()); assertTrue(!(cp.equals(cp4))); } { final LocalDate accStart = ImmDateLogic.getNextIMMDate(tradeDate); final LocalDate accEnd = following.adjust(accStart.plusMonths(3), calender); final LocalDate settle = accEnd; final boolean protectStart = false; final double toStart = curveDcc.yearFraction(tradeDate, accStart); final double toEnd = curveDcc.yearFraction(tradeDate, accEnd); final double toSettle = curveDcc.yearFraction(tradeDate, settle); final double fromStartToEnd = accrDcc.yearFraction(accStart, accEnd); final double yFracRatio = fromStartToEnd / curveDcc.yearFraction(accStart, accEnd); final CdsCoupon cp = new CdsCoupon(tradeDate, accStart, accEnd, settle, protectStart); assertEquals(toStart, cp.getEffStart()); assertEquals(toEnd, cp.getEffEnd()); assertEquals(toSettle, cp.getPaymentTime()); assertEquals(fromStartToEnd, cp.getYearFrac()); assertEquals(yFracRatio, cp.getYFRatio()); } } }