/**
* 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.index.IborIndices.EUR_EURIBOR_3M;
import static com.opengamma.strata.basics.index.IborIndices.USD_LIBOR_6M;
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 java.time.LocalDate;
import java.time.ZonedDateTime;
import org.testng.annotations.Test;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.product.common.PutCall;
import com.opengamma.strata.product.rate.IborRateComputation;
/**
* Test {@link IborCapletFloorletPeriod}.
*/
@Test
public class IborCapletFloorletPeriodTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final LocalDate FIXING = LocalDate.of(2011, 1, 4);
private static final ZonedDateTime FIXING_TIME_ZONE = EUR_EURIBOR_3M.calculateFixingDateTime(FIXING);
private static final double STRIKE = 0.04;
private static final LocalDate START_UNADJ = LocalDate.of(2010, 10, 8);
private static final LocalDate END_UNADJ = LocalDate.of(2011, 1, 8);
private static final LocalDate START = LocalDate.of(2010, 10, 8);
private static final LocalDate END = LocalDate.of(2011, 1, 10);
private static final LocalDate PAYMENT = LocalDate.of(2011, 1, 13);
private static final double NOTIONAL = 1.e6;
private static final IborRateComputation RATE_COMP = IborRateComputation.of(EUR_EURIBOR_3M, FIXING, REF_DATA);
private static final double YEAR_FRACTION = 0.251d;
public void test_builder_min() {
IborCapletFloorletPeriod test = IborCapletFloorletPeriod.builder()
.notional(NOTIONAL)
.startDate(START)
.endDate(END)
.yearFraction(YEAR_FRACTION)
.caplet(STRIKE)
.iborRate(RATE_COMP)
.build();
assertEquals(test.getCaplet().getAsDouble(), STRIKE);
assertEquals(test.getFloorlet().isPresent(), false);
assertEquals(test.getStrike(), STRIKE);
assertEquals(test.getStartDate(), START);
assertEquals(test.getEndDate(), END);
assertEquals(test.getPaymentDate(), test.getEndDate());
assertEquals(test.getCurrency(), EUR);
assertEquals(test.getNotional(), NOTIONAL);
assertEquals(test.getIborRate(), RATE_COMP);
assertEquals(test.getIndex(), EUR_EURIBOR_3M);
assertEquals(test.getFixingDate(), FIXING_TIME_ZONE.toLocalDate());
assertEquals(test.getFixingDateTime(), FIXING_TIME_ZONE);
assertEquals(test.getPutCall(), PutCall.CALL);
assertEquals(test.getUnadjustedStartDate(), START);
assertEquals(test.getUnadjustedEndDate(), END);
assertEquals(test.getYearFraction(), YEAR_FRACTION);
}
public void test_builder_full() {
IborCapletFloorletPeriod test = IborCapletFloorletPeriod.builder()
.notional(NOTIONAL)
.startDate(START)
.endDate(END)
.unadjustedStartDate(START_UNADJ)
.unadjustedEndDate(END_UNADJ)
.paymentDate(PAYMENT)
.yearFraction(YEAR_FRACTION)
.currency(GBP)
.floorlet(STRIKE)
.iborRate(RATE_COMP)
.build();
assertEquals(test.getFloorlet().getAsDouble(), STRIKE);
assertEquals(test.getCaplet().isPresent(), false);
assertEquals(test.getStrike(), STRIKE);
assertEquals(test.getStartDate(), START);
assertEquals(test.getEndDate(), END);
assertEquals(test.getUnadjustedStartDate(), START_UNADJ);
assertEquals(test.getUnadjustedEndDate(), END_UNADJ);
assertEquals(test.getPaymentDate(), PAYMENT);
assertEquals(test.getCurrency(), GBP);
assertEquals(test.getNotional(), NOTIONAL);
assertEquals(test.getIborRate(), RATE_COMP);
assertEquals(test.getIndex(), EUR_EURIBOR_3M);
assertEquals(test.getFixingDateTime(), FIXING_TIME_ZONE);
assertEquals(test.getPutCall(), PutCall.PUT);
assertEquals(test.getYearFraction(), YEAR_FRACTION);
}
public void test_builder_fail() {
// rate observation missing
assertThrowsIllegalArg(() -> IborCapletFloorletPeriod.builder()
.notional(NOTIONAL)
.caplet(STRIKE)
.build());
// cap and floor missing
assertThrowsIllegalArg(() -> IborCapletFloorletPeriod.builder()
.notional(NOTIONAL)
.iborRate(RATE_COMP)
.build());
// cap and floor present
assertThrowsIllegalArg(() -> IborCapletFloorletPeriod.builder()
.notional(NOTIONAL)
.caplet(STRIKE)
.floorlet(STRIKE)
.iborRate(RATE_COMP)
.build());
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(sut());
coverBeanEquals(sut(), sut2());
}
public void test_serialization() {
assertSerialization(sut());
}
//-------------------------------------------------------------------------
static IborCapletFloorletPeriod sut() {
return IborCapletFloorletPeriod.builder()
.notional(NOTIONAL)
.startDate(START)
.endDate(END)
.caplet(STRIKE)
.iborRate(RATE_COMP)
.build();
}
static IborCapletFloorletPeriod sut2() {
return IborCapletFloorletPeriod.builder()
.notional(-NOTIONAL)
.startDate(START.plusDays(1))
.endDate(END.plusDays(1))
.floorlet(STRIKE)
.iborRate(IborRateComputation.of(USD_LIBOR_6M, LocalDate.of(2013, 2, 15), REF_DATA))
.build();
}
}