/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.interestrate.bond.definition; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import org.testng.annotations.Test; import org.threeten.bp.Period; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.annuity.AnnuityCouponFixedDefinition; import com.opengamma.analytics.financial.instrument.annuity.AnnuityPaymentFixedDefinition; import com.opengamma.analytics.financial.instrument.bond.BondFixedSecurityDefinition; import com.opengamma.analytics.financial.instrument.payment.PaymentFixedDefinition; import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed; import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityPaymentFixed; import com.opengamma.analytics.financial.schedule.ScheduleCalculator; import com.opengamma.financial.convention.businessday.BusinessDayConvention; import com.opengamma.financial.convention.businessday.BusinessDayConventions; import com.opengamma.financial.convention.calendar.Calendar; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.convention.daycount.DayCount; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.financial.convention.yield.SimpleYieldConvention; import com.opengamma.financial.convention.yield.YieldConvention; import com.opengamma.financial.convention.yield.YieldConventionFactory; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; /** * Test. */ @Test(groups = TestGroup.UNIT) public class BondFixedSecurityTest { //Semi-annual 2Y private static final Currency CUR = Currency.EUR; private static final Period PAYMENT_TENOR = Period.ofMonths(6); private static final int PAYMENT_PER_YEAR = 2; private static final Calendar CALENDAR = new MondayToFridayCalendar("A"); private static final String ISSUER_NAME = "Issuer"; private static final DayCount DAY_COUNT = DayCounts.ACT_ACT_ICMA; private static final BusinessDayConvention BUSINESS_DAY = BusinessDayConventions.FOLLOWING; private static final boolean IS_EOM = false; private static final Period BOND_TENOR = Period.ofYears(2); private static final int SETTLEMENT_DAYS = 2; private static final ZonedDateTime START_ACCRUAL_DATE = DateUtils.getUTCDate(2011, 7, 13); private static final ZonedDateTime MATURITY_DATE = START_ACCRUAL_DATE.plus(BOND_TENOR); private static final double RATE = 0.0325; private static final YieldConvention YIELD_CONVENTION = YieldConventionFactory.INSTANCE.getYieldConvention("STREET CONVENTION"); private static final AnnuityCouponFixedDefinition COUPON_DEFINITION = AnnuityCouponFixedDefinition.fromAccrualUnadjusted(CUR, START_ACCRUAL_DATE, MATURITY_DATE, PAYMENT_TENOR, PAYMENT_PER_YEAR, true, true, CALENDAR, DAY_COUNT, BUSINESS_DAY, IS_EOM, 1.0, RATE, false); private static final AnnuityPaymentFixedDefinition NOMINAL_DEFINITION = new AnnuityPaymentFixedDefinition(new PaymentFixedDefinition[] {new PaymentFixedDefinition(CUR, MATURITY_DATE, 1.0)}, CALENDAR); private static final BondFixedSecurityDefinition BOND_SECURITY_DEFINITION = BondFixedSecurityDefinition.from(CUR, MATURITY_DATE, START_ACCRUAL_DATE, PAYMENT_TENOR, RATE, SETTLEMENT_DAYS, CALENDAR, DAY_COUNT, BUSINESS_DAY, YIELD_CONVENTION, IS_EOM, ISSUER_NAME); // to derivatives: first coupon private static final DayCount ACT_ACT = DayCounts.ACT_ACT_ISDA; private static final ZonedDateTime REFERENCE_DATE_1 = DateUtils.getUTCDate(2011, 8, 18); private static final ZonedDateTime SPOT_1 = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE_1, SETTLEMENT_DAYS, CALENDAR); private static final double SETTLEMENT_TIME_1 = ACT_ACT.getDayCountFraction(REFERENCE_DATE_1, SPOT_1); private static final AnnuityCouponFixedDefinition COUPON_DEFINITION_TRIM_1 = COUPON_DEFINITION.trimBefore(SPOT_1); private static final AnnuityCouponFixed COUPON_1 = COUPON_DEFINITION.toDerivative(REFERENCE_DATE_1); private static final AnnuityPaymentFixed NOMINAL_1 = NOMINAL_DEFINITION.toDerivative(REFERENCE_DATE_1); private static final double ACCRUED_AT_SPOT_1 = BOND_SECURITY_DEFINITION.accruedInterest(SPOT_1); private static final double FACTOR_SPOT_1 = DAY_COUNT.getAccruedInterest(COUPON_DEFINITION_TRIM_1.getNthPayment(0).getAccrualStartDate(), SPOT_1, COUPON_DEFINITION_TRIM_1.getNthPayment(0) .getAccrualEndDate(), 1.0, PAYMENT_PER_YEAR); private static final double FACTOR_PERIOD_1 = DAY_COUNT.getAccruedInterest(COUPON_DEFINITION_TRIM_1.getNthPayment(0).getAccrualStartDate(), COUPON_DEFINITION_TRIM_1.getNthPayment(0) .getAccrualEndDate(), COUPON_DEFINITION_TRIM_1.getNthPayment(0).getAccrualEndDate(), 1.0, PAYMENT_PER_YEAR); private static final double FACTOR_TO_NEXT_1 = (FACTOR_PERIOD_1 - FACTOR_SPOT_1) / FACTOR_PERIOD_1; private static final BondFixedSecurity BOND_DESCRIPTION_1 = new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); // to derivatives: second coupon private static final ZonedDateTime REFERENCE_DATE_2 = DateUtils.getUTCDate(2012, 2, 16); private static final ZonedDateTime SPOT_2 = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE_2, SETTLEMENT_DAYS, CALENDAR); private static final double SETTLEMENT_TIME_2 = ACT_ACT.getDayCountFraction(REFERENCE_DATE_2, SPOT_2); private static final AnnuityCouponFixedDefinition COUPON_DEFINITION_TRIM_2 = COUPON_DEFINITION.trimBefore(SPOT_2); private static final AnnuityCouponFixed COUPON_2 = COUPON_DEFINITION.toDerivative(REFERENCE_DATE_2); private static final AnnuityPaymentFixed NOMINAL_2 = NOMINAL_DEFINITION.toDerivative(REFERENCE_DATE_2); private static final double ACCRUED_AT_SPOT_2 = BOND_SECURITY_DEFINITION.accruedInterest(SPOT_2); private static final double FACTOR_SPOT_2 = DAY_COUNT.getAccruedInterest(COUPON_DEFINITION_TRIM_2.getNthPayment(0).getAccrualStartDate(), SPOT_2, COUPON_DEFINITION_TRIM_2.getNthPayment(0) .getAccrualEndDate(), 1.0, PAYMENT_PER_YEAR); private static final double FACTOR_PERIOD_2 = DAY_COUNT.getAccruedInterest(COUPON_DEFINITION_TRIM_2.getNthPayment(0).getAccrualStartDate(), COUPON_DEFINITION_TRIM_2.getNthPayment(0) .getAccrualStartDate(), COUPON_DEFINITION_TRIM_2.getNthPayment(0).getAccrualEndDate(), 1.0, PAYMENT_PER_YEAR); private static final double FACTOR_TO_NEXT_2 = (FACTOR_PERIOD_2 - FACTOR_SPOT_2) / FACTOR_PERIOD_2; private static final BondFixedSecurity BOND_DESCRIPTION_2 = new BondFixedSecurity(NOMINAL_2, COUPON_2, SETTLEMENT_TIME_2, ACCRUED_AT_SPOT_2, FACTOR_TO_NEXT_2, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); @Test(expectedExceptions = IllegalArgumentException.class) public void testNullNominal() { new BondFixedSecurity(null, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullCoupon() { new BondFixedSecurity(NOMINAL_1, null, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullYield() { new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, null, PAYMENT_PER_YEAR, "Issuer"); } @SuppressWarnings("deprecation") @Test(expectedExceptions = IllegalStateException.class) public void testGetDiscountingName() { BOND_DESCRIPTION_1.getDiscountingCurveName(); } @SuppressWarnings("deprecation") @Test(expectedExceptions = IllegalStateException.class) public void testRepoCurveName() { BOND_DESCRIPTION_1.getRepoCurveName(); } @Test public void testGetters1() { assertEquals(NOMINAL_1, BOND_DESCRIPTION_1.getNominal()); assertEquals(COUPON_1, BOND_DESCRIPTION_1.getCoupon()); } @Test public void testGetters2() { assertEquals(NOMINAL_2, BOND_DESCRIPTION_2.getNominal()); assertEquals(COUPON_2, BOND_DESCRIPTION_2.getCoupon()); } @Test public void testHashCodeEquals() { final BondFixedSecurity bond = new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); BondFixedSecurity other = new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); assertEquals(bond, other); assertEquals(bond.hashCode(), other.hashCode()); other = new BondFixedSecurity(NOMINAL_DEFINITION.toDerivative(REFERENCE_DATE_1.minusDays(1)), COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); assertFalse(other.equals(bond)); other = new BondFixedSecurity(NOMINAL_1, COUPON_DEFINITION.toDerivative(REFERENCE_DATE_1.minusDays(1)), SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); assertFalse(other.equals(bond)); other = new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1 + 1, FACTOR_TO_NEXT_1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); assertFalse(other.equals(bond)); other = new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1 + 1, YIELD_CONVENTION, PAYMENT_PER_YEAR, "Issuer"); assertFalse(other.equals(bond)); other = new BondFixedSecurity(NOMINAL_1, COUPON_1, SETTLEMENT_TIME_1, ACCRUED_AT_SPOT_1, FACTOR_TO_NEXT_1, SimpleYieldConvention.AUSTRIA_ISMA_METHOD, PAYMENT_PER_YEAR, "Issuer"); assertFalse(other.equals(bond)); } }