/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product.capfloor;
import static com.opengamma.strata.basics.currency.Currency.EUR;
import static com.opengamma.strata.basics.currency.Currency.GBP;
import static com.opengamma.strata.basics.date.DayCounts.ACT_360;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.EUTA;
import static com.opengamma.strata.basics.index.IborIndices.EUR_EURIBOR_3M;
import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_3M;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static com.opengamma.strata.product.common.PayReceive.PAY;
import static com.opengamma.strata.product.common.PayReceive.RECEIVE;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.date.BusinessDayAdjustment;
import com.opengamma.strata.basics.date.BusinessDayConventions;
import com.opengamma.strata.basics.date.DaysAdjustment;
import com.opengamma.strata.basics.schedule.Frequency;
import com.opengamma.strata.basics.schedule.PeriodicSchedule;
import com.opengamma.strata.basics.value.ValueSchedule;
import com.opengamma.strata.product.swap.FixedRateCalculation;
import com.opengamma.strata.product.swap.IborRateCalculation;
import com.opengamma.strata.product.swap.NotionalSchedule;
import com.opengamma.strata.product.swap.PaymentSchedule;
import com.opengamma.strata.product.swap.RateCalculationSwapLeg;
import com.opengamma.strata.product.swap.SwapLeg;
/**
* Test {@link IborCapFloor}.
*/
@Test
public class IborCapFloorTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final LocalDate START = LocalDate.of(2011, 3, 17);
private static final LocalDate END = LocalDate.of(2016, 3, 17);
private static final IborRateCalculation RATE_CALCULATION = IborRateCalculation.of(EUR_EURIBOR_3M);
private static final Frequency FREQUENCY = Frequency.P3M;
private static final BusinessDayAdjustment BUSS_ADJ =
BusinessDayAdjustment.of(BusinessDayConventions.FOLLOWING, EUTA);
private static final PeriodicSchedule SCHEDULE = PeriodicSchedule.builder()
.startDate(START)
.endDate(END)
.frequency(FREQUENCY)
.businessDayAdjustment(BUSS_ADJ)
.build();
private static final DaysAdjustment PAYMENT_OFFSET = DaysAdjustment.ofBusinessDays(2, EUTA);
private static final ValueSchedule CAP = ValueSchedule.of(0.0325);
private static final ValueSchedule NOTIONAL = ValueSchedule.of(1.0e6);
private static final IborCapFloorLeg CAPFLOOR_LEG = IborCapFloorLeg.builder()
.calculation(RATE_CALCULATION)
.capSchedule(CAP)
.notional(NOTIONAL)
.paymentDateOffset(PAYMENT_OFFSET)
.paymentSchedule(SCHEDULE)
.payReceive(RECEIVE)
.build();
private static final SwapLeg PAY_LEG = RateCalculationSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(SCHEDULE)
.calculation(
FixedRateCalculation.of(0.001, ACT_360))
.paymentSchedule(
PaymentSchedule.builder().paymentFrequency(FREQUENCY).paymentDateOffset(DaysAdjustment.NONE).build())
.notionalSchedule(
NotionalSchedule.of(EUR, NOTIONAL))
.build();
private static final SwapLeg PAY_LEG_XCCY = RateCalculationSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(SCHEDULE)
.calculation(
IborRateCalculation.of(GBP_LIBOR_3M))
.paymentSchedule(
PaymentSchedule.builder().paymentFrequency(FREQUENCY).paymentDateOffset(DaysAdjustment.NONE).build())
.notionalSchedule(
NotionalSchedule.of(GBP, NOTIONAL))
.build();
public void test_of_oneLeg() {
IborCapFloor test = IborCapFloor.of(CAPFLOOR_LEG);
assertEquals(test.getCapFloorLeg(), CAPFLOOR_LEG);
assertEquals(test.getPayLeg().isPresent(), false);
assertEquals(test.allPaymentCurrencies(), ImmutableSet.of(EUR));
assertEquals(test.allIndices(), ImmutableSet.of(EUR_EURIBOR_3M));
}
public void test_of_twoLegs() {
IborCapFloor test = IborCapFloor.of(CAPFLOOR_LEG, PAY_LEG);
assertEquals(test.getCapFloorLeg(), CAPFLOOR_LEG);
assertEquals(test.getPayLeg().get(), PAY_LEG);
assertEquals(test.allPaymentCurrencies(), ImmutableSet.of(EUR));
assertEquals(test.allIndices(), ImmutableSet.of(EUR_EURIBOR_3M));
}
public void test_of_twoLegs_xccy() {
IborCapFloor test = IborCapFloor.of(CAPFLOOR_LEG, PAY_LEG_XCCY);
assertEquals(test.getCapFloorLeg(), CAPFLOOR_LEG);
assertEquals(test.getPayLeg().get(), PAY_LEG_XCCY);
assertEquals(test.allPaymentCurrencies(), ImmutableSet.of(GBP, EUR));
assertEquals(test.allIndices(), ImmutableSet.of(GBP_LIBOR_3M, EUR_EURIBOR_3M));
}
public void test_resolve_oneLeg() {
IborCapFloor base = IborCapFloor.of(CAPFLOOR_LEG);
ResolvedIborCapFloor test = base.resolve(REF_DATA);
assertEquals(test.getCapFloorLeg(), CAPFLOOR_LEG.resolve(REF_DATA));
assertEquals(test.getPayLeg().isPresent(), false);
}
public void test_resolve_twoLegs() {
IborCapFloor base = IborCapFloor.of(CAPFLOOR_LEG, PAY_LEG);
ResolvedIborCapFloor test = base.resolve(REF_DATA);
assertEquals(test.getCapFloorLeg(), CAPFLOOR_LEG.resolve(REF_DATA));
assertEquals(test.getPayLeg().get(), PAY_LEG.resolve(REF_DATA));
}
//-------------------------------------------------------------------------
public void coverage() {
IborCapFloor test1 = IborCapFloor.of(CAPFLOOR_LEG);
coverImmutableBean(test1);
IborCapFloorLeg capFloor = IborCapFloorLeg.builder()
.calculation(RATE_CALCULATION)
.floorSchedule(CAP)
.notional(NOTIONAL)
.paymentDateOffset(PAYMENT_OFFSET)
.paymentSchedule(SCHEDULE)
.payReceive(RECEIVE)
.build();
IborCapFloor test2 = IborCapFloor.of(capFloor, PAY_LEG);
coverBeanEquals(test1, test2);
}
public void test_serialization() {
IborCapFloor test = IborCapFloor.of(CAPFLOOR_LEG);
assertSerialization(test);
}
}