/**
* 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 java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import org.testng.annotations.Test;
import org.threeten.bp.DayOfWeek;
import org.threeten.bp.LocalDate;
import org.threeten.bp.Month;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class PreviousValuePaddingTimeSeriesSamplingFunctionTest {
private static final LocalDate START = LocalDate.of(2009, 1, 1);
private static final LocalDate END = LocalDate.of(2010, 10, 1);
private static final DailyScheduleCalculator DAILY = new DailyScheduleCalculator();
private static final WeeklyScheduleOnDayCalculator WEEKLY_TUESDAY = new WeeklyScheduleOnDayCalculator(DayOfWeek.TUESDAY);
private static final WeeklyScheduleOnDayCalculator WEEKLY_FRIDAY = new WeeklyScheduleOnDayCalculator(DayOfWeek.FRIDAY);
private static final WeeklyScheduleOnDayCalculator WEEKLY_MONDAY = new WeeklyScheduleOnDayCalculator(DayOfWeek.MONDAY);
private static final PreviousValuePaddingTimeSeriesSamplingFunction F = new PreviousValuePaddingTimeSeriesSamplingFunction();
private static final Calendar WEEKEND_CALENDAR = new MondayToFridayCalendar("Weekend");
private static final HolidayDateRemovalFunction HOLIDAY_REMOVER = HolidayDateRemovalFunction.getInstance();
private static final LocalDate[] DAILY_SCHEDULE = HOLIDAY_REMOVER.getStrippedSchedule(DAILY.getSchedule(START, END, true, true), WEEKEND_CALENDAR);
private static final LocalDate[] TUESDAY_SCHEDULE = HOLIDAY_REMOVER.getStrippedSchedule(WEEKLY_TUESDAY.getSchedule(START, END, true, true), WEEKEND_CALENDAR);
private static final LocalDate[] FRIDAY_SCHEDULE = HOLIDAY_REMOVER.getStrippedSchedule(WEEKLY_FRIDAY.getSchedule(START, END, true, true), WEEKEND_CALENDAR);
private static final LocalDate[] MONDAY_SCHEDULE = HOLIDAY_REMOVER.getStrippedSchedule(WEEKLY_MONDAY.getSchedule(START, END, true, true), WEEKEND_CALENDAR);
private static final LocalDate MISSING_DAY_FRIDAY = LocalDate.of(2009, 2, 6);
private static final LocalDate MISSING_DAY_MONDAY_1 = LocalDate.of(2009, 2, 9);
private static final LocalDate MISSING_DAY_MONDAY_2 = LocalDate.of(2009, 2, 16);
private static final LocalDateDoubleTimeSeries TS_NO_MISSING_DATA;
private static final LocalDateDoubleTimeSeries TS_ONE_MISSING_DAY;
private static final LocalDateDoubleTimeSeries TS_THREE_MISSING_DAYS;
private static final LocalDateDoubleTimeSeries TS_MISSING_MONTH;
static {
final List<LocalDate> t1 = new ArrayList<>();
final List<Double> d1 = new ArrayList<>();
final List<LocalDate> t2 = new ArrayList<>();
final List<Double> d2 = new ArrayList<>();
final List<LocalDate> t3 = new ArrayList<>();
final List<Double> d3 = new ArrayList<>();
final List<LocalDate> t4 = new ArrayList<>();
final List<Double> d4 = new ArrayList<>();
final List<LocalDate> t5 = new ArrayList<>();
final List<Double> d5 = new ArrayList<>();
for (int i = 0; i < DAILY_SCHEDULE.length; i++) {
t1.add(DAILY_SCHEDULE[i]);
d1.add(Double.valueOf(i));
if (!DAILY_SCHEDULE[i].equals(MISSING_DAY_FRIDAY)) {
t2.add(DAILY_SCHEDULE[i]);
d2.add(Double.valueOf(i));
if (!(DAILY_SCHEDULE[i].equals(MISSING_DAY_MONDAY_1) || DAILY_SCHEDULE[i].equals(MISSING_DAY_MONDAY_2))) {
t3.add(DAILY_SCHEDULE[i]);
d3.add(Double.valueOf(i));
}
}
if (!(DAILY_SCHEDULE[i].getMonth() == Month.FEBRUARY && DAILY_SCHEDULE[i].getYear() == 2009)) {
t4.add(DAILY_SCHEDULE[i]);
d4.add(Double.valueOf(i));
}
if (WEEKEND_CALENDAR.isWorkingDay(DAILY_SCHEDULE[i])) {
t5.add(DAILY_SCHEDULE[i]);
d5.add(Double.valueOf(i));
}
}
TS_NO_MISSING_DATA = ImmutableLocalDateDoubleTimeSeries.of(t1, d1);
TS_ONE_MISSING_DAY = ImmutableLocalDateDoubleTimeSeries.of(t2, d2);
TS_THREE_MISSING_DAYS = ImmutableLocalDateDoubleTimeSeries.of(t3, d3);
TS_MISSING_MONTH = ImmutableLocalDateDoubleTimeSeries.of(t4, d4);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullTS() {
F.getSampledTimeSeries(null, DAILY_SCHEDULE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSchedule() {
F.getSampledTimeSeries(TS_NO_MISSING_DATA, null);
}
@Test
public void testNoMissingDataDaily() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_NO_MISSING_DATA, DAILY_SCHEDULE);
assertEquals(TS_NO_MISSING_DATA.size(), result.size());
int i = 0;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(TS_NO_MISSING_DATA.getTimeAtIndex(i), entry.getKey());
assertEquals(TS_NO_MISSING_DATA.getValueAtIndex(i++), entry.getValue(), 0);
}
}
@Test
public void testNoMissingDataWeekly() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_NO_MISSING_DATA, TUESDAY_SCHEDULE);
assertEquals(TUESDAY_SCHEDULE.length, result.size());
int i = 0, j = 3;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(TUESDAY_SCHEDULE[i++], entry.getKey());
assertEquals(j, entry.getValue(), 0);
j += 5;
}
}
@Test
public void testOneDayMissingDataDaily() {
LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_ONE_MISSING_DAY, DAILY_SCHEDULE);
assertEquals(TS_NO_MISSING_DATA.size(), result.size());
int i = 0;
result = F.getSampledTimeSeries(TS_ONE_MISSING_DAY, DAILY_SCHEDULE);
assertEquals(TS_NO_MISSING_DATA.size(), result.size());
i = 0;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(TS_NO_MISSING_DATA.getTimeAtIndex(i), entry.getKey());
if (entry.getKey().equals(MISSING_DAY_FRIDAY)) {
assertEquals(TS_NO_MISSING_DATA.getValueAtIndex(i - 1), entry.getValue(), 0);
} else {
assertEquals(TS_NO_MISSING_DATA.getValueAtIndex(i), entry.getValue(), 0);
}
i++;
}
}
@Test
public void testMissingDataWeekly() {
LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_ONE_MISSING_DAY, FRIDAY_SCHEDULE);
assertEquals(FRIDAY_SCHEDULE.length, result.size());
int i = 0, j = 1;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(FRIDAY_SCHEDULE[i++], entry.getKey());
if (entry.getKey().equals(MISSING_DAY_FRIDAY)) {
assertEquals(j - 1, entry.getValue(), 0);
} else {
assertEquals(j, entry.getValue(), 0);
}
j += 5;
}
result = F.getSampledTimeSeries(TS_THREE_MISSING_DAYS, MONDAY_SCHEDULE);
assertEquals(MONDAY_SCHEDULE.length, result.size());
i = 0;
j = 2;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(MONDAY_SCHEDULE[i++], entry.getKey());
if (entry.getKey().equals(MISSING_DAY_MONDAY_1)) {
assertEquals(j - 2, entry.getValue(), 0);
} else if (entry.getKey().equals(MISSING_DAY_MONDAY_2)) {
assertEquals(j - 1, entry.getValue(), 0);
} else {
assertEquals(j, entry.getValue(), 0);
}
j += 5;
}
}
@Test
public void testThreeDaysMissingDataDaily() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_THREE_MISSING_DAYS, DAILY_SCHEDULE);
assertEquals(result.size(), DAILY_SCHEDULE.length);
int i = 0;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(entry.getKey(), DAILY_SCHEDULE[i]);
if (entry.getKey().equals(MISSING_DAY_FRIDAY)) {
assertEquals(entry.getValue(), i - 1, 0);
} else if (entry.getKey().equals(MISSING_DAY_MONDAY_1)) {
assertEquals(entry.getValue(), i - 2, 0);
} else if (entry.getKey().equals(MISSING_DAY_MONDAY_2)) {
assertEquals(entry.getValue(), i - 1, 0);
} else {
assertEquals(entry.getValue(), i, 0);
}
i++;
}
}
@Test
public void testMissingMonth() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_MISSING_MONTH, DAILY_SCHEDULE);
assertEquals(result.size(), DAILY_SCHEDULE.length);
int i = 0;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(entry.getKey(), DAILY_SCHEDULE[i]);
if (entry.getKey().getMonth() == Month.FEBRUARY && entry.getKey().getYear() == 2009) {
assertEquals(entry.getValue(), 21, 0);
} else {
assertEquals(entry.getValue(), i, 0);
}
i++;
}
}
}