/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.convention.expirycalc; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class BondFutureOptionExpiryCalculatorTest { private static final BondFutureOptionExpiryCalculator CALCULATOR = BondFutureOptionExpiryCalculator.getInstance(); static final Calendar WEEKEND_CALENDAR = new MondayToFridayCalendar("a"); private static final Calendar CALENDAR = new MyCalendar(); private static final LocalDate AUGUST = LocalDate.of(2012, 8, 1); private static final LocalDate SEPTEMBER_START = LocalDate.of(2012, 9, 1); private static final LocalDate SEPTEMBER_END = LocalDate.of(2012, 9, 29); @Test(expectedExceptions = IllegalArgumentException.class) public void testNegativeN() { CALCULATOR.getExpiryDate(-1, AUGUST, CALENDAR); } @Test(expectedExceptions = IllegalArgumentException.class) public void testZeroN() { CALCULATOR.getExpiryDate(0, AUGUST, CALENDAR); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullDate() { CALCULATOR.getExpiryDate(1, null, CALENDAR); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullCalendar() { CALCULATOR.getExpiryDate(2, AUGUST, null); } // @Test public void testExpiryMonthBeforeExpiry() { assertEquals(LocalDate.of(2012, 9, 21), CALCULATOR.getExpiryDate(1, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 9, 21), CALCULATOR.getExpiryDate(1, SEPTEMBER_START, CALENDAR)); assertEquals(LocalDate.of(2012, 10, 26), CALCULATOR.getExpiryDate(2, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 10, 26), CALCULATOR.getExpiryDate(2, SEPTEMBER_START, CALENDAR)); assertEquals(LocalDate.of(2012, 11, 23), CALCULATOR.getExpiryDate(3, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 11, 22), CALCULATOR.getExpiryDate(3, SEPTEMBER_START, CALENDAR)); assertEquals(LocalDate.of(2012, 12, 21), CALCULATOR.getExpiryDate(4, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 12, 21), CALCULATOR.getExpiryDate(4, SEPTEMBER_START, CALENDAR)); assertEquals(LocalDate.of(2013, 1, 25), CALCULATOR.getExpiryDate(5, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 1, 25), CALCULATOR.getExpiryDate(5, SEPTEMBER_START, CALENDAR)); assertEquals(LocalDate.of(2013, 2, 22), CALCULATOR.getExpiryDate(6, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 2, 22), CALCULATOR.getExpiryDate(6, SEPTEMBER_START, CALENDAR)); assertEquals(LocalDate.of(2013, 4, 26), CALCULATOR.getExpiryDate(8, SEPTEMBER_START, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 4, 19), CALCULATOR.getExpiryDate(8, SEPTEMBER_START, CALENDAR)); } @Test public void testExpiryMonthAfterExpiry() { assertEquals(LocalDate.of(2012, 10, 26), CALCULATOR.getExpiryDate(1, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 10, 26), CALCULATOR.getExpiryDate(1, SEPTEMBER_END, CALENDAR)); assertEquals(LocalDate.of(2012, 11, 23), CALCULATOR.getExpiryDate(2, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 11, 22), CALCULATOR.getExpiryDate(2, SEPTEMBER_END, CALENDAR)); assertEquals(LocalDate.of(2012, 12, 21), CALCULATOR.getExpiryDate(3, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2012, 12, 21), CALCULATOR.getExpiryDate(3, SEPTEMBER_END, CALENDAR)); assertEquals(LocalDate.of(2013, 1, 25), CALCULATOR.getExpiryDate(4, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 1, 25), CALCULATOR.getExpiryDate(4, SEPTEMBER_END, CALENDAR)); assertEquals(LocalDate.of(2013, 2, 22), CALCULATOR.getExpiryDate(5, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 2, 22), CALCULATOR.getExpiryDate(5, SEPTEMBER_END, CALENDAR)); assertEquals(LocalDate.of(2013, 3, 22), CALCULATOR.getExpiryDate(6, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 3, 22), CALCULATOR.getExpiryDate(6, SEPTEMBER_END, CALENDAR)); assertEquals(LocalDate.of(2013, 4, 26), CALCULATOR.getExpiryDate(7, SEPTEMBER_END, WEEKEND_CALENDAR)); assertEquals(LocalDate.of(2013, 4, 19), CALCULATOR.getExpiryDate(7, SEPTEMBER_END, CALENDAR)); } private static class MyCalendar implements Calendar { private static final LocalDate HOLIDAY1 = LocalDate.of(2012, 12, 28); private static final LocalDate HOLIDAY2 = LocalDate.of(2012, 11, 23); private static final LocalDate HOLIDAY3 = LocalDate.of(2013, 2, 2); private static final LocalDate HOLIDAY4 = LocalDate.of(2013, 4, 29); public MyCalendar() { } @Override public boolean isWorkingDay(final LocalDate date) { if (date.equals(HOLIDAY1) || date.equals(HOLIDAY2) || date.equals(HOLIDAY3) || date.equals(HOLIDAY4)) { return false; } return WEEKEND_CALENDAR.isWorkingDay(date); } @Override public String getConventionName() { return null; } @Override public String getName() { return null; } } }