/**
* 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.collect.TestHelper.assertJodaConvert;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.coverEnum;
import static com.opengamma.strata.collect.TestHelper.coverPrivateConstructor;
import static com.opengamma.strata.collect.TestHelper.date;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.time.YearMonth;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Test {@link DateSequence}.
*/
@Test
public class DateSequenceTest {
public void test_QUARTERLY_IMM() {
DateSequence test = DateSequences.QUARTERLY_IMM;
assertEquals(test.getName(), "Quarterly-IMM");
assertEquals(test.toString(), "Quarterly-IMM");
assertEquals(test.dateMatching(YearMonth.of(2013, 3)), LocalDate.of(2013, 3, 20));
}
public void test_QUARTERLY_IMM_of() {
DateSequence test = DateSequence.of("Quarterly-IMM");
assertEquals(test, DateSequences.QUARTERLY_IMM);
}
//-------------------------------------------------------------------------
@DataProvider(name = "quarterlyImm")
static Object[][] data_quarterlyImm() {
return new Object[][] {
{date(2013, 1, 1), date(2013, 3, 20), date(2013, 6, 19), date(2013, 9, 18)},
{date(2013, 3, 20), date(2013, 6, 19), date(2013, 9, 18), date(2013, 12, 18)},
{date(2013, 6, 19), date(2013, 9, 18), date(2013, 12, 18), date(2014, 3, 19)},
{date(2013, 9, 18), date(2013, 12, 18), date(2014, 3, 19), date(2014, 6, 18)},
{date(2013, 12, 18), date(2014, 3, 19), date(2014, 6, 18), date(2014, 9, 17)},
};
}
@Test(dataProvider = "quarterlyImm")
public void test_nextOrSameQuarterlyImm(LocalDate base, LocalDate immDate1, LocalDate immDate2, LocalDate immDate3) {
LocalDate date = base.plusDays(1);
while (!date.isAfter(immDate1)) {
assertEquals(DateSequences.QUARTERLY_IMM.nextOrSame(date), immDate1);
assertEquals(DateSequences.QUARTERLY_IMM.nthOrSame(date, 1), immDate1);
assertEquals(DateSequences.QUARTERLY_IMM.nthOrSame(date, 2), immDate2);
assertEquals(DateSequences.QUARTERLY_IMM.nthOrSame(date, 3), immDate3);
date = date.plusDays(1);
}
}
@Test(dataProvider = "quarterlyImm")
public void test_nextQuarterlyImm(LocalDate base, LocalDate immDate1, LocalDate immDate2, LocalDate immDate3) {
LocalDate date = base;
while (!date.isAfter(immDate1)) {
if (date.equals(immDate1)) {
assertEquals(DateSequences.QUARTERLY_IMM.next(date), immDate2);
assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 1), immDate2);
assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 2), immDate3);
} else {
assertEquals(DateSequences.QUARTERLY_IMM.next(date), immDate1);
assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 1), immDate1);
assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 2), immDate2);
assertEquals(DateSequences.QUARTERLY_IMM.nth(date, 3), immDate3);
}
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
@DataProvider(name = "monthlyImm")
static Object[][] data_monthlyImm() {
return new Object[][] {
{date(2014, 12, 17), date(2015, 1, 21), date(2015, 2, 18), date(2015, 3, 18)},
{date(2015, 1, 21), date(2015, 2, 18), date(2015, 3, 18), date(2015, 4, 15)},
{date(2015, 2, 18), date(2015, 3, 18), date(2015, 4, 15), date(2015, 5, 20)},
};
}
@Test(dataProvider = "monthlyImm")
public void test_nextOrSameMonthlyImm(LocalDate base, LocalDate immDate1, LocalDate immDate2, LocalDate immDate3) {
LocalDate date = base.plusDays(1);
while (!date.isAfter(immDate1)) {
assertEquals(DateSequences.MONTHLY_IMM.nextOrSame(date), immDate1);
assertEquals(DateSequences.MONTHLY_IMM.nthOrSame(date, 1), immDate1);
assertEquals(DateSequences.MONTHLY_IMM.nthOrSame(date, 2), immDate2);
assertEquals(DateSequences.MONTHLY_IMM.nthOrSame(date, 3), immDate3);
date = date.plusDays(1);
}
}
@Test(dataProvider = "monthlyImm")
public void test_nextMonthlyImm(LocalDate base, LocalDate immDate1, LocalDate immDate2, LocalDate immDate3) {
LocalDate date = base;
while (!date.isAfter(immDate1)) {
if (date.equals(immDate1)) {
assertEquals(DateSequences.MONTHLY_IMM.next(date), immDate2);
assertEquals(DateSequences.MONTHLY_IMM.nth(date, 1), immDate2);
assertEquals(DateSequences.MONTHLY_IMM.nth(date, 2), immDate3);
} else {
assertEquals(DateSequences.MONTHLY_IMM.next(date), immDate1);
assertEquals(DateSequences.MONTHLY_IMM.nth(date, 1), immDate1);
assertEquals(DateSequences.MONTHLY_IMM.nth(date, 2), immDate2);
assertEquals(DateSequences.MONTHLY_IMM.nth(date, 3), immDate3);
}
date = date.plusDays(1);
}
}
//-------------------------------------------------------------------------
public void test_dummy() {
DummyDateSequence test = new DummyDateSequence();
assertEquals(test.next(date(2015, 10, 14)), date(2015, 10, 15));
assertEquals(test.next(date(2015, 10, 15)), date(2015, 10, 22));
assertEquals(test.next(date(2015, 10, 16)), date(2015, 10, 22));
assertEquals(test.nextOrSame(date(2015, 10, 14)), date(2015, 10, 15));
assertEquals(test.nextOrSame(date(2015, 10, 15)), date(2015, 10, 15));
assertEquals(test.nextOrSame(date(2015, 10, 16)), date(2015, 10, 22));
assertEquals(test.nth(date(2015, 10, 14), 1), date(2015, 10, 15));
assertEquals(test.nth(date(2015, 10, 15), 1), date(2015, 10, 22));
assertEquals(test.nth(date(2015, 10, 16), 1), date(2015, 10, 22));
assertEquals(test.nth(date(2015, 10, 14), 2), date(2015, 10, 22));
assertEquals(test.nth(date(2015, 10, 15), 2), date(2015, 10, 29));
assertEquals(test.nth(date(2015, 10, 16), 2), date(2015, 10, 29));
assertEquals(test.nthOrSame(date(2015, 10, 14), 1), date(2015, 10, 15));
assertEquals(test.nthOrSame(date(2015, 10, 15), 1), date(2015, 10, 15));
assertEquals(test.nthOrSame(date(2015, 10, 16), 1), date(2015, 10, 22));
assertEquals(test.nthOrSame(date(2015, 10, 14), 2), date(2015, 10, 22));
assertEquals(test.nthOrSame(date(2015, 10, 15), 2), date(2015, 10, 22));
assertEquals(test.nthOrSame(date(2015, 10, 16), 2), date(2015, 10, 29));
}
//-------------------------------------------------------------------------
public void test_extendedEnum() {
assertEquals(DateSequence.extendedEnum().lookupAll().get("Quarterly-IMM"), DateSequences.QUARTERLY_IMM);
}
//-------------------------------------------------------------------------
public void coverage() {
coverPrivateConstructor(DateSequences.class);
coverEnum(StandardDateSequences.class);
}
public void test_serialization() {
assertSerialization(DateSequences.QUARTERLY_IMM);
assertSerialization(DateSequences.MONTHLY_IMM);
}
public void test_jodaConvert() {
assertJodaConvert(DateSequence.class, DateSequences.QUARTERLY_IMM);
assertJodaConvert(DateSequence.class, DateSequences.MONTHLY_IMM);
}
//-------------------------------------------------------------------------
static class DummyDateSequence implements DateSequence {
@Override
public LocalDate nextOrSame(LocalDate date) {
if (date.isBefore(date(2015, 10, 16))) {
return date(2015, 10, 15);
}
if (date.isBefore(date(2015, 10, 23))) {
return date(2015, 10, 22);
}
if (date.isBefore(date(2015, 10, 30))) {
return date(2015, 10, 29);
}
throw new IllegalArgumentException();
}
@Override
public LocalDate dateMatching(YearMonth yearMonth) {
return date(2015, 10, 29);
}
@Override
public String getName() {
return "Dummy";
}
}
}