/**
* 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 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 PreviousAndFirstValuePaddingTimeSeriesSamplingFunctionTest {
//TODO test start date = holiday
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_MONDAY = new WeeklyScheduleOnDayCalculator(DayOfWeek.MONDAY);
private static final PreviousAndFirstValuePaddingTimeSeriesSamplingFunction F = new PreviousAndFirstValuePaddingTimeSeriesSamplingFunction();
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[] MONDAY_SCHEDULE = HOLIDAY_REMOVER.getStrippedSchedule(WEEKLY_MONDAY.getSchedule(START, END, true, true), WEEKEND_CALENDAR);
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_TWO_MISSING_DATA_POINTS;
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<>();
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_MONDAY_1) || DAILY_SCHEDULE[i].equals(MISSING_DAY_MONDAY_2))) {
t2.add(DAILY_SCHEDULE[i]);
d2.add(Double.valueOf(i));
}
}
TS_NO_MISSING_DATA = ImmutableLocalDateDoubleTimeSeries.of(t1, d1);
TS_TWO_MISSING_DATA_POINTS = ImmutableLocalDateDoubleTimeSeries.of(t2, d2);
}
@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 testMissingFirstData() {
final LocalDate start = START.minusDays(21);
final LocalDate[] daily = HOLIDAY_REMOVER.getStrippedSchedule(DAILY.getSchedule(start, END, true, true), WEEKEND_CALENDAR);
final List<LocalDate> t = new ArrayList<>();
final List<Double> d = new ArrayList<>();
for (int i = 0; i < daily.length; i++) {
if (daily[i].isAfter(START)) {
t.add(daily[i]);
d.add(Double.valueOf(i));
}
}
final LocalDateDoubleTimeSeries ts = ImmutableLocalDateDoubleTimeSeries.of(t, d);
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(ts, daily);
assertEquals(result.size(), daily.length);
final int offset = 16;
int i = 0;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(entry.getKey(), daily[i]);
if (i < 16) {
assertEquals(entry.getValue(), offset, 0);
} else {
assertEquals(entry.getValue(), i, 0);
}
i++;
}
}
@Test
public void testNoMissingDataDaily() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_NO_MISSING_DATA, DAILY_SCHEDULE);
assertEquals(result.size(), DAILY_SCHEDULE.length);
int i = 0;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(entry.getKey(), DAILY_SCHEDULE[i]);
assertEquals(entry.getValue(), i++, 0);
}
}
@Test
public void testMissingDataWeekly() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_TWO_MISSING_DATA_POINTS, MONDAY_SCHEDULE);
assertEquals(result.size(), MONDAY_SCHEDULE.length);
int i = 0;
int j = 2;
for (final Entry<LocalDate, Double> entry : result) {
assertEquals(entry.getKey(), MONDAY_SCHEDULE[i++]);
if (entry.getKey().equals(MISSING_DAY_MONDAY_1) || entry.getKey().equals(MISSING_DAY_MONDAY_2)) {
assertEquals(entry.getValue(), j - 1, 0);
} else {
assertEquals(entry.getValue(), j, 0);
}
j += 5;
}
}
@Test
public void testDaysMissingDataDaily() {
final LocalDateDoubleTimeSeries result = F.getSampledTimeSeries(TS_TWO_MISSING_DATA_POINTS, 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_MONDAY_1) || entry.getKey().equals(MISSING_DAY_MONDAY_2)) {
assertEquals(entry.getValue(), i - 1, 0);
} else {
assertEquals(entry.getValue(), i, 0);
}
i++;
}
}
}