/** * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.product.bond; 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.HolidayCalendarIds.EUTA; 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 com.opengamma.strata.collect.TestHelper.date; 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.StandardId; 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.DayCount; import com.opengamma.strata.basics.date.DayCounts; 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.StubConvention; import com.opengamma.strata.product.SecurityInfo; import com.opengamma.strata.product.SecurityPriceInfo; import com.opengamma.strata.product.TradeInfo; /** * Test {@link FixedCouponBondSecurity}. */ @Test public class FixedCouponBondSecurityTest { private static final FixedCouponBond PRODUCT = FixedCouponBondTest.sut(); private static final FixedCouponBond PRODUCT2 = FixedCouponBondTest.sut2(); private static final SecurityPriceInfo PRICE_INFO = SecurityPriceInfo.of(0.1, CurrencyAmount.of(GBP, 25)); private static final SecurityInfo INFO = SecurityInfo.of(PRODUCT.getSecurityId(), PRICE_INFO); private static final FixedCouponBondYieldConvention YIELD_CONVENTION = FixedCouponBondYieldConvention.DE_BONDS; private static final StandardId LEGAL_ENTITY = StandardId.of("OG-Ticker", "BUN EUR"); private static final double NOTIONAL = 1.0e7; private static final double FIXED_RATE = 0.015; private static final DaysAdjustment DATE_OFFSET = DaysAdjustment.ofBusinessDays(3, EUTA); private static final DayCount DAY_COUNT = DayCounts.ACT_365F; private static final LocalDate START_DATE = LocalDate.of(2015, 4, 12); private static final LocalDate END_DATE = LocalDate.of(2025, 4, 12); private static final BusinessDayAdjustment BUSINESS_ADJUST = BusinessDayAdjustment.of(BusinessDayConventions.MODIFIED_FOLLOWING, EUTA); private static final PeriodicSchedule PERIOD_SCHEDULE = PeriodicSchedule.of( START_DATE, END_DATE, Frequency.P6M, BUSINESS_ADJUST, StubConvention.SHORT_INITIAL, false); private static final int EX_COUPON_DAYS = 5; //------------------------------------------------------------------------- public void test_builder() { FixedCouponBondSecurity test = sut(); assertEquals(test.getInfo(), INFO); assertEquals(test.getSecurityId(), PRODUCT.getSecurityId()); assertEquals(test.getCurrency(), PRODUCT.getCurrency()); assertEquals(test.getUnderlyingIds(), ImmutableSet.of()); } public void test_builder_fail() { assertThrowsIllegalArg(() -> FixedCouponBondSecurity.builder() .info(INFO) .dayCount(DAY_COUNT) .fixedRate(FIXED_RATE) .legalEntityId(LEGAL_ENTITY) .currency(EUR) .notional(NOTIONAL) .accrualSchedule(PERIOD_SCHEDULE) .settlementDateOffset(DATE_OFFSET) .yieldConvention(YIELD_CONVENTION) .exCouponPeriod(DaysAdjustment.ofBusinessDays(EX_COUPON_DAYS, EUTA, BUSINESS_ADJUST)) .build()); assertThrowsIllegalArg(() -> FixedCouponBondSecurity.builder() .info(INFO) .dayCount(DAY_COUNT) .fixedRate(FIXED_RATE) .legalEntityId(LEGAL_ENTITY) .currency(EUR) .notional(NOTIONAL) .accrualSchedule(PERIOD_SCHEDULE) .settlementDateOffset(DaysAdjustment.ofBusinessDays(-3, EUTA)) .yieldConvention(YIELD_CONVENTION) .build()); } //------------------------------------------------------------------------- public void test_createProduct() { FixedCouponBondSecurity test = sut(); assertEquals(test.createProduct(ReferenceData.empty()), PRODUCT); TradeInfo tradeInfo = TradeInfo.of(date(2016, 6, 30)); FixedCouponBondTrade expectedTrade = FixedCouponBondTrade.builder() .info(tradeInfo) .product(PRODUCT) .quantity(100) .price(123.50) .build(); assertEquals(test.createTrade(tradeInfo, 100, 123.50, ReferenceData.empty()), expectedTrade); } //------------------------------------------------------------------------- public void coverage() { coverImmutableBean(sut()); coverBeanEquals(sut(), sut2()); } public void test_serialization() { assertSerialization(sut()); } //------------------------------------------------------------------------- static FixedCouponBondSecurity sut() { return createSecurity(PRODUCT); } static FixedCouponBondSecurity sut2() { return createSecurity(PRODUCT2); } static FixedCouponBondSecurity createSecurity(FixedCouponBond product) { return FixedCouponBondSecurity.builder() .info(SecurityInfo.of(product.getSecurityId(), INFO.getPriceInfo())) .currency(product.getCurrency()) .notional(product.getNotional()) .accrualSchedule(product.getAccrualSchedule()) .fixedRate(product.getFixedRate()) .dayCount(product.getDayCount()) .yieldConvention(product.getYieldConvention()) .legalEntityId(product.getLegalEntityId()) .settlementDateOffset(product.getSettlementDateOffset()) .exCouponPeriod(product.getExCouponPeriod()) .build(); } }