/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product.swap.type;
import static com.opengamma.strata.collect.TestHelper.coverPrivateConstructor;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.time.LocalDate;
import java.time.Period;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.date.BusinessDayConvention;
import com.opengamma.strata.basics.date.BusinessDayConventions;
import com.opengamma.strata.basics.date.DayCount;
import com.opengamma.strata.basics.date.DayCounts;
import com.opengamma.strata.basics.date.Tenor;
import com.opengamma.strata.basics.index.IborIndex;
import com.opengamma.strata.basics.index.IborIndices;
import com.opengamma.strata.basics.index.OvernightIndex;
import com.opengamma.strata.basics.index.OvernightIndices;
import com.opengamma.strata.basics.schedule.Frequency;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.common.PayReceive;
import com.opengamma.strata.product.swap.ResolvedSwap;
import com.opengamma.strata.product.swap.SwapTrade;
/**
* Test {@link OvernightIborSwapConventions}.
*/
@Test
public class OvernightIborSwapConventionsTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
@DataProvider(name = "spotLag")
static Object[][] data_spot_lag() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, 2},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, 0},
};
}
@Test(dataProvider = "spotLag")
public void test_spot_lag(ImmutableOvernightIborSwapConvention convention, int lag) {
assertEquals(convention.getSpotDateOffset().getDays(), lag);
}
//-------------------------------------------------------------------------
@DataProvider(name = "periodOn")
static Object[][] data_period_on() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, Frequency.P3M},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, Frequency.P12M},
};
}
@Test(dataProvider = "periodOn")
public void test_accrualPeriod_on(OvernightIborSwapConvention convention, Frequency frequency) {
assertEquals(convention.getOvernightLeg().getAccrualFrequency(), frequency);
}
@Test(dataProvider = "periodOn")
public void test_paymentPeriod_on(OvernightIborSwapConvention convention, Frequency frequency) {
assertEquals(convention.getOvernightLeg().getPaymentFrequency(), frequency);
}
//-------------------------------------------------------------------------
@DataProvider(name = "periodIbor")
static Object[][] data_period_ibor() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, Frequency.P3M},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, Frequency.P3M},
};
}
@Test(dataProvider = "periodIbor")
public void test_accrualPeriod_ibor(OvernightIborSwapConvention convention, Frequency frequency) {
assertEquals(convention.getIborLeg().getAccrualFrequency(), frequency);
}
@Test(dataProvider = "periodIbor")
public void test_paymentPeriod_ibor(OvernightIborSwapConvention convention, Frequency frequency) {
assertEquals(convention.getIborLeg().getPaymentFrequency(), frequency);
}
//-------------------------------------------------------------------------
@DataProvider(name = "dayCount")
static Object[][] data_day_count() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, DayCounts.ACT_360},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, DayCounts.ACT_365F},
};
}
@Test(dataProvider = "dayCount")
public void test_day_count(OvernightIborSwapConvention convention, DayCount dayCount) {
assertEquals(convention.getOvernightLeg().getDayCount(), dayCount);
assertEquals(convention.getIborLeg().getDayCount(), dayCount);
}
//-------------------------------------------------------------------------
@DataProvider(name = "onLeg")
static Object[][] data_float_leg() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, OvernightIndices.USD_FED_FUND},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, OvernightIndices.GBP_SONIA},
};
}
@Test(dataProvider = "onLeg")
public void test_float_leg(OvernightIborSwapConvention convention, OvernightIndex floatLeg) {
assertEquals(convention.getOvernightLeg().getIndex(), floatLeg);
}
//-------------------------------------------------------------------------
@DataProvider(name = "iborLeg")
static Object[][] data_ibor_leg() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, IborIndices.USD_LIBOR_3M},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, IborIndices.GBP_LIBOR_3M},
};
}
@Test(dataProvider = "iborLeg")
public void test_ibor_leg(OvernightIborSwapConvention convention, IborIndex iborLeg) {
assertEquals(convention.getIborLeg().getIndex(), iborLeg);
}
//-------------------------------------------------------------------------
@DataProvider(name = "dayConvention")
static Object[][] data_day_convention() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, BusinessDayConventions.MODIFIED_FOLLOWING},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, BusinessDayConventions.MODIFIED_FOLLOWING},
};
}
@Test(dataProvider = "dayConvention")
public void test_day_convention(OvernightIborSwapConvention convention, BusinessDayConvention dayConvention) {
assertEquals(convention.getOvernightLeg().getAccrualBusinessDayAdjustment().getConvention(), dayConvention);
}
//-------------------------------------------------------------------------
@DataProvider(name = "stubOn")
static Object[][] data_stub_on() {
return new Object[][] {
{OvernightIborSwapConventions.USD_FED_FUND_AA_LIBOR_3M, Tenor.TENOR_4M},
{OvernightIborSwapConventions.GBP_SONIA_OIS_1Y_LIBOR_3M, Tenor.of(Period.ofMonths(13))},
};
}
@Test(dataProvider = "stubOn")
public void test_stub_overnight(OvernightIborSwapConvention convention, Tenor tenor) {
LocalDate tradeDate = LocalDate.of(2015, 10, 20);
SwapTrade swap = convention.createTrade(tradeDate, tenor, BuySell.BUY, 1, 0.01, REF_DATA);
ResolvedSwap swapResolved = swap.getProduct().resolve(REF_DATA);
LocalDate endDate = swapResolved.getLeg(PayReceive.PAY).get().getEndDate();
assertTrue(endDate.isAfter(tradeDate.plus(tenor).minusDays(7)));
assertTrue(endDate.isBefore(tradeDate.plus(tenor).plusDays(7)));
}
//-------------------------------------------------------------------------
public void coverage() {
coverPrivateConstructor(OvernightIborSwapConventions.class);
coverPrivateConstructor(StandardOvernightIborSwapConventions.class);
}
}