/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.credit.isdastandardmodel; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.Period; import com.opengamma.financial.convention.businessday.BusinessDayConvention; 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.DayCount; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.util.test.TestGroup; /** * */ @Test(groups = TestGroup.UNIT) public class CDSCouponTest { /** * */ @SuppressWarnings("unused") @Test public void yearFractionTest() { final DayCount curveDcc = DayCounts.ACT_365; final DayCount accrDcc = DayCounts.ACT_360; final Calendar calender = new MondayToFridayCalendar("Weekend_Only"); final BusinessDayConvention following = BusinessDayConventions.FOLLOWING; final LocalDate tradeDate = LocalDate.of(2011, 4, 22); { final LocalDate accStart = IMMDateLogic.getPrevIMMDate(tradeDate); final LocalDate accEnd = following.adjustDate(calender, accStart.plusMonths(3)); final LocalDate settle = accEnd; final boolean protectStart = true; final double toStart = -curveDcc.getDayCountFraction(accStart.minusDays(1), tradeDate); final double toEnd = curveDcc.getDayCountFraction(tradeDate, accEnd.minusDays(1)); final double toSettle = curveDcc.getDayCountFraction(tradeDate, settle); final double fromStartToEnd = accrDcc.getDayCountFraction(accStart, accEnd); final double yFracRatio = fromStartToEnd / curveDcc.getDayCountFraction(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), StubType.FRONTSHORT, 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.adjustDate(calender, accStart.plusMonths(3)); final LocalDate settle = accEnd; final boolean protectStart = false; final double toStart = curveDcc.getDayCountFraction(tradeDate, accStart); final double toEnd = curveDcc.getDayCountFraction(tradeDate, accEnd); final double toSettle = curveDcc.getDayCountFraction(tradeDate, settle); final double fromStartToEnd = accrDcc.getDayCountFraction(accStart, accEnd); final double yFracRatio = fromStartToEnd / curveDcc.getDayCountFraction(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()); } } }