/** * 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.date.DayCounts.ACT_360; import static com.opengamma.strata.basics.date.HolidayCalendarIds.EUTA; 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 static org.testng.Assert.assertFalse; 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.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.schedule.RollConventions; import com.opengamma.strata.basics.schedule.StubConvention; import com.opengamma.strata.basics.value.ValueSchedule; import com.opengamma.strata.product.swap.FixedRateCalculation; 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.SwapIndex; import com.opengamma.strata.product.swap.SwapIndices; import com.opengamma.strata.product.swap.SwapLeg; /** * Test {@link Cms}. */ @Test public class CmsTest { private static final ReferenceData REF_DATA = ReferenceData.standard(); private static final ValueSchedule NOTIONAL = ValueSchedule.of(1.0e6); private static final SwapIndex INDEX = SwapIndices.EUR_EURIBOR_1100_10Y; private static final LocalDate START = LocalDate.of(2015, 10, 21); private static final LocalDate END = LocalDate.of(2017, 10, 21); private static final Frequency FREQUENCY = Frequency.P12M; private static final BusinessDayAdjustment BUSS_ADJ_EUR = BusinessDayAdjustment.of(BusinessDayConventions.FOLLOWING, EUTA); private static final PeriodicSchedule SCHEDULE_EUR = PeriodicSchedule.of(START, END, FREQUENCY, BUSS_ADJ_EUR, StubConvention.NONE, RollConventions.NONE); private static final ValueSchedule STRIKE = ValueSchedule.of(0.0125); private static final CmsLeg CMS_LEG = CmsLegTest.sutCap(); private static final SwapLeg PAY_LEG = RateCalculationSwapLeg.builder() .payReceive(PAY) .accrualSchedule(SCHEDULE_EUR) .calculation( FixedRateCalculation.of(0.01, ACT_360)) .paymentSchedule( PaymentSchedule.builder().paymentFrequency(FREQUENCY).paymentDateOffset(DaysAdjustment.NONE).build()) .notionalSchedule( NotionalSchedule.of(CurrencyAmount.of(EUR, 1.0e6))) .build(); //------------------------------------------------------------------------- public void test_of_twoLegs() { Cms test = sutCap(); assertEquals(test.getCmsLeg(), CMS_LEG); assertEquals(test.getPayLeg().get(), PAY_LEG); assertEquals(test.allPaymentCurrencies(), ImmutableSet.of(CMS_LEG.getCurrency())); assertEquals(test.allRateIndices(), ImmutableSet.of(CMS_LEG.getUnderlyingIndex())); } public void test_of_oneLeg() { Cms test = Cms.of(CMS_LEG); assertEquals(test.getCmsLeg(), CMS_LEG); assertFalse(test.getPayLeg().isPresent()); assertEquals(test.allPaymentCurrencies(), ImmutableSet.of(CMS_LEG.getCurrency())); } public void test_resolve_twoLegs() { Cms base = sutCap(); ResolvedCms test = base.resolve(REF_DATA); assertEquals(test.getCmsLeg(), CMS_LEG.resolve(REF_DATA)); assertEquals(test.getPayLeg().get(), PAY_LEG.resolve(REF_DATA)); } public void test_resolve_oneLeg() { Cms base = Cms.of(CMS_LEG); ResolvedCms test = base.resolve(REF_DATA); assertEquals(test.getCmsLeg(), CMS_LEG.resolve(REF_DATA)); assertFalse(test.getPayLeg().isPresent()); } //------------------------------------------------------------------------- public void coverage() { coverImmutableBean(sutCap()); coverBeanEquals(sutCap(), sutFloor()); } public void test_serialization() { assertSerialization(sutCap()); } //------------------------------------------------------------------------- static Cms sutCap() { return Cms.of(CMS_LEG, PAY_LEG); } static Cms sutFloor() { return Cms.of( CmsLeg.builder() .floorSchedule(STRIKE) .index(INDEX) .notional(NOTIONAL) .payReceive(RECEIVE) .paymentSchedule(SCHEDULE_EUR) .build()); } }