/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.basics.date;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.NO_HOLIDAYS;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.SAT_SUN;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static com.opengamma.strata.collect.TestHelper.date;
import static java.time.DayOfWeek.THURSDAY;
import static java.time.DayOfWeek.WEDNESDAY;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.opengamma.strata.basics.ImmutableReferenceData;
import com.opengamma.strata.basics.ReferenceData;
/**
* Test {@link DaysAdjustment}.
*/
@Test
public class DaysAdjustmentTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final HolidayCalendarId WED_THU = HolidayCalendarId.of("WedThu");
private static final BusinessDayAdjustment BDA_NONE = BusinessDayAdjustment.NONE;
private static final BusinessDayAdjustment BDA_FOLLOW_SAT_SUN =
BusinessDayAdjustment.of(BusinessDayConventions.FOLLOWING, SAT_SUN);
private static final BusinessDayAdjustment BDA_FOLLOW_WED_THU =
BusinessDayAdjustment.of(BusinessDayConventions.FOLLOWING, WED_THU);
//-------------------------------------------------------------------------
public void test_NONE() {
DaysAdjustment test = DaysAdjustment.NONE;
assertEquals(test.getDays(), 0);
assertEquals(test.getCalendar(), NO_HOLIDAYS);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "0 calendar days");
}
//-------------------------------------------------------------------------
public void test_ofCalendarDays1_oneDay() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(1);
assertEquals(test.getDays(), 1);
assertEquals(test.getCalendar(), NO_HOLIDAYS);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "1 calendar day");
}
public void test_ofCalendarDays1_threeDays() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(3);
assertEquals(test.getDays(), 3);
assertEquals(test.getCalendar(), NO_HOLIDAYS);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "3 calendar days");
}
public void test_ofCalendarDays1_adjust() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(2);
LocalDate base = date(2014, 8, 15); // Fri
assertEquals(test.adjust(base, REF_DATA), date(2014, 8, 17)); // Sun
assertEquals(test.resolve(REF_DATA).adjust(base), date(2014, 8, 17)); // Sun
}
public void test_ofCalendarDays2_oneDay() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(1, BDA_FOLLOW_SAT_SUN);
assertEquals(test.getDays(), 1);
assertEquals(test.getCalendar(), NO_HOLIDAYS);
assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN);
assertEquals(test.toString(), "1 calendar day then apply Following using calendar Sat/Sun");
}
public void test_ofCalendarDays2_fourDays() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(4, BDA_FOLLOW_SAT_SUN);
assertEquals(test.getDays(), 4);
assertEquals(test.getCalendar(), NO_HOLIDAYS);
assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN);
assertEquals(test.toString(), "4 calendar days then apply Following using calendar Sat/Sun");
}
public void test_ofCalendarDays2_adjust() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(2, BDA_FOLLOW_SAT_SUN);
LocalDate base = date(2014, 8, 15); // Fri
assertEquals(test.adjust(base, REF_DATA), date(2014, 8, 18)); // Mon
assertEquals(test.resolve(REF_DATA).adjust(base), date(2014, 8, 18)); // Mon
}
public void test_ofCalendarDays2_null() {
assertThrowsIllegalArg(() -> DaysAdjustment.ofCalendarDays(2, null));
}
//-------------------------------------------------------------------------
public void test_ofBusinessDays2_oneDay() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(1, SAT_SUN);
assertEquals(test.getDays(), 1);
assertEquals(test.getCalendar(), SAT_SUN);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "1 business day using calendar Sat/Sun");
}
public void test_ofBusinessDays2_threeDays() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(3, SAT_SUN);
assertEquals(test.getDays(), 3);
assertEquals(test.getCalendar(), SAT_SUN);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "3 business days using calendar Sat/Sun");
}
public void test_ofBusinessDays2_adjust() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(2, SAT_SUN);
LocalDate base = date(2014, 8, 15); // Fri
assertEquals(test.adjust(base, REF_DATA), date(2014, 8, 19)); // Tue
assertEquals(test.resolve(REF_DATA).adjust(base), date(2014, 8, 19)); // Tue
}
public void test_ofBusinessDays2_null() {
assertThrowsIllegalArg(() -> DaysAdjustment.ofBusinessDays(2, null));
}
//-------------------------------------------------------------------------
public void test_ofBusinessDays3_oneDay() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(1, SAT_SUN, BDA_FOLLOW_WED_THU);
assertEquals(test.getDays(), 1);
assertEquals(test.getCalendar(), SAT_SUN);
assertEquals(test.getAdjustment(), BDA_FOLLOW_WED_THU);
assertEquals(test.toString(), "1 business day using calendar Sat/Sun then apply Following using " +
"calendar WedThu");
}
public void test_ofBusinessDays3_fourDays() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(4, SAT_SUN, BDA_FOLLOW_WED_THU);
assertEquals(test.getDays(), 4);
assertEquals(test.getCalendar(), SAT_SUN);
assertEquals(test.getAdjustment(), BDA_FOLLOW_WED_THU);
assertEquals(test.toString(), "4 business days using calendar Sat/Sun then apply Following using " +
"calendar WedThu");
}
public void test_ofBusinessDays3_adjust() {
ImmutableHolidayCalendar cal = ImmutableHolidayCalendar.of(WED_THU, ImmutableList.of(), WEDNESDAY, THURSDAY);
ReferenceData refData = ImmutableReferenceData.of(ImmutableMap.of(WED_THU, cal)).combinedWith(REF_DATA);
DaysAdjustment test = DaysAdjustment.ofBusinessDays(3, SAT_SUN, BDA_FOLLOW_WED_THU);
LocalDate base = date(2014, 8, 15); // Fri
assertEquals(test.adjust(base, refData), date(2014, 8, 22)); // Fri (3 days gives Wed, following moves to Fri)
assertEquals(test.resolve(refData).adjust(base), date(2014, 8, 22)); // Fri (3 days gives Wed, following moves to Fri)
}
public void test_ofBusinessDays3_null() {
assertThrowsIllegalArg(() -> DaysAdjustment.ofBusinessDays(3, null, BDA_FOLLOW_SAT_SUN));
assertThrowsIllegalArg(() -> DaysAdjustment.ofBusinessDays(3, SAT_SUN, null));
assertThrowsIllegalArg(() -> DaysAdjustment.ofBusinessDays(3, null, null));
}
//-------------------------------------------------------------------------
public void test_getResultCalendar1() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(3, SAT_SUN);
assertEquals(test.getResultCalendar(), SAT_SUN);
}
public void test_getResultCalendar2() {
DaysAdjustment test = DaysAdjustment.ofBusinessDays(3, SAT_SUN, BDA_FOLLOW_WED_THU);
assertEquals(test.getResultCalendar(), WED_THU);
}
public void test_getResultCalendar3() {
DaysAdjustment test = DaysAdjustment.ofCalendarDays(3);
assertEquals(test.getResultCalendar(), NO_HOLIDAYS);
}
//-------------------------------------------------------------------------
public void test_normalized() {
DaysAdjustment zeroDays = DaysAdjustment.ofCalendarDays(0, BDA_FOLLOW_SAT_SUN);
DaysAdjustment zeroDaysWithCalendar = DaysAdjustment.ofBusinessDays(0, WED_THU, BDA_FOLLOW_SAT_SUN);
DaysAdjustment twoDays = DaysAdjustment.ofCalendarDays(2, BDA_FOLLOW_SAT_SUN);
DaysAdjustment twoDaysWithCalendar = DaysAdjustment.ofBusinessDays(2, WED_THU, BDA_FOLLOW_SAT_SUN);
DaysAdjustment twoDaysWithSameCalendar = DaysAdjustment.ofBusinessDays(2, SAT_SUN, BDA_FOLLOW_SAT_SUN);
DaysAdjustment twoDaysWithNoAdjust = DaysAdjustment.ofBusinessDays(2, SAT_SUN);
assertEquals(zeroDays.normalized(), zeroDays);
assertEquals(zeroDaysWithCalendar.normalized(), zeroDays);
assertEquals(twoDays.normalized(), twoDays);
assertEquals(twoDaysWithCalendar.normalized(), twoDaysWithCalendar);
assertEquals(twoDaysWithSameCalendar.normalized(), twoDaysWithNoAdjust);
assertEquals(twoDaysWithNoAdjust.normalized(), twoDaysWithNoAdjust);
}
//-------------------------------------------------------------------------
public void equals() {
DaysAdjustment a = DaysAdjustment.ofBusinessDays(3, NO_HOLIDAYS, BDA_FOLLOW_SAT_SUN);
DaysAdjustment b = DaysAdjustment.ofBusinessDays(4, NO_HOLIDAYS, BDA_FOLLOW_SAT_SUN);
DaysAdjustment c = DaysAdjustment.ofBusinessDays(3, WED_THU, BDA_FOLLOW_SAT_SUN);
DaysAdjustment d = DaysAdjustment.ofBusinessDays(3, NO_HOLIDAYS, BDA_FOLLOW_WED_THU);
assertEquals(a.equals(b), false);
assertEquals(a.equals(c), false);
assertEquals(a.equals(d), false);
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(DaysAdjustment.ofCalendarDays(4, BDA_FOLLOW_SAT_SUN));
}
public void coverage_builder() {
DaysAdjustment test = DaysAdjustment.builder()
.days(1)
.calendar(SAT_SUN)
.adjustment(BDA_FOLLOW_WED_THU)
.build();
assertEquals(test.getDays(), 1);
assertEquals(test.getCalendar(), SAT_SUN);
assertEquals(test.getAdjustment(), BDA_FOLLOW_WED_THU);
}
public void test_serialization() {
assertSerialization(DaysAdjustment.ofCalendarDays(4, BDA_FOLLOW_SAT_SUN));
}
}