/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.schedule;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import org.testng.annotations.Test;
import org.threeten.bp.DateTimeException;
import org.threeten.bp.LocalDate;
import org.threeten.bp.Month;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class AnnualScheduleOnDayAndMonthCalculatorTest extends ScheduleCalculatorTestCase {
private static final int DAY_OF_MONTH = 15;
private static final Month MONTH_OF_YEAR = Month.APRIL;
private static final AnnualScheduleOnDayAndMonthCalculator CALCULATOR = new AnnualScheduleOnDayAndMonthCalculator(DAY_OF_MONTH, MONTH_OF_YEAR);
@Override
public Schedule getScheduleCalculator() {
return CALCULATOR;
}
@Test(expectedExceptions = DateTimeException.class)
public void testNegativeDay() {
new AnnualScheduleOnDayAndMonthCalculator(-DAY_OF_MONTH, MONTH_OF_YEAR);
}
@Test(expectedExceptions = DateTimeException.class)
public void testBadDay() {
new AnnualScheduleOnDayAndMonthCalculator(31, Month.FEBRUARY);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testSameDayBadDates1() {
final LocalDate date = LocalDate.of(2001, MONTH_OF_YEAR.getValue(), 12);
CALCULATOR.getSchedule(date, date, false, true);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testSameDayBadDates2() {
final ZonedDateTime date = DateUtils.getUTCDate(2001, MONTH_OF_YEAR.getValue(), 12);
CALCULATOR.getSchedule(date, date, false, true);
}
@Test
public void testSameDayGoodDates1() {
final LocalDate date = LocalDate.of(2001, MONTH_OF_YEAR.getValue(), DAY_OF_MONTH);
final LocalDate[] result = CALCULATOR.getSchedule(date, date, false, true);
assertEquals(result.length, 1);
assertEquals(result[0], date);
}
@Test
public void testSameDayGoodDates2() {
final ZonedDateTime date = DateUtils.getUTCDate(2001, MONTH_OF_YEAR.getValue(), DAY_OF_MONTH);
final ZonedDateTime[] result = CALCULATOR.getSchedule(date, date, false, true);
assertEquals(result.length, 1);
assertEquals(result[0], date);
}
@Test
public void test1() {
LocalDate startDate = LocalDate.of(2000, 1, 1);
LocalDate endDate = LocalDate.of(2000, 3, 1);
LocalDate[] forwards = CALCULATOR.getSchedule(startDate, endDate, false, true);
assertEquals(forwards.length, 0);
startDate = LocalDate.of(2000, 5, 1);
endDate = LocalDate.of(2001, 3, 1);
forwards = CALCULATOR.getSchedule(startDate, endDate, false, true);
assertEquals(forwards.length, 0);
startDate = LocalDate.of(2000, 1, 1);
endDate = LocalDate.of(2010, 5, 1);
final int years = 11;
forwards = CALCULATOR.getSchedule(startDate, endDate, false, true);
assertEquals(forwards.length, years);
assertEquals(forwards[0], LocalDate.of(2000, MONTH_OF_YEAR.getValue(), DAY_OF_MONTH));
assertEquals(forwards[years - 1], LocalDate.of(2010, MONTH_OF_YEAR.getValue(), DAY_OF_MONTH));
for (int i = 1; i < years; i++) {
assertEquals(forwards[i].getYear() - forwards[i - 1].getYear(), 1);
assertEquals(forwards[i].getMonth(), MONTH_OF_YEAR);
assertEquals(forwards[i].getDayOfMonth(), DAY_OF_MONTH);
}
assertArrayEquals(forwards, CALCULATOR.getSchedule(startDate, endDate, true, true));
assertArrayEquals(forwards, CALCULATOR.getSchedule(startDate, endDate));
}
@Test
public void test2() {
ZonedDateTime startDate = DateUtils.getUTCDate(2000, 1, 1);
ZonedDateTime endDate = DateUtils.getUTCDate(2000, 3, 1);
ZonedDateTime[] forwards = CALCULATOR.getSchedule(startDate, endDate, false, true);
assertEquals(forwards.length, 0);
startDate = DateUtils.getUTCDate(2000, 5, 1);
endDate = DateUtils.getUTCDate(2001, 3, 1);
forwards = CALCULATOR.getSchedule(startDate, endDate, false, true);
assertEquals(forwards.length, 0);
startDate = DateUtils.getUTCDate(2000, 1, 1);
endDate = DateUtils.getUTCDate(2010, 5, 1);
final int years = 11;
forwards = CALCULATOR.getSchedule(startDate, endDate, false, true);
assertEquals(forwards.length, years);
assertEquals(forwards[0], DateUtils.getUTCDate(2000, MONTH_OF_YEAR.getValue(), DAY_OF_MONTH));
assertEquals(forwards[years - 1], DateUtils.getUTCDate(2010, MONTH_OF_YEAR.getValue(), DAY_OF_MONTH));
for (int i = 1; i < years; i++) {
assertEquals(forwards[i].getYear() - forwards[i - 1].getYear(), 1);
assertEquals(forwards[i].getMonth(), MONTH_OF_YEAR);
assertEquals(forwards[i].getDayOfMonth(), DAY_OF_MONTH);
}
assertArrayEquals(forwards, CALCULATOR.getSchedule(startDate, endDate, true, true));
assertArrayEquals(forwards, CALCULATOR.getSchedule(startDate, endDate));
}
}