/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.instrument.annuity; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import java.util.ArrayList; import java.util.List; import org.testng.annotations.Test; import org.threeten.bp.DayOfWeek; import org.threeten.bp.Period; import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.index.GeneratorSwapFixedON; import com.opengamma.analytics.financial.instrument.index.IndexON; 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.timeseries.DoubleTimeSeries; import com.opengamma.timeseries.precise.zdt.ImmutableZonedDateTimeDoubleTimeSeries; 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 AnnuityCouponONSimplifiedDefinitionTest { private static final Currency CCY = Currency.EUR; private static final Period PAYMENT_PERIOD = Period.ofMonths(6); private static final Calendar CALENDAR = new MondayToFridayCalendar("Weekend"); private static final DayCount DAY_COUNT = DayCounts.ACT_360; private static final boolean IS_EOM = true; private static final ZonedDateTime SETTLEMENT_DATE = DateUtils.getUTCDate(2012, 2, 1); private static final ZonedDateTime MATURITY_DATE = DateUtils.getUTCDate(2022, 2, 1); private static final Period MATURITY_TENOR = Period.ofYears(10); private static final double NOTIONAL = 100000000; private static final IndexON INDEX = new IndexON("O/N", CCY, DAY_COUNT, 1); private static final BusinessDayConvention BUSINESS_DAY = BusinessDayConventions.FOLLOWING; private static final GeneratorSwapFixedON GENERATOR = new GeneratorSwapFixedON("OIS", INDEX, PAYMENT_PERIOD, DAY_COUNT, BUSINESS_DAY, IS_EOM, 1, CALENDAR); private static final boolean IS_PAYER = true; private static final AnnuityCouponONSimplifiedDefinition DEFINITION = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL, GENERATOR, IS_PAYER); private static final DoubleTimeSeries<ZonedDateTime> FIXING_TS; private static final ZonedDateTime DATE = DateUtils.getUTCDate(2012, 3, 15); static { ZonedDateTime date = SETTLEMENT_DATE; final List<ZonedDateTime> dates = new ArrayList<>(); final List<Double> data = new ArrayList<>(); while (date.isBefore(DATE) || date.equals(DATE)) { dates.add(date); data.add(Math.random() / 100); date = date.plusDays(1); if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) { date = date.plusDays(2); } } FIXING_TS = ImmutableZonedDateTimeDoubleTimeSeries.of(dates, data, ZoneOffset.UTC); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullCoupons() { new AnnuityCouponONSimplifiedDefinition(null, GENERATOR.getIndex(), null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullSettlementDate1() { AnnuityCouponONSimplifiedDefinition.from(null, MATURITY_TENOR, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullPaymentFrequency() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, (Period) null, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullGenerator1() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_TENOR, NOTIONAL, null, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullSettlementDate2() { AnnuityCouponONSimplifiedDefinition.from(null, MATURITY_DATE, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullMaturityDate() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, (ZonedDateTime) null, NOTIONAL, GENERATOR, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullGenerator2() { AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL, null, IS_PAYER); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNoIndexTS() { DEFINITION.toDerivative(DATE); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullDate() { DEFINITION.toDerivative(null, FIXING_TS); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullIndexTS() { DEFINITION.toDerivative(DATE, (DoubleTimeSeries<ZonedDateTime>) null); } @Test public void testHashCodeAndEquals() { AnnuityCouponONSimplifiedDefinition definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL, GENERATOR, IS_PAYER); assertEquals(DEFINITION, definition); assertEquals(DEFINITION.hashCode(), definition.hashCode()); definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_TENOR, NOTIONAL, GENERATOR, IS_PAYER); assertEquals(DEFINITION, definition); assertEquals(DEFINITION.hashCode(), definition.hashCode()); definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE.plusDays(1), MATURITY_DATE, NOTIONAL, GENERATOR, IS_PAYER); assertFalse(DEFINITION.equals(definition)); definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE.plusDays(1), NOTIONAL, GENERATOR, IS_PAYER); assertFalse(DEFINITION.equals(definition)); definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL / 2, GENERATOR, IS_PAYER); assertFalse(DEFINITION.equals(definition)); definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL, new GeneratorSwapFixedON("OIS", INDEX, PAYMENT_PERIOD, DAY_COUNT, BUSINESS_DAY, IS_EOM, 0, CALENDAR), IS_PAYER); assertFalse(DEFINITION.equals(definition)); definition = AnnuityCouponONSimplifiedDefinition.from(SETTLEMENT_DATE, MATURITY_DATE, NOTIONAL, GENERATOR, !IS_PAYER); assertFalse(DEFINITION.equals(definition)); } }