/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.convention.daycount;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.calendar.ExceptionCalendar;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class BusinessTwoFiveTwoTest {
private static final ZonedDateTime D1 = DateUtils.getUTCDate(2010, 1, 1);
private static final ZonedDateTime D2 = DateUtils.getUTCDate(2010, 4, 1);
private static final ZonedDateTime D3 = DateUtils.getUTCDate(2010, 7, 1);
private static final LocalDate D4 = LocalDate.of(2010, 1, 1);
private static final LocalDate D5 = LocalDate.of(2010, 4, 1);
private static final LocalDate D6 = LocalDate.of(2010, 7, 1);
private static final double COUPON = 0.01;
private static final int PAYMENTS = 4;
private static final Calendar WEEKEND_CALENDAR = new MondayToFridayCalendar("Weekend");
private static final Calendar HOLIDAY_CALENDAR = new MyCalendar("Holiday");
private static final BusinessTwoFiveTwo DC = new BusinessTwoFiveTwo();
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullFirstDate1() {
DC.getDayCountFraction(null, D2, WEEKEND_CALENDAR);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSecondDate1() {
DC.getDayCountFraction(D1, null, WEEKEND_CALENDAR);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testWrongOrder1() {
DC.getDayCountFraction(D2, D1, WEEKEND_CALENDAR);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullFirstDate2() {
DC.getDayCountFraction(null, D5, WEEKEND_CALENDAR);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSecondDate2() {
DC.getDayCountFraction(D4, null, WEEKEND_CALENDAR);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testWrongOrder2() {
DC.getDayCountFraction(D5, D4, WEEKEND_CALENDAR);
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void testNoCalendar1() {
DC.getDayCountFraction(D4, D5);
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void testNoCalendar2() {
DC.getDayCountFraction(D1, D3);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCalendar1() {
DC.getDayCountFraction(D4, D5, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCalendar2() {
DC.getDayCountFraction(D1, D2, null);
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void testAccruedInterest() {
DC.getAccruedInterest(D4, D5, D6, COUPON, PAYMENTS);
}
@Test
public void test() {
assertEquals(DC.getName(), "Business/252");
final LocalDate d1 = LocalDate.of(2012, 7, 16);
final LocalDate d2 = LocalDate.of(2012, 7, 17);
final LocalDate d3 = LocalDate.of(2012, 7, 23);
final LocalDate d4 = LocalDate.of(2012, 7, 31);
final LocalDate d5 = LocalDate.of(2012, 7, 29);
final LocalDate d6 = LocalDate.of(2012, 7, 14);
final LocalDate d7 = LocalDate.of(2012, 7, 26);
assertEquals(1. / 252, DC.getDayCountFraction(d1, d2, WEEKEND_CALENDAR), 0);
assertEquals(1. / 252, DC.getDayCountFraction(d1, d2, HOLIDAY_CALENDAR), 0);
assertEquals(5. / 252, DC.getDayCountFraction(d1, d3, WEEKEND_CALENDAR), 0);
assertEquals(4. / 252, DC.getDayCountFraction(d1, d3, HOLIDAY_CALENDAR), 0);
assertEquals(11. / 252, DC.getDayCountFraction(d1, d4, WEEKEND_CALENDAR), 0);
assertEquals(9. / 252, DC.getDayCountFraction(d1, d4, HOLIDAY_CALENDAR), 0);
assertEquals(10. / 252, DC.getDayCountFraction(d1, d5, WEEKEND_CALENDAR), 0);
assertEquals(8. / 252, DC.getDayCountFraction(d1, d5, HOLIDAY_CALENDAR), 0);
assertEquals(1. / 252, DC.getDayCountFraction(d6, d2, WEEKEND_CALENDAR), 0);
assertEquals(1. / 252, DC.getDayCountFraction(d6, d2, HOLIDAY_CALENDAR), 0);
assertEquals(5. / 252, DC.getDayCountFraction(d6, d3, WEEKEND_CALENDAR), 0);
assertEquals(4. / 252, DC.getDayCountFraction(d6, d3, HOLIDAY_CALENDAR), 0);
assertEquals(11. / 252, DC.getDayCountFraction(d6, d4, WEEKEND_CALENDAR), 0);
assertEquals(9. / 252, DC.getDayCountFraction(d6, d4, HOLIDAY_CALENDAR), 0);
assertEquals(10. / 252, DC.getDayCountFraction(d6, d5, WEEKEND_CALENDAR), 0);
assertEquals(8. / 252, DC.getDayCountFraction(d6, d5, HOLIDAY_CALENDAR), 0);
assertEquals(8. / 252, DC.getDayCountFraction(d1, d7, WEEKEND_CALENDAR), 0);
assertEquals(7. / 252, DC.getDayCountFraction(d1, d7, HOLIDAY_CALENDAR), 0);
}
/**
* Any day count with a fixed denominator should obey the additivity rule DCC(d1,d2) = DCC(d1,d) + DCC(d,d2) for all
* d1 <= d <= d2
*/
@Test
public void additivityTest() {
LocalDate d1 = LocalDate.of(2014, 7, 16);
LocalDate d2 = LocalDate.of(2014, 8, 17);
double yf = DC.getDayCountFraction(d1, d2, WEEKEND_CALENDAR);
LocalDate d = d1;
while (!d.isAfter(d2)) {
assertEquals(yf, DC.getDayCountFraction(d1, d, WEEKEND_CALENDAR) + DC.getDayCountFraction(d, d2, WEEKEND_CALENDAR), 1e-15);
d = d.plusDays(1);
}
}
private static class MyCalendar extends ExceptionCalendar {
private static final long serialVersionUID = 1L;
private static final LocalDate[] HOLIDAYS = new LocalDate[] {LocalDate.of(2012, 7, 19), LocalDate.of(2012, 7, 26) };
protected MyCalendar(final String name) {
super(name);
}
@Override
protected boolean isNormallyWorkingDay(final LocalDate date) {
if (date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY) {
return false;
}
for (final LocalDate holiday : HOLIDAYS) {
if (date.equals(holiday)) {
return false;
}
}
return true;
}
}
}