/**
* 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.PeriodAdditionConventions.LAST_BUSINESS_DAY;
import static com.opengamma.strata.basics.date.PeriodAdditionConventions.LAST_DAY;
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 org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.time.Period;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.opengamma.strata.basics.ReferenceData;
/**
* Test {@link PeriodAdjustment}.
*/
@Test
public class PeriodAdjustmentTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final PeriodAdditionConvention PAC_NONE = PeriodAdditionConventions.NONE;
private static final BusinessDayAdjustment BDA_NONE = BusinessDayAdjustment.NONE;
private static final BusinessDayAdjustment BDA_FOLLOW_SAT_SUN =
BusinessDayAdjustment.of(BusinessDayConventions.FOLLOWING, HolidayCalendarIds.SAT_SUN);
//-------------------------------------------------------------------------
public void test_NONE() {
PeriodAdjustment test = PeriodAdjustment.NONE;
assertEquals(test.getPeriod(), Period.ZERO);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "P0D");
}
//-------------------------------------------------------------------------
public void test_of_additionConventionNone() {
PeriodAdjustment test = PeriodAdjustment.of(Period.of(1, 2, 3), PAC_NONE, BDA_NONE);
assertEquals(test.getPeriod(), Period.of(1, 2, 3));
assertEquals(test.getAdditionConvention(), PAC_NONE);
assertEquals(test.getAdjustment(), BDA_NONE);
assertEquals(test.toString(), "P1Y2M3D");
}
public void test_of_additionConventionLastDay() {
PeriodAdjustment test = PeriodAdjustment.of(Period.ofMonths(3), LAST_DAY, BDA_FOLLOW_SAT_SUN);
assertEquals(test.getPeriod(), Period.ofMonths(3));
assertEquals(test.getAdditionConvention(), LAST_DAY);
assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN);
assertEquals(test.toString(), "P3M with LastDay then apply Following using calendar Sat/Sun");
}
public void test_ofLastDay() {
PeriodAdjustment test = PeriodAdjustment.ofLastDay(Period.ofMonths(3), BDA_FOLLOW_SAT_SUN);
assertEquals(test.getPeriod(), Period.ofMonths(3));
assertEquals(test.getAdditionConvention(), LAST_DAY);
assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN);
assertEquals(test.toString(), "P3M with LastDay then apply Following using calendar Sat/Sun");
}
public void test_ofLastBusinessDay() {
PeriodAdjustment test = PeriodAdjustment.ofLastBusinessDay(Period.ofMonths(3), BDA_FOLLOW_SAT_SUN);
assertEquals(test.getPeriod(), Period.ofMonths(3));
assertEquals(test.getAdditionConvention(), LAST_BUSINESS_DAY);
assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN);
assertEquals(test.toString(), "P3M with LastBusinessDay then apply Following using calendar Sat/Sun");
}
public void test_of_invalid_conventionForPeriod() {
Period period = Period.of(1, 2, 3);
assertThrowsIllegalArg(() -> PeriodAdjustment.of(period, LAST_DAY, BDA_NONE));
assertThrowsIllegalArg(() -> PeriodAdjustment.of(period, LAST_BUSINESS_DAY, BDA_NONE));
assertThrowsIllegalArg(() -> PeriodAdjustment.ofLastDay(period, BDA_NONE));
assertThrowsIllegalArg(() -> PeriodAdjustment.ofLastBusinessDay(period, BDA_NONE));
}
//-------------------------------------------------------------------------
@DataProvider(name = "adjust")
static Object[][] data_adjust() {
return new Object[][] {
// not last day
{0, date(2014, 8, 15), date(2014, 8, 15)},
{1, date(2014, 8, 15), date(2014, 9, 15)},
{2, date(2014, 8, 15), date(2014, 10, 15)},
{3, date(2014, 8, 15), date(2014, 11, 17)},
{-1, date(2014, 8, 15), date(2014, 7, 15)},
{-2, date(2014, 8, 15), date(2014, 6, 16)},
// last day
{1, date(2014, 2, 28), date(2014, 3, 31)},
{1, date(2014, 6, 30), date(2014, 7, 31)},
};
}
@Test(dataProvider = "adjust")
public void test_adjust(int months, LocalDate date, LocalDate expected) {
PeriodAdjustment test = PeriodAdjustment.of(Period.ofMonths(months), LAST_DAY, BDA_FOLLOW_SAT_SUN);
assertEquals(test.adjust(date, REF_DATA), expected);
assertEquals(test.resolve(REF_DATA).adjust(date), expected);
}
//-------------------------------------------------------------------------
public void equals() {
PeriodAdjustment a = PeriodAdjustment.of(Period.ofMonths(3), LAST_DAY, BDA_FOLLOW_SAT_SUN);
PeriodAdjustment b = PeriodAdjustment.of(Period.ofMonths(1), LAST_DAY, BDA_FOLLOW_SAT_SUN);
PeriodAdjustment c = PeriodAdjustment.of(Period.ofMonths(3), PAC_NONE, BDA_FOLLOW_SAT_SUN);
PeriodAdjustment d = PeriodAdjustment.of(Period.ofMonths(3), LAST_DAY, BDA_NONE);
assertEquals(a.equals(b), false);
assertEquals(a.equals(c), false);
assertEquals(a.equals(d), false);
}
//-------------------------------------------------------------------------
public void test_beanBuilder() {
PeriodAdjustment test = PeriodAdjustment.builder()
.period(Period.ofMonths(3))
.additionConvention(LAST_DAY)
.adjustment(BDA_FOLLOW_SAT_SUN)
.build();
assertEquals(test.getPeriod(), Period.ofMonths(3));
assertEquals(test.getAdditionConvention(), LAST_DAY);
assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN);
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(PeriodAdjustment.of(Period.ofMonths(3), LAST_DAY, BDA_FOLLOW_SAT_SUN));
}
public void test_serialization() {
assertSerialization(PeriodAdjustment.of(Period.ofMonths(3), LAST_DAY, BDA_FOLLOW_SAT_SUN));
}
}