/**
* 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 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.bond.BondFixedSecurityDefinition;
import com.opengamma.analytics.financial.instrument.bond.BondFixedTransactionDefinition;
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.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 BondFixedTransactionTest {
//Semi-annual 2Y
private static final Currency CUR = Currency.EUR;
private static final Period PAYMENT_TENOR = Period.ofMonths(6);
private static final int COUPON_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 = 3;
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 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: common
private static final DayCount ACT_ACT = DayCounts.ACT_ACT_ISDA;
// to derivatives: first coupon
private static final ZonedDateTime REFERENCE_DATE_Z_1 = DateUtils.getUTCDate(2011, 8, 18);
// Transaction
private static final double PRICE = 0.90;
private static final ZonedDateTime BOND_SETTLEMENT_DATE = DateUtils.getUTCDate(2011, 8, 24);
private static final double BOND_SETTLEMENT_TIME = ACT_ACT.getDayCountFraction(REFERENCE_DATE_Z_1, BOND_SETTLEMENT_DATE);
private static final ZonedDateTime STANDARD_SETTLEMENT_DATE = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE_Z_1, SETTLEMENT_DAYS, CALENDAR);
private static final double STANDARD_SETTLEMENT_TIME = ACT_ACT.getDayCountFraction(REFERENCE_DATE_Z_1, STANDARD_SETTLEMENT_DATE);
private static final double QUANTITY = 100000000; //100m
private static final AnnuityCouponFixedDefinition COUPON_DEFINITION = BOND_SECURITY_DEFINITION.getCoupons();
private static final AnnuityCouponFixedDefinition COUPON_DEFINITION_TRIM = COUPON_DEFINITION.trimBefore(STANDARD_SETTLEMENT_DATE);
private static final AnnuityCouponFixed COUPON = BOND_SECURITY_DEFINITION.getCoupons().toDerivative(REFERENCE_DATE_Z_1);
private static final AnnuityPaymentFixed NOMINAL = (AnnuityPaymentFixed) BOND_SECURITY_DEFINITION.getNominal().toDerivative(REFERENCE_DATE_Z_1);
private static final AnnuityCouponFixed COUPON_TR = COUPON.trimBefore(BOND_SETTLEMENT_TIME);
private static final AnnuityPaymentFixed NOMINAL_TR = NOMINAL.trimBefore(BOND_SETTLEMENT_TIME);
private static final AnnuityCouponFixed COUPON_STD = COUPON.trimBefore(STANDARD_SETTLEMENT_TIME);
private static final AnnuityPaymentFixed NOMINAL_STD = NOMINAL.trimBefore(STANDARD_SETTLEMENT_TIME);
private static final BondFixedTransactionDefinition BOND_TRANSACTION_DEFINITION = new BondFixedTransactionDefinition(BOND_SECURITY_DEFINITION, QUANTITY, BOND_SETTLEMENT_DATE, PRICE);
private static final double ACCRUED_AT_SPOT = BOND_SECURITY_DEFINITION.accruedInterest(STANDARD_SETTLEMENT_DATE);
private static final double FACTOR_SPOT = DAY_COUNT.getAccruedInterest(COUPON_DEFINITION_TRIM.getNthPayment(0).getAccrualStartDate(), STANDARD_SETTLEMENT_DATE,
COUPON_DEFINITION_TRIM.getNthPayment(0).getAccrualEndDate(), 1.0, COUPON_PER_YEAR);
private static final double FACTOR_PERIOD = DAY_COUNT.getAccruedInterest(COUPON_DEFINITION_TRIM.getNthPayment(0).getAccrualStartDate(),
COUPON_DEFINITION_TRIM.getNthPayment(0).getAccrualStartDate(), COUPON_DEFINITION_TRIM.getNthPayment(0).getAccrualEndDate(), 1.0, COUPON_PER_YEAR);
private static final double FACTOR_TO_NEXT = (FACTOR_PERIOD - FACTOR_SPOT) / FACTOR_PERIOD;
private static final BondFixedSecurity BOND_TR_DESCRIPTION = new BondFixedSecurity(NOMINAL_TR, COUPON_TR, BOND_SETTLEMENT_TIME, BOND_TRANSACTION_DEFINITION.getAccruedInterestAtSettlement(), 0.0,
YIELD_CONVENTION, COUPON_PER_YEAR, "Issuer");
private static final BondFixedSecurity BOND_STD_DESCRIPTION = new BondFixedSecurity(NOMINAL_STD, COUPON_STD, STANDARD_SETTLEMENT_TIME, ACCRUED_AT_SPOT, FACTOR_TO_NEXT, YIELD_CONVENTION,
COUPON_PER_YEAR, "Issuer");
private static final BondFixedTransaction BOND_TRANSACTION = new BondFixedTransaction(BOND_TR_DESCRIPTION, QUANTITY, PRICE, BOND_STD_DESCRIPTION, 1.0);
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullBondPurchase() {
new BondFixedTransaction(null, QUANTITY, PRICE, BOND_STD_DESCRIPTION, 1.0);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullBondStandard() {
new BondFixedTransaction(BOND_TR_DESCRIPTION, QUANTITY, PRICE, null, 1.0);
}
@Test
public void testGetters1() {
assertEquals(BOND_TR_DESCRIPTION, BOND_TRANSACTION.getBondTransaction());
assertEquals(QUANTITY, BOND_TRANSACTION.getQuantity());
// assertEquals(-PRICE * QUANTITY, BOND_TRANSACTION.getSettlementAmount());
assertEquals(BOND_STD_DESCRIPTION, BOND_TRANSACTION.getBondStandard());
assertEquals(STANDARD_SETTLEMENT_TIME, BOND_TRANSACTION.getBondStandard().getSettlementTime());
assertEquals(BOND_SETTLEMENT_TIME, BOND_TRANSACTION.getBondTransaction().getSettlementTime());
assertEquals(ACCRUED_AT_SPOT, BOND_TRANSACTION.getBondStandard().getAccruedInterest());
}
}