/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.basics.schedule; import static com.opengamma.strata.basics.schedule.Frequency.P1M; import static com.opengamma.strata.basics.schedule.Frequency.P2M; import static com.opengamma.strata.basics.schedule.Frequency.P3M; import static com.opengamma.strata.basics.schedule.RollConventions.DAY_18; 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.Month.AUGUST; import static java.time.Month.JULY; import static java.time.Month.JUNE; import static java.time.Month.SEPTEMBER; import static org.testng.Assert.assertEquals; import java.time.LocalDate; import java.time.Period; import org.testng.annotations.Test; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.date.BusinessDayAdjustment; import com.opengamma.strata.basics.date.DayCounts; /** * Test {@link SchedulePeriod}. */ @Test public class SchedulePeriodTest { private static final ReferenceData REF_DATA = ReferenceData.standard(); private static final LocalDate JUN_15 = date(2014, JUNE, 15); // Sunday private static final LocalDate JUN_16 = date(2014, JUNE, 16); private static final LocalDate JUN_17 = date(2014, JUNE, 17); private static final LocalDate JUN_18 = date(2014, JUNE, 18); private static final LocalDate JUL_04 = date(2014, JULY, 4); private static final LocalDate JUL_05 = date(2014, JULY, 5); private static final LocalDate JUL_17 = date(2014, JULY, 17); private static final LocalDate JUL_18 = date(2014, JULY, 18); private static final LocalDate AUG_17 = date(2014, AUGUST, 17); // Sunday private static final LocalDate AUG_18 = date(2014, AUGUST, 18); // Monday private static final LocalDate SEP_17 = date(2014, SEPTEMBER, 17); private static final double TOLERANCE = 1.0E-6; //------------------------------------------------------------------------- public void test_of_null() { assertThrowsIllegalArg(() -> SchedulePeriod.of(null, JUL_18, JUL_04, JUL_17)); assertThrowsIllegalArg(() -> SchedulePeriod.of(JUL_05, null, JUL_04, JUL_17)); assertThrowsIllegalArg(() -> SchedulePeriod.of(JUL_05, JUL_18, null, JUL_17)); assertThrowsIllegalArg(() -> SchedulePeriod.of(JUL_05, JUL_18, JUL_04, null)); assertThrowsIllegalArg(() -> SchedulePeriod.of(null, null, null, null)); } public void test_of_all() { SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17); assertEquals(test.getStartDate(), JUL_05); assertEquals(test.getEndDate(), JUL_18); assertEquals(test.getUnadjustedStartDate(), JUL_04); assertEquals(test.getUnadjustedEndDate(), JUL_17); } public void test_of_noUnadjusted() { SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18); assertEquals(test.getStartDate(), JUL_05); assertEquals(test.getEndDate(), JUL_18); assertEquals(test.getUnadjustedStartDate(), JUL_05); assertEquals(test.getUnadjustedEndDate(), JUL_18); } public void test_builder_defaults() { SchedulePeriod test = SchedulePeriod.builder() .startDate(JUL_05) .endDate(JUL_18) .build(); assertEquals(test.getStartDate(), JUL_05); assertEquals(test.getEndDate(), JUL_18); assertEquals(test.getUnadjustedStartDate(), JUL_05); assertEquals(test.getUnadjustedEndDate(), JUL_18); } //------------------------------------------------------------------------- public void test_yearFraction() { SchedulePeriod test = SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17); Schedule schedule = Schedule.ofTerm(test); assertEquals( test.yearFraction(DayCounts.ACT_360, schedule), DayCounts.ACT_360.yearFraction(JUN_16, JUL_18, schedule), TOLERANCE); } public void test_yearFraction_null() { SchedulePeriod test = SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17); Schedule schedule = Schedule.ofTerm(test); assertThrowsIllegalArg(() -> test.yearFraction(null, schedule)); assertThrowsIllegalArg(() -> test.yearFraction(DayCounts.ACT_360, null)); assertThrowsIllegalArg(() -> test.yearFraction(null, null)); } //------------------------------------------------------------------------- public void test_length() { assertEquals(SchedulePeriod.of(JUN_16, JUN_18, JUN_16, JUN_18).length(), Period.between(JUN_16, JUN_18)); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).length(), Period.between(JUN_16, JUL_18)); } //------------------------------------------------------------------------- public void test_lengthInDays() { assertEquals(SchedulePeriod.of(JUN_16, JUN_18, JUN_16, JUN_18).lengthInDays(), 2); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).lengthInDays(), 32); } //------------------------------------------------------------------------- public void test_isRegular() { assertEquals(SchedulePeriod.of(JUN_18, JUL_18).isRegular(P1M, DAY_18), true); assertEquals(SchedulePeriod.of(JUN_18, JUL_05).isRegular(P1M, DAY_18), false); assertEquals(SchedulePeriod.of(JUL_05, JUL_18).isRegular(P1M, DAY_18), false); assertEquals(SchedulePeriod.of(JUN_18, JUL_05).isRegular(P2M, DAY_18), false); } public void test_isRegular_null() { SchedulePeriod test = SchedulePeriod.of(JUN_16, JUL_18); assertThrowsIllegalArg(() -> test.isRegular(null, DAY_18)); assertThrowsIllegalArg(() -> test.isRegular(P1M, null)); assertThrowsIllegalArg(() -> test.isRegular(null, null)); } //------------------------------------------------------------------------- public void test_contains() { assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUN_15), false); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUN_16), true); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUL_05), true); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUL_17), true); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).contains(JUL_18), false); } public void test_contains_null() { SchedulePeriod test = SchedulePeriod.of(JUN_16, JUL_18); assertThrowsIllegalArg(() -> test.contains(null)); } //------------------------------------------------------------------------- public void test_subSchedule_1monthIn3Month() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P1M, RollConventions.DAY_17, StubConvention.NONE, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 3); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, JUL_17)); assertEquals(schedule.getPeriod(1), SchedulePeriod.of(JUL_17, AUG_17)); assertEquals(schedule.getPeriod(2), SchedulePeriod.of(AUG_17, SEP_17)); assertEquals(schedule.getFrequency(), P1M); assertEquals(schedule.getRollConvention(), RollConventions.DAY_17); } public void test_subSchedule_3monthIn3Month() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P3M, RollConventions.DAY_17, StubConvention.NONE, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 1); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, SEP_17)); } public void test_subSchedule_2monthIn3Month_shortInitial() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P2M, RollConventions.DAY_17, StubConvention.SHORT_INITIAL, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 2); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, JUL_17)); assertEquals(schedule.getPeriod(1), SchedulePeriod.of(JUL_17, SEP_17)); assertEquals(schedule.getFrequency(), P2M); assertEquals(schedule.getRollConvention(), RollConventions.DAY_17); } public void test_subSchedule_2monthIn3Month_shortFinal() { SchedulePeriod test = SchedulePeriod.of(JUN_17, SEP_17); Schedule schedule = test.subSchedule(P2M, RollConventions.DAY_17, StubConvention.SHORT_FINAL, BusinessDayAdjustment.NONE) .createSchedule(REF_DATA); assertEquals(schedule.size(), 2); assertEquals(schedule.getPeriod(0), SchedulePeriod.of(JUN_17, AUG_17)); assertEquals(schedule.getPeriod(1), SchedulePeriod.of(AUG_17, SEP_17)); assertEquals(schedule.getFrequency(), P2M); assertEquals(schedule.getRollConvention(), RollConventions.DAY_17); } //------------------------------------------------------------------------- public void test_toAdjusted() { SchedulePeriod test1 = SchedulePeriod.of(JUN_15, SEP_17); assertEquals(test1.toAdjusted(date -> date), test1); assertEquals(test1.toAdjusted(date -> date.equals(JUN_15) ? JUN_16 : date), SchedulePeriod.of(JUN_16, SEP_17, JUN_15, SEP_17)); SchedulePeriod test2 = SchedulePeriod.of(JUN_16, AUG_17); assertEquals(test2.toAdjusted(date -> date.equals(AUG_17) ? AUG_18 : date), SchedulePeriod.of(JUN_16, AUG_18, JUN_16, AUG_17)); } public void test_toUnadjusted() { assertEquals(SchedulePeriod.of(JUN_15, SEP_17).toUnadjusted(), SchedulePeriod.of(JUN_15, SEP_17)); assertEquals(SchedulePeriod.of(JUN_16, SEP_17, JUN_15, SEP_17).toUnadjusted(), SchedulePeriod.of(JUN_15, SEP_17)); assertEquals(SchedulePeriod.of(JUN_16, JUL_18, JUN_16, JUL_17).toUnadjusted(), SchedulePeriod.of(JUN_16, JUL_17)); } //------------------------------------------------------------------------- public void test_compareTo() { SchedulePeriod a = SchedulePeriod.of(JUL_05, JUL_18); SchedulePeriod b = SchedulePeriod.of(JUL_04, JUL_18); SchedulePeriod c = SchedulePeriod.of(JUL_05, JUL_17); assertEquals(a.compareTo(a) == 0, true); assertEquals(a.compareTo(b) > 0, true); assertEquals(a.compareTo(c) > 0, true); assertEquals(b.compareTo(a) < 0, true); assertEquals(b.compareTo(b) == 0, true); assertEquals(b.compareTo(c) < 0, true); assertEquals(c.compareTo(a) < 0, true); assertEquals(c.compareTo(b) > 0, true); assertEquals(c.compareTo(c) == 0, true); } //------------------------------------------------------------------------- public void coverage_equals() { SchedulePeriod a1 = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17); SchedulePeriod a2 = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17); SchedulePeriod b = SchedulePeriod.of(JUL_04, JUL_18, JUL_04, JUL_17); SchedulePeriod c = SchedulePeriod.of(JUL_05, JUL_17, JUL_04, JUL_17); SchedulePeriod d = SchedulePeriod.of(JUL_05, JUL_18, JUL_05, JUL_17); SchedulePeriod e = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_18); assertEquals(a1.equals(a1), true); assertEquals(a1.equals(a2), true); assertEquals(a1.equals(b), false); assertEquals(a1.equals(c), false); assertEquals(a1.equals(d), false); assertEquals(a1.equals(e), false); } //------------------------------------------------------------------------- public void coverage_builder() { SchedulePeriod.Builder builder = SchedulePeriod.builder(); builder .startDate(JUL_05) .endDate(JUL_18) .unadjustedStartDate(JUL_04) .unadjustedEndDate(JUL_17) .build(); } //------------------------------------------------------------------------- public void coverage() { SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17); coverImmutableBean(test); } public void test_serialization() { SchedulePeriod test = SchedulePeriod.of(JUL_05, JUL_18, JUL_04, JUL_17); assertSerialization(test); } }