/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product.cms;
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.DayCounts.ACT_365F;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import java.time.LocalDate;
import org.testng.annotations.Test;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.swap.ResolvedSwap;
import com.opengamma.strata.product.swap.SwapIndex;
import com.opengamma.strata.product.swap.SwapIndices;
import com.opengamma.strata.product.swap.type.FixedIborSwapConvention;
/**
* Test {@link CmsPeriod}.
*/
@Test
public class CmsPeriodTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final SwapIndex INDEX = SwapIndices.GBP_LIBOR_1100_15Y;
private static final LocalDate FIXING = LocalDate.of(2015, 10, 16);
private static final LocalDate START = LocalDate.of(2015, 10, 22);
private static final LocalDate END = LocalDate.of(2016, 10, 24);
private static final LocalDate START_UNADJUSTED = LocalDate.of(2015, 10, 22);
private static final LocalDate END_UNADJUSTED = LocalDate.of(2016, 10, 22); // SAT
private static final LocalDate PAYMENT = LocalDate.of(2016, 10, 26);
private static final double STRIKE = 0.015;
private static final double NOTIONAL = 1.0e6;
private static final double YEAR_FRACTION = 1.005;
public void test_builder_cap() {
CmsPeriod testCaplet = sutCap();
assertEquals(testCaplet.getCaplet().getAsDouble(), STRIKE);
assertFalse(testCaplet.getFloorlet().isPresent());
assertEquals(testCaplet.getCmsPeriodType(), CmsPeriodType.CAPLET);
assertEquals(testCaplet.getCurrency(), GBP);
assertEquals(testCaplet.getStartDate(), START);
assertEquals(testCaplet.getEndDate(), END);
assertEquals(testCaplet.getUnadjustedStartDate(), START_UNADJUSTED);
assertEquals(testCaplet.getUnadjustedEndDate(), END_UNADJUSTED);
assertEquals(testCaplet.getFixingDate(), FIXING);
assertEquals(testCaplet.getPaymentDate(), PAYMENT);
assertEquals(testCaplet.getIndex(), INDEX);
assertEquals(testCaplet.getNotional(), NOTIONAL);
assertEquals(testCaplet.getYearFraction(), YEAR_FRACTION);
assertEquals(testCaplet.getDayCount(), ACT_360);
assertEquals(testCaplet.getStrike(), STRIKE);
}
public void test_builder_floor() {
CmsPeriod testFloorlet = sutFloor();
assertFalse(testFloorlet.getCaplet().isPresent());
assertEquals(testFloorlet.getFloorlet().getAsDouble(), STRIKE);
assertEquals(testFloorlet.getCmsPeriodType(), CmsPeriodType.FLOORLET);
assertEquals(testFloorlet.getCurrency(), GBP);
assertEquals(testFloorlet.getStartDate(), START);
assertEquals(testFloorlet.getEndDate(), END);
assertEquals(testFloorlet.getUnadjustedStartDate(), START_UNADJUSTED);
assertEquals(testFloorlet.getUnadjustedEndDate(), END_UNADJUSTED);
assertEquals(testFloorlet.getFixingDate(), FIXING);
assertEquals(testFloorlet.getPaymentDate(), PAYMENT);
assertEquals(testFloorlet.getIndex(), INDEX);
assertEquals(testFloorlet.getNotional(), NOTIONAL);
assertEquals(testFloorlet.getYearFraction(), YEAR_FRACTION);
assertEquals(testFloorlet.getDayCount(), ACT_360);
assertEquals(testFloorlet.getStrike(), STRIKE);
}
public void test_builder_coupon() {
CmsPeriod testCoupon = sutCoupon();
assertFalse(testCoupon.getCaplet().isPresent());
assertFalse(testCoupon.getFloorlet().isPresent());
assertEquals(testCoupon.getCmsPeriodType(), CmsPeriodType.COUPON);
assertEquals(testCoupon.getCurrency(), GBP);
assertEquals(testCoupon.getStartDate(), START);
assertEquals(testCoupon.getEndDate(), END);
assertEquals(testCoupon.getUnadjustedStartDate(), START_UNADJUSTED);
assertEquals(testCoupon.getUnadjustedEndDate(), END_UNADJUSTED);
assertEquals(testCoupon.getFixingDate(), FIXING);
assertEquals(testCoupon.getPaymentDate(), PAYMENT);
assertEquals(testCoupon.getIndex(), INDEX);
assertEquals(testCoupon.getNotional(), NOTIONAL);
assertEquals(testCoupon.getYearFraction(), YEAR_FRACTION);
assertEquals(testCoupon.getDayCount(), ACT_360);
assertEquals(testCoupon.getStrike(), 0d);
}
public void test_builder_nonNullCapFloor() {
assertThrowsIllegalArg(() -> CmsPeriod.builder()
.caplet(STRIKE)
.floorlet(STRIKE)
.startDate(START)
.endDate(END)
.index(INDEX)
.notional(NOTIONAL)
.yearFraction(YEAR_FRACTION)
.dayCount(ACT_360)
.build());
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(sutCap());
coverBeanEquals(sutCap(), sut2());
}
public void test_serialization() {
assertSerialization(sutCap());
}
public void test_toCouponEquivalent() {
CmsPeriod caplet = sutCap();
CmsPeriod cpnEquivalent = caplet.toCouponEquivalent();
assertEquals(cpnEquivalent.getCmsPeriodType(), CmsPeriodType.COUPON);
assertEquals(caplet.getCurrency(), cpnEquivalent.getCurrency());
assertEquals(caplet.getStartDate(), cpnEquivalent.getStartDate());
assertEquals(caplet.getEndDate(), cpnEquivalent.getEndDate());
assertEquals(caplet.getUnadjustedStartDate(), cpnEquivalent.getUnadjustedStartDate());
assertEquals(caplet.getUnadjustedEndDate(), cpnEquivalent.getUnadjustedEndDate());
assertEquals(caplet.getFixingDate(), cpnEquivalent.getFixingDate());
assertEquals(caplet.getPaymentDate(), cpnEquivalent.getPaymentDate());
assertEquals(caplet.getIndex(), cpnEquivalent.getIndex());
assertEquals(caplet.getNotional(), cpnEquivalent.getNotional());
assertEquals(caplet.getYearFraction(), cpnEquivalent.getYearFraction());
assertEquals(caplet.getDayCount(), cpnEquivalent.getDayCount());
}
//-------------------------------------------------------------------------
static CmsPeriod sutCap() {
FixedIborSwapConvention conv = INDEX.getTemplate().getConvention();
ResolvedSwap swap = conv.toTrade(FIXING, START, END, BuySell.BUY, 1d, 0.01).getProduct().resolve(REF_DATA);
return CmsPeriod.builder()
.currency(GBP)
.notional(NOTIONAL)
.startDate(START)
.endDate(END)
.unadjustedStartDate(START_UNADJUSTED)
.unadjustedEndDate(END_UNADJUSTED)
.yearFraction(YEAR_FRACTION)
.paymentDate(PAYMENT)
.fixingDate(FIXING)
.caplet(STRIKE)
.dayCount(ACT_360)
.index(INDEX)
.underlyingSwap(swap)
.build();
}
static CmsPeriod sutFloor() {
FixedIborSwapConvention conv = INDEX.getTemplate().getConvention();
ResolvedSwap swap = conv.toTrade(FIXING, START, END, BuySell.BUY, 1d, 0.01).getProduct().resolve(REF_DATA);
return CmsPeriod.builder()
.currency(GBP)
.notional(NOTIONAL)
.startDate(START)
.endDate(END)
.unadjustedStartDate(START_UNADJUSTED)
.unadjustedEndDate(END_UNADJUSTED)
.yearFraction(YEAR_FRACTION)
.paymentDate(PAYMENT)
.fixingDate(FIXING)
.floorlet(STRIKE)
.dayCount(ACT_360)
.index(INDEX)
.underlyingSwap(swap)
.build();
}
static CmsPeriod sutCoupon() {
FixedIborSwapConvention conv = INDEX.getTemplate().getConvention();
ResolvedSwap swap = conv.toTrade(FIXING, START, END, BuySell.BUY, 1d, 0.01).getProduct().resolve(REF_DATA);
return CmsPeriod.builder()
.currency(GBP)
.notional(NOTIONAL)
.startDate(START)
.endDate(END)
.unadjustedStartDate(START_UNADJUSTED)
.unadjustedEndDate(END_UNADJUSTED)
.yearFraction(YEAR_FRACTION)
.paymentDate(PAYMENT)
.fixingDate(FIXING)
.dayCount(ACT_360)
.index(INDEX)
.underlyingSwap(swap)
.build();
}
static CmsPeriod sut2() {
FixedIborSwapConvention conv = INDEX.getTemplate().getConvention();
ResolvedSwap swap = conv.toTrade(FIXING.plusDays(1), START.plusDays(1), END.plusDays(1), BuySell.BUY, 1d, 1d)
.getProduct().resolve(REF_DATA);
return CmsPeriod.builder()
.currency(EUR)
.notional(NOTIONAL + 1)
.startDate(START.plusDays(1))
.endDate(END.plusDays(1))
.unadjustedStartDate(START_UNADJUSTED.plusDays(1))
.unadjustedEndDate(END_UNADJUSTED.plusDays(1))
.yearFraction(YEAR_FRACTION + 0.01)
.paymentDate(PAYMENT.plusDays(1))
.fixingDate(FIXING.plusDays(1))
.floorlet(STRIKE)
.dayCount(ACT_365F)
.index(SwapIndices.EUR_EURIBOR_1100_5Y)
.underlyingSwap(swap)
.build();
}
}