/** * 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.basics.date.Tenor.TENOR_1M; import static com.opengamma.strata.basics.date.Tenor.TENOR_1W; import static com.opengamma.strata.basics.date.Tenor.TENOR_3M; 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 TenorAdjustment}. */ @Test public class TenorAdjustmentTest { 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_of_additionConventionNone() { TenorAdjustment test = TenorAdjustment.of(Tenor.of(Period.of(1, 2, 3)), PAC_NONE, BDA_NONE); assertEquals(test.getTenor(), Tenor.of(Period.of(1, 2, 3))); assertEquals(test.getAdditionConvention(), PAC_NONE); assertEquals(test.getAdjustment(), BDA_NONE); assertEquals(test.toString(), "1Y2M3D"); } public void test_of_additionConventionLastDay() { TenorAdjustment test = TenorAdjustment.of(TENOR_3M, LAST_DAY, BDA_FOLLOW_SAT_SUN); assertEquals(test.getTenor(), TENOR_3M); assertEquals(test.getAdditionConvention(), LAST_DAY); assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN); assertEquals(test.toString(), "3M with LastDay then apply Following using calendar Sat/Sun"); } public void test_ofLastDay() { TenorAdjustment test = TenorAdjustment.ofLastDay(TENOR_3M, BDA_FOLLOW_SAT_SUN); assertEquals(test.getTenor(), TENOR_3M); assertEquals(test.getAdditionConvention(), LAST_DAY); assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN); assertEquals(test.toString(), "3M with LastDay then apply Following using calendar Sat/Sun"); } public void test_ofLastBusinessDay() { TenorAdjustment test = TenorAdjustment.ofLastBusinessDay(TENOR_3M, BDA_FOLLOW_SAT_SUN); assertEquals(test.getTenor(), TENOR_3M); assertEquals(test.getAdditionConvention(), LAST_BUSINESS_DAY); assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN); assertEquals(test.toString(), "3M with LastBusinessDay then apply Following using calendar Sat/Sun"); } public void test_of_invalid_conventionForPeriod() { assertThrowsIllegalArg(() -> TenorAdjustment.of(TENOR_1W, LAST_DAY, BDA_NONE)); assertThrowsIllegalArg(() -> TenorAdjustment.of(TENOR_1W, LAST_BUSINESS_DAY, BDA_NONE)); assertThrowsIllegalArg(() -> TenorAdjustment.ofLastDay(TENOR_1W, BDA_NONE)); assertThrowsIllegalArg(() -> TenorAdjustment.ofLastBusinessDay(TENOR_1W, BDA_NONE)); } //------------------------------------------------------------------------- @DataProvider(name = "adjust") static Object[][] data_adjust() { return new Object[][] { // not last day {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)}, // 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) { TenorAdjustment test = TenorAdjustment.of(Tenor.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() { TenorAdjustment a = TenorAdjustment.of(TENOR_3M, LAST_DAY, BDA_FOLLOW_SAT_SUN); TenorAdjustment b = TenorAdjustment.of(TENOR_1M, LAST_DAY, BDA_FOLLOW_SAT_SUN); TenorAdjustment c = TenorAdjustment.of(TENOR_3M, PAC_NONE, BDA_FOLLOW_SAT_SUN); TenorAdjustment d = TenorAdjustment.of(TENOR_3M, LAST_DAY, BDA_NONE); assertEquals(a.equals(b), false); assertEquals(a.equals(c), false); assertEquals(a.equals(d), false); } //------------------------------------------------------------------------- public void test_beanBuilder() { TenorAdjustment test = TenorAdjustment.builder() .tenor(TENOR_3M) .additionConvention(LAST_DAY) .adjustment(BDA_FOLLOW_SAT_SUN) .build(); assertEquals(test.getTenor(), TENOR_3M); assertEquals(test.getAdditionConvention(), LAST_DAY); assertEquals(test.getAdjustment(), BDA_FOLLOW_SAT_SUN); } //------------------------------------------------------------------------- public void coverage() { coverImmutableBean(TenorAdjustment.of(TENOR_3M, LAST_DAY, BDA_FOLLOW_SAT_SUN)); } public void test_serialization() { assertSerialization(TenorAdjustment.of(TENOR_3M, LAST_DAY, BDA_FOLLOW_SAT_SUN)); } }