package com.opengamma.analytics.financial.instrument.payment; 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.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.index.IndexIborMaster; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.instrument.index.IndexONMaster; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverageSpreadSimplified; import com.opengamma.analytics.financial.schedule.ScheduleCalculator; import com.opengamma.analytics.util.time.TimeCalculator; 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.util.money.Currency; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; /** * Test. */ @Test(groups = TestGroup.UNIT) public class CouponONArithmeticAverageSpreadSimplifiedDefinitionTest { private static final int US_SETTLEMENT_DAYS = 2; private static final BusinessDayConvention MOD_FOL = BusinessDayConventions.MODIFIED_FOLLOWING; private static final Calendar NYC = new MondayToFridayCalendar("NYC"); private static final IndexON FEDFUND = IndexONMaster.getInstance().getIndex("FED FUND"); private static final IborIndex USDLIBOR3M = IndexIborMaster.getInstance().getIndex("USDLIBOR3M"); private static final ZonedDateTime TRADE_DATE = DateUtils.getUTCDate(2011, 5, 23); private static final ZonedDateTime SPOT_DATE = ScheduleCalculator.getAdjustedDate(TRADE_DATE, US_SETTLEMENT_DAYS, NYC); private static final ZonedDateTime ACCRUAL_START_DATE = DateUtils.getUTCDate(2011, 5, 23); private static final Period TENOR_3M = Period.ofMonths(3); private static final double NOTIONAL = 100000000; // 100m private static final double SPREAD = 0.0010; // 10 bps private static final int PAYMENT_LAG = 2; private static final ZonedDateTime ACCRUAL_END_DATE = ScheduleCalculator.getAdjustedDate(ACCRUAL_START_DATE, TENOR_3M, USDLIBOR3M, NYC); private static final double ACCURAL_FACTOR = USDLIBOR3M.getDayCount().getDayCountFraction(ACCRUAL_START_DATE, ACCRUAL_END_DATE); private static final ZonedDateTime PAYMENT_DATE = ScheduleCalculator.getAdjustedDate(ACCRUAL_END_DATE, -1 + FEDFUND.getPublicationLag() + PAYMENT_LAG, NYC); private static final CouponONArithmeticAverageSpreadSimplifiedDefinition FEDFUND_CPN_3M_DEF = new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.USD, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); private static final CouponONArithmeticAverageSpreadSimplifiedDefinition FEDFUND_CPN_3M_FROM_DEF = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(FEDFUND, ACCRUAL_START_DATE, TENOR_3M, NOTIONAL, PAYMENT_LAG, MOD_FOL, true, SPREAD, NYC); @Test(expectedExceptions = IllegalArgumentException.class) public void nullCurrency() { new CouponONArithmeticAverageSpreadSimplifiedDefinition(null, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullPayDate() { new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.USD, null, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullStartAccural() { new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.USD, PAYMENT_DATE, null, ACCRUAL_END_DATE, ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullEndAccural() { new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.USD, PAYMENT_DATE, ACCRUAL_START_DATE, null, ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullIndex() { new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.USD, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCURAL_FACTOR, NOTIONAL, null, SPREAD); } @Test(expectedExceptions = IllegalArgumentException.class) public void wrongCurrency() { new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.AUD, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); } @Test public void getter() { assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getPaymentDate(), PAYMENT_DATE); assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getAccrualStartDate(), ACCRUAL_START_DATE); assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getAccrualEndDate(), ACCRUAL_END_DATE); assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getCurrency(), FEDFUND.getCurrency()); assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getIndex(), FEDFUND); assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getSpread(), SPREAD); assertEquals("CouponArithmeticAverageONSpreadSimplifiedDefinition: getter", FEDFUND_CPN_3M_DEF.getSpreadAmount(), SPREAD * ACCURAL_FACTOR * NOTIONAL); } @Test public void from() { assertEquals("CouponArithmeticAverageONSpreadDefinition: from", FEDFUND_CPN_3M_DEF, FEDFUND_CPN_3M_FROM_DEF); } @Test public void equalHash() { assertEquals("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF, FEDFUND_CPN_3M_DEF); final CouponONArithmeticAverageSpreadSimplifiedDefinition other = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(FEDFUND, ACCRUAL_START_DATE, TENOR_3M, NOTIONAL, PAYMENT_LAG, MOD_FOL, true, SPREAD, NYC); assertEquals("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF, other); assertEquals("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.hashCode(), other.hashCode()); CouponONArithmeticAverageSpreadSimplifiedDefinition modified; final IndexON modifiedIndex = IndexONMaster.getInstance().getIndex("EONIA"); modified = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(modifiedIndex, ACCRUAL_START_DATE, TENOR_3M, NOTIONAL, PAYMENT_LAG, MOD_FOL, true, SPREAD, NYC); assertFalse("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.equals(modified)); modified = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(FEDFUND, ACCRUAL_START_DATE.plusDays(1), TENOR_3M, NOTIONAL, PAYMENT_LAG, MOD_FOL, true, SPREAD, NYC); assertFalse("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.equals(modified)); modified = new CouponONArithmeticAverageSpreadSimplifiedDefinition(Currency.USD, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE.plusDays(1), ACCURAL_FACTOR, NOTIONAL, FEDFUND, SPREAD); assertFalse("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.equals(modified)); modified = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(FEDFUND, ACCRUAL_START_DATE, ACCRUAL_END_DATE, NOTIONAL + 1000, PAYMENT_LAG, SPREAD, NYC); assertFalse("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.equals(modified)); modified = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(FEDFUND, ACCRUAL_START_DATE, ACCRUAL_END_DATE, NOTIONAL, PAYMENT_LAG + 1, SPREAD, NYC); assertFalse("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.equals(modified)); modified = CouponONArithmeticAverageSpreadSimplifiedDefinition.from(FEDFUND, ACCRUAL_START_DATE, ACCRUAL_END_DATE, NOTIONAL, PAYMENT_LAG, SPREAD + 0.0010, NYC); assertFalse("CouponArithmeticAverageON: equal-hash", FEDFUND_CPN_3M_DEF.equals(modified)); } @Test /** * Tests the toDerivative method. */ public void toDerivative() { final CouponONArithmeticAverageSpreadSimplified cpnConverted = FEDFUND_CPN_3M_DEF.toDerivative(TRADE_DATE); final double paymentTime = TimeCalculator.getTimeBetween(TRADE_DATE, PAYMENT_DATE); final double fixingStartTime = TimeCalculator.getTimeBetween(TRADE_DATE, ACCRUAL_START_DATE); final double fixingEndTime = TimeCalculator.getTimeBetween(TRADE_DATE, ACCRUAL_END_DATE); final CouponONArithmeticAverageSpreadSimplified cpnExpected = CouponONArithmeticAverageSpreadSimplified .from(paymentTime, ACCURAL_FACTOR, NOTIONAL, FEDFUND, fixingStartTime, fixingEndTime, FEDFUND_CPN_3M_DEF.getPaymentYearFraction(), SPREAD); assertEquals("CouponOISSimplified definition: toDerivative", cpnExpected, cpnConverted); } }