/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product.swap;
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.BusinessDayConventions.FOLLOWING;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.GBLO;
import static com.opengamma.strata.basics.schedule.Frequency.P1M;
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.collect.TestHelper.date;
import static com.opengamma.strata.product.common.PayReceive.PAY;
import static com.opengamma.strata.product.common.PayReceive.RECEIVE;
import static com.opengamma.strata.product.swap.SwapLegType.FIXED;
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.currency.CurrencyAmount;
import com.opengamma.strata.basics.currency.Payment;
import com.opengamma.strata.basics.date.AdjustableDate;
import com.opengamma.strata.basics.date.BusinessDayAdjustment;
import com.opengamma.strata.basics.date.DaysAdjustment;
import com.opengamma.strata.basics.index.Index;
import com.opengamma.strata.basics.schedule.PeriodicSchedule;
import com.opengamma.strata.basics.value.ValueAdjustment;
import com.opengamma.strata.basics.value.ValueSchedule;
import com.opengamma.strata.basics.value.ValueStep;
/**
* Test.
*/
@Test
public class KnownAmountSwapLegTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final LocalDate DATE_01_05 = date(2014, 1, 5);
private static final LocalDate DATE_01_06 = date(2014, 1, 6);
private static final LocalDate DATE_02_05 = date(2014, 2, 5);
private static final LocalDate DATE_02_07 = date(2014, 2, 7);
private static final LocalDate DATE_03_05 = date(2014, 3, 5);
private static final LocalDate DATE_03_07 = date(2014, 3, 7);
private static final LocalDate DATE_04_05 = date(2014, 4, 5);
private static final LocalDate DATE_04_07 = date(2014, 4, 7);
private static final LocalDate DATE_04_09 = date(2014, 4, 9);
private static final DaysAdjustment PLUS_THREE_DAYS = DaysAdjustment.ofBusinessDays(3, GBLO);
private static final DaysAdjustment PLUS_TWO_DAYS = DaysAdjustment.ofBusinessDays(2, GBLO);
//-------------------------------------------------------------------------
public void test_builder() {
BusinessDayAdjustment bda = BusinessDayAdjustment.of(FOLLOWING, GBLO);
PeriodicSchedule accrualSchedule = PeriodicSchedule.builder()
.startDate(DATE_01_05)
.endDate(DATE_04_05)
.frequency(P1M)
.businessDayAdjustment(bda)
.build();
PaymentSchedule paymentSchedule = PaymentSchedule.builder()
.paymentFrequency(P1M)
.paymentDateOffset(DaysAdjustment.ofBusinessDays(2, GBLO))
.build();
ValueSchedule amountSchedule = ValueSchedule.of(123d);
KnownAmountSwapLeg test = KnownAmountSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(accrualSchedule)
.paymentSchedule(paymentSchedule)
.amount(amountSchedule)
.currency(GBP)
.build();
assertEquals(test.getPayReceive(), PAY);
assertEquals(test.getStartDate(), AdjustableDate.of(DATE_01_05, bda));
assertEquals(test.getEndDate(), AdjustableDate.of(DATE_04_05, bda));
assertEquals(test.getAccrualSchedule(), accrualSchedule);
assertEquals(test.getPaymentSchedule(), paymentSchedule);
assertEquals(test.getAmount(), amountSchedule);
assertEquals(test.getCurrency(), GBP);
}
//-------------------------------------------------------------------------
public void test_collectIndices() {
KnownAmountSwapLeg test = KnownAmountSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(PeriodicSchedule.builder()
.startDate(DATE_01_05)
.endDate(DATE_04_05)
.frequency(P1M)
.businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO))
.build())
.paymentSchedule(PaymentSchedule.builder()
.paymentFrequency(P1M)
.paymentDateOffset(DaysAdjustment.ofBusinessDays(2, GBLO))
.build())
.amount(ValueSchedule.of(123d))
.currency(GBP)
.build();
ImmutableSet.Builder<Index> builder = ImmutableSet.builder();
test.collectIndices(builder);
assertEquals(builder.build(), ImmutableSet.of());
assertEquals(test.allIndices(), ImmutableSet.of());
}
//-------------------------------------------------------------------------
public void test_resolve() {
// test case
KnownAmountSwapLeg test = KnownAmountSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(PeriodicSchedule.builder()
.startDate(DATE_01_05)
.endDate(DATE_04_05)
.frequency(P1M)
.businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO))
.build())
.paymentSchedule(PaymentSchedule.builder()
.paymentFrequency(P1M)
.paymentDateOffset(PLUS_TWO_DAYS)
.build())
.amount(ValueSchedule.builder()
.initialValue(123d)
.steps(ValueStep.of(1, ValueAdjustment.ofReplace(234d)))
.build())
.currency(GBP)
.build();
// expected
KnownAmountSwapPaymentPeriod rpp1 = KnownAmountSwapPaymentPeriod.builder()
.payment(Payment.ofPay(CurrencyAmount.of(GBP, 123d), DATE_02_07))
.startDate(DATE_01_06)
.endDate(DATE_02_05)
.unadjustedStartDate(DATE_01_05)
.build();
KnownAmountSwapPaymentPeriod rpp2 = KnownAmountSwapPaymentPeriod.builder()
.payment(Payment.ofPay(CurrencyAmount.of(GBP, 234d), DATE_03_07))
.startDate(DATE_02_05)
.endDate(DATE_03_05)
.build();
KnownAmountSwapPaymentPeriod rpp3 = KnownAmountSwapPaymentPeriod.builder()
.payment(Payment.ofPay(CurrencyAmount.of(GBP, 234d), DATE_04_09))
.startDate(DATE_03_05)
.endDate(DATE_04_07)
.unadjustedEndDate(DATE_04_05)
.build();
// assertion
assertEquals(test.resolve(REF_DATA), ResolvedSwapLeg.builder()
.type(FIXED)
.payReceive(PAY)
.paymentPeriods(rpp1, rpp2, rpp3)
.build());
}
//-------------------------------------------------------------------------
public void coverage() {
KnownAmountSwapLeg test = KnownAmountSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(PeriodicSchedule.builder()
.startDate(DATE_01_05)
.endDate(DATE_04_05)
.frequency(P1M)
.businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO))
.build())
.paymentSchedule(PaymentSchedule.builder()
.paymentFrequency(P1M)
.paymentDateOffset(PLUS_TWO_DAYS)
.build())
.amount(ValueSchedule.of(123d))
.currency(GBP)
.build();
coverImmutableBean(test);
KnownAmountSwapLeg test2 = KnownAmountSwapLeg.builder()
.payReceive(RECEIVE)
.accrualSchedule(PeriodicSchedule.builder()
.startDate(DATE_02_05)
.endDate(DATE_03_05)
.frequency(P1M)
.businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO))
.build())
.paymentSchedule(PaymentSchedule.builder()
.paymentFrequency(P1M)
.paymentDateOffset(PLUS_THREE_DAYS)
.build())
.amount(ValueSchedule.of(2000d))
.currency(EUR)
.build();
coverBeanEquals(test, test2);
}
public void test_serialization() {
KnownAmountSwapLeg test = KnownAmountSwapLeg.builder()
.payReceive(PAY)
.accrualSchedule(PeriodicSchedule.builder()
.startDate(DATE_01_05)
.endDate(DATE_04_05)
.frequency(P1M)
.businessDayAdjustment(BusinessDayAdjustment.of(FOLLOWING, GBLO))
.build())
.paymentSchedule(PaymentSchedule.builder()
.paymentFrequency(P1M)
.paymentDateOffset(DaysAdjustment.ofBusinessDays(2, GBLO))
.build())
.amount(ValueSchedule.of(123d))
.currency(GBP)
.build();
assertSerialization(test);
}
}