/*
Copyright (C) 2007 Srinivas Hasti
This source code is release under the BSD License.
This file is part of JQuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://jquantlib.org/
JQuantLib is free software: you can redistribute it and/or modify it
under the terms of the JQuantLib license. You should have received a
copy of the license along with this program; if not, please email
<jquant-devel@lists.sourceforge.net>. The license is also available online at
<http://www.jquantlib.org/index.php/LICENSE.TXT>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
JQuantLib is based on QuantLib. http://quantlib.org/
When applicable, the original copyright notice follows this notice.
*/
package org.jquantlib.testsuite.time;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jquantlib.QL;
import org.jquantlib.time.BusinessDayConvention;
import org.jquantlib.time.Calendar;
import org.jquantlib.time.Date;
import org.jquantlib.time.DateGeneration;
import org.jquantlib.time.Month;
import org.jquantlib.time.Period;
import org.jquantlib.time.Schedule;
import org.jquantlib.time.TimeUnit;
import org.jquantlib.time.calendars.Target;
import org.junit.Test;
public class ScheduleTest {
final private Date startDate;
public ScheduleTest() {
QL.info("::::: " + this.getClass().getSimpleName() + " :::::");
this.startDate = new Date(20, Month.August, 2007);
}
@Test
public void testSchedule() {
final Calendar calendar = new Target();
final Period maturity = new Period(30, TimeUnit.Years);
final Date maturityDate = startDate.add(maturity);
final Period accPeriodTenor = new Period(6, TimeUnit.Months);
final BusinessDayConvention modFollow = BusinessDayConvention.ModifiedFollowing;
final DateGeneration.Rule dateRule = DateGeneration.Rule.Backward;
final Schedule firstConstrSchedule = new Schedule(
startDate, maturityDate, accPeriodTenor,
calendar, modFollow, modFollow,
dateRule, false, null, null);
final List<Date> dates = new ArrayList<Date>();
dates.add(startDate);
dates.add(calendar.advance(startDate, new Period(10, TimeUnit.Weeks),modFollow));
final Schedule secondConstrSchedule = new Schedule(dates, calendar, modFollow);
testDateAfter(firstConstrSchedule);
testDateAfter(secondConstrSchedule);
testNextAndPrevDate(firstConstrSchedule);
testNextAndPrevDate(secondConstrSchedule);
testIsRegular(firstConstrSchedule);
}
private void testDateAfter(final Schedule schedule) {
Iterator<Date> dates = schedule.getDatesAfter(startDate);
while (dates.hasNext()) {
assertTrue(startDate.lt(dates.next()));
}
dates = schedule.getDatesAfter(startDate);
while (dates.hasNext()) {
assertTrue(startDate.lt(dates.next()));
}
}
private void testNextAndPrevDate(final Schedule schedule) {
final Date nextDate = schedule.nextDate(startDate);
assertTrue(nextDate.ge(startDate));
final Date prevDate = schedule.previousDate(nextDate);
assertTrue(nextDate.gt(prevDate));
assertTrue(prevDate.lt(nextDate));
}
private void testIsRegular(final Schedule schedule) {
for (int i = 0; i < 2; i++) {
schedule.isRegular(i+1);
}
}
}