/**
* 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.BusinessDayConventions.FOLLOWING;
import static com.opengamma.strata.basics.date.BusinessDayConventions.MODIFIED_FOLLOWING;
import static com.opengamma.strata.basics.date.BusinessDayConventions.MODIFIED_FOLLOWING_BI_MONTHLY;
import static com.opengamma.strata.basics.date.BusinessDayConventions.MODIFIED_PRECEDING;
import static com.opengamma.strata.basics.date.BusinessDayConventions.NEAREST;
import static com.opengamma.strata.basics.date.BusinessDayConventions.NO_ADJUST;
import static com.opengamma.strata.basics.date.BusinessDayConventions.PRECEDING;
import static com.opengamma.strata.collect.TestHelper.assertJodaConvert;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverEnum;
import static com.opengamma.strata.collect.TestHelper.coverPrivateConstructor;
import static java.time.DayOfWeek.SATURDAY;
import static java.time.DayOfWeek.SUNDAY;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
/**
* Test {@link BusinessDayConvention}.
*/
@Test
public class BusinessDayConventionTest {
private static final LocalDate FRI_2014_07_11 = LocalDate.of(2014, 7, 11);
private static final LocalDate SAT_2014_07_12 = LocalDate.of(2014, 7, 12);
private static final LocalDate SUN_2014_07_13 = LocalDate.of(2014, 7, 13);
private static final LocalDate MON_2014_07_14 = LocalDate.of(2014, 7, 14);
private static final LocalDate TUE_2014_07_15 = LocalDate.of(2014, 7, 15);
private static final LocalDate FRI_2014_08_29 = LocalDate.of(2014, 8, 29);
private static final LocalDate SAT_2014_08_30 = LocalDate.of(2014, 8, 30);
private static final LocalDate SUN_2014_08_31 = LocalDate.of(2014, 8, 31);
private static final LocalDate MON_2014_09_01 = LocalDate.of(2014, 9, 1);
private static final LocalDate FRI_2014_10_31 = LocalDate.of(2014, 10, 31);
private static final LocalDate SAT_2014_11_01 = LocalDate.of(2014, 11, 1);
private static final LocalDate SUN_2014_11_02 = LocalDate.of(2014, 11, 2);
private static final LocalDate MON_2014_11_03 = LocalDate.of(2014, 11, 3);
private static final LocalDate FRI_2014_11_14 = LocalDate.of(2014, 11, 14);
private static final LocalDate SAT_2014_11_15 = LocalDate.of(2014, 11, 15);
private static final LocalDate SUN_2014_11_16 = LocalDate.of(2014, 11, 16);
private static final LocalDate MON_2014_11_17 = LocalDate.of(2014, 11, 17);
//-------------------------------------------------------------------------
@DataProvider(name = "convention")
static Object[][] data_convention() {
return new Object[][] {
{NO_ADJUST, FRI_2014_07_11, FRI_2014_07_11},
{NO_ADJUST, SAT_2014_07_12, SAT_2014_07_12},
{NO_ADJUST, SUN_2014_07_13, SUN_2014_07_13},
{NO_ADJUST, MON_2014_07_14, MON_2014_07_14},
{FOLLOWING, FRI_2014_07_11, FRI_2014_07_11},
{FOLLOWING, SAT_2014_07_12, MON_2014_07_14},
{FOLLOWING, SUN_2014_07_13, MON_2014_07_14},
{FOLLOWING, MON_2014_07_14, MON_2014_07_14},
{FOLLOWING, FRI_2014_08_29, FRI_2014_08_29},
{FOLLOWING, SAT_2014_08_30, MON_2014_09_01},
{FOLLOWING, SUN_2014_08_31, MON_2014_09_01},
{FOLLOWING, MON_2014_09_01, MON_2014_09_01},
{FOLLOWING, FRI_2014_10_31, FRI_2014_10_31},
{FOLLOWING, SAT_2014_11_01, MON_2014_11_03},
{FOLLOWING, SUN_2014_11_02, MON_2014_11_03},
{FOLLOWING, MON_2014_11_03, MON_2014_11_03},
{MODIFIED_FOLLOWING, FRI_2014_07_11, FRI_2014_07_11},
{MODIFIED_FOLLOWING, SAT_2014_07_12, MON_2014_07_14},
{MODIFIED_FOLLOWING, SUN_2014_07_13, MON_2014_07_14},
{MODIFIED_FOLLOWING, MON_2014_07_14, MON_2014_07_14},
{MODIFIED_FOLLOWING, FRI_2014_08_29, FRI_2014_08_29},
{MODIFIED_FOLLOWING, SAT_2014_08_30, FRI_2014_08_29}, // modified
{MODIFIED_FOLLOWING, SUN_2014_08_31, FRI_2014_08_29}, // modified
{MODIFIED_FOLLOWING, MON_2014_09_01, MON_2014_09_01},
{MODIFIED_FOLLOWING, FRI_2014_10_31, FRI_2014_10_31},
{MODIFIED_FOLLOWING, SAT_2014_11_01, MON_2014_11_03},
{MODIFIED_FOLLOWING, SUN_2014_11_02, MON_2014_11_03},
{MODIFIED_FOLLOWING, MON_2014_11_03, MON_2014_11_03},
{MODIFIED_FOLLOWING_BI_MONTHLY, FRI_2014_07_11, FRI_2014_07_11},
{MODIFIED_FOLLOWING_BI_MONTHLY, SAT_2014_07_12, MON_2014_07_14},
{MODIFIED_FOLLOWING_BI_MONTHLY, SUN_2014_07_13, MON_2014_07_14},
{MODIFIED_FOLLOWING_BI_MONTHLY, MON_2014_07_14, MON_2014_07_14},
{MODIFIED_FOLLOWING_BI_MONTHLY, FRI_2014_08_29, FRI_2014_08_29},
{MODIFIED_FOLLOWING_BI_MONTHLY, SAT_2014_08_30, FRI_2014_08_29}, // modified
{MODIFIED_FOLLOWING_BI_MONTHLY, SUN_2014_08_31, FRI_2014_08_29}, // modified
{MODIFIED_FOLLOWING_BI_MONTHLY, MON_2014_09_01, MON_2014_09_01},
{MODIFIED_FOLLOWING_BI_MONTHLY, FRI_2014_10_31, FRI_2014_10_31},
{MODIFIED_FOLLOWING_BI_MONTHLY, SAT_2014_11_01, MON_2014_11_03},
{MODIFIED_FOLLOWING_BI_MONTHLY, SUN_2014_11_02, MON_2014_11_03},
{MODIFIED_FOLLOWING_BI_MONTHLY, MON_2014_11_03, MON_2014_11_03},
{MODIFIED_FOLLOWING_BI_MONTHLY, FRI_2014_11_14, FRI_2014_11_14},
{MODIFIED_FOLLOWING_BI_MONTHLY, SAT_2014_11_15, FRI_2014_11_14}, // modified
{MODIFIED_FOLLOWING_BI_MONTHLY, SUN_2014_11_16, MON_2014_11_17},
{MODIFIED_FOLLOWING_BI_MONTHLY, MON_2014_11_17, MON_2014_11_17},
{PRECEDING, FRI_2014_07_11, FRI_2014_07_11},
{PRECEDING, SAT_2014_07_12, FRI_2014_07_11},
{PRECEDING, SUN_2014_07_13, FRI_2014_07_11},
{PRECEDING, MON_2014_07_14, MON_2014_07_14},
{PRECEDING, FRI_2014_08_29, FRI_2014_08_29},
{PRECEDING, SAT_2014_08_30, FRI_2014_08_29},
{PRECEDING, SUN_2014_08_31, FRI_2014_08_29},
{PRECEDING, MON_2014_09_01, MON_2014_09_01},
{PRECEDING, FRI_2014_10_31, FRI_2014_10_31},
{PRECEDING, SAT_2014_11_01, FRI_2014_10_31},
{PRECEDING, SUN_2014_11_02, FRI_2014_10_31},
{PRECEDING, MON_2014_11_03, MON_2014_11_03},
{MODIFIED_PRECEDING, FRI_2014_07_11, FRI_2014_07_11},
{MODIFIED_PRECEDING, SAT_2014_07_12, FRI_2014_07_11},
{MODIFIED_PRECEDING, SUN_2014_07_13, FRI_2014_07_11},
{MODIFIED_PRECEDING, MON_2014_07_14, MON_2014_07_14},
{MODIFIED_PRECEDING, FRI_2014_08_29, FRI_2014_08_29},
{MODIFIED_PRECEDING, SAT_2014_08_30, FRI_2014_08_29},
{MODIFIED_PRECEDING, SUN_2014_08_31, FRI_2014_08_29},
{MODIFIED_PRECEDING, MON_2014_09_01, MON_2014_09_01},
{MODIFIED_PRECEDING, FRI_2014_10_31, FRI_2014_10_31},
{MODIFIED_PRECEDING, SAT_2014_11_01, MON_2014_11_03}, // modified
{MODIFIED_PRECEDING, SUN_2014_11_02, MON_2014_11_03}, // modified
{MODIFIED_PRECEDING, MON_2014_11_03, MON_2014_11_03},
{NEAREST, FRI_2014_07_11, FRI_2014_07_11},
{NEAREST, SAT_2014_07_12, FRI_2014_07_11},
{NEAREST, SUN_2014_07_13, MON_2014_07_14},
{NEAREST, MON_2014_07_14, MON_2014_07_14},
};
}
@Test(dataProvider = "convention")
public void test_convention(BusinessDayConvention convention, LocalDate input, LocalDate expected) {
assertEquals(convention.adjust(input, HolidayCalendars.SAT_SUN), expected);
}
public void test_nearest() {
HolidayCalendar cal = ImmutableHolidayCalendar.of(
HolidayCalendarId.of("Test"), ImmutableList.of(MON_2014_07_14), SATURDAY, SUNDAY);
assertEquals(NEAREST.adjust(FRI_2014_07_11, cal), FRI_2014_07_11);
assertEquals(NEAREST.adjust(SAT_2014_07_12, cal), FRI_2014_07_11);
assertEquals(NEAREST.adjust(SUN_2014_07_13, cal), TUE_2014_07_15);
assertEquals(NEAREST.adjust(MON_2014_07_14, cal), TUE_2014_07_15);
}
//-------------------------------------------------------------------------
@DataProvider(name = "name")
static Object[][] data_name() {
return new Object[][] {
{NO_ADJUST, "NoAdjust"},
{FOLLOWING, "Following"},
{MODIFIED_FOLLOWING, "ModifiedFollowing"},
{MODIFIED_FOLLOWING_BI_MONTHLY, "ModifiedFollowingBiMonthly"},
{PRECEDING, "Preceding"},
{MODIFIED_PRECEDING, "ModifiedPreceding"},
{NEAREST, "Nearest"},
};
}
@Test(dataProvider = "name")
public void test_name(BusinessDayConvention convention, String name) {
assertEquals(convention.getName(), name);
}
@Test(dataProvider = "name")
public void test_toString(BusinessDayConvention convention, String name) {
assertEquals(convention.toString(), name);
}
@Test(dataProvider = "name")
public void test_of_lookup(BusinessDayConvention convention, String name) {
assertEquals(BusinessDayConvention.of(name), convention);
}
@Test(dataProvider = "name")
public void test_extendedEnum(BusinessDayConvention convention, String name) {
ImmutableMap<String, BusinessDayConvention> map = BusinessDayConvention.extendedEnum().lookupAll();
assertEquals(map.get(name), convention);
}
public void test_of_lookup_notFound() {
assertThrowsIllegalArg(() -> BusinessDayConvention.of("Rubbish"));
}
public void test_of_lookup_null() {
assertThrowsIllegalArg(() -> BusinessDayConvention.of(null));
}
//-------------------------------------------------------------------------
public void coverage() {
coverPrivateConstructor(BusinessDayConventions.class);
coverEnum(StandardBusinessDayConventions.class);
}
public void test_serialization() {
assertSerialization(NO_ADJUST);
}
public void test_jodaConvert() {
assertJodaConvert(BusinessDayConvention.class, NO_ADJUST);
assertJodaConvert(BusinessDayConvention.class, MODIFIED_FOLLOWING);
}
}