/**
* 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 java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityCouponIborDefinition;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityPaymentFixedDefinition;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.financial.instrument.payment.PaymentFixedDefinition;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityPaymentFixed;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Coupon;
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.timeseries.DoubleTimeSeries;
import com.opengamma.timeseries.precise.zdt.ImmutableZonedDateTimeDoubleTimeSeries;
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 BondIborSecurityTest {
//Quarterly Libor6m 2Y
private static final Currency CUR = Currency.EUR;
private static final Calendar CALENDAR = new MondayToFridayCalendar("A");
private static final BusinessDayConvention BUSINESS_DAY = BusinessDayConventions.FOLLOWING;
private static final Period IBOR_TENOR = Period.ofMonths(3);
private static final DayCount IBOR_DAY_COUNT = DayCounts.ACT_360;
private static final int IBOR_SPOT_LAG = 2;
private static final BusinessDayConvention IBOR_BUSINESS_DAY = BusinessDayConventions.MODIFIED_FOLLOWING;
private static final boolean IBOR_IS_EOM = false;
private static final IborIndex IBOR_INDEX = new IborIndex(CUR, IBOR_TENOR, IBOR_SPOT_LAG, IBOR_DAY_COUNT, IBOR_BUSINESS_DAY, IBOR_IS_EOM, "Ibor");
private static final Period BOND_TENOR = Period.ofYears(2);
private static final int SETTLEMENT_DAYS = 3; // Standard for euro-bonds.
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 AnnuityCouponIborDefinition COUPON_DEFINITION = AnnuityCouponIborDefinition.fromAccrualUnadjusted(START_ACCRUAL_DATE, MATURITY_DATE, 1.0, IBOR_INDEX, false, CALENDAR);
private static final AnnuityPaymentFixedDefinition NOMINAL_DEFINITION = new AnnuityPaymentFixedDefinition(new PaymentFixedDefinition[] {new PaymentFixedDefinition(CUR, BUSINESS_DAY.adjustDate(
CALENDAR, MATURITY_DATE), 1.0)}, CALENDAR);
// to derivatives
private static final DayCount ACT_ACT = DayCounts.ACT_ACT_ISDA;
private static final ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2011, 8, 18);
private static final ZonedDateTime STANDARD_SETTLEMENT_DATE = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE, SETTLEMENT_DAYS, CALENDAR);
private static final double STANDARD_SETTLEMENT_TIME = ACT_ACT.getDayCountFraction(REFERENCE_DATE, STANDARD_SETTLEMENT_DATE);
private static final double FIRST_FIXING = 0.02;
private static final AnnuityPaymentFixed NOMINAL = NOMINAL_DEFINITION.toDerivative(REFERENCE_DATE);
private static final DoubleTimeSeries<ZonedDateTime> FIXING_TS;
private static final Annuity<Coupon> COUPON;
private static final BondIborSecurity BOND_DESCRIPTION;
static {
final List<ZonedDateTime> fixingDates = new ArrayList<>();
final List<Double> fixingRates = new ArrayList<>();
for (int i = 0; i < COUPON_DEFINITION.getNumberOfPayments(); i++) {
if (COUPON_DEFINITION.getNthPayment(i).getFixingDate().isBefore(REFERENCE_DATE)) {
fixingDates.add(COUPON_DEFINITION.getNthPayment(i).getFixingDate());
fixingRates.add(FIRST_FIXING);
}
}
FIXING_TS = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC(fixingDates, fixingRates);
COUPON = (Annuity<Coupon>) COUPON_DEFINITION.toDerivative(REFERENCE_DATE, FIXING_TS);
BOND_DESCRIPTION = new BondIborSecurity(NOMINAL, COUPON, STANDARD_SETTLEMENT_TIME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullNominal() {
new BondIborSecurity(null, COUPON, STANDARD_SETTLEMENT_TIME);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCoupon() {
new BondIborSecurity(NOMINAL, null, STANDARD_SETTLEMENT_TIME);
}
@SuppressWarnings("deprecation")
@Test(expectedExceptions = IllegalStateException.class)
public void testGetDiscounting() {
BOND_DESCRIPTION.getDiscountingCurveName();
}
@Test
public void testGetters() {
assertEquals(NOMINAL, BOND_DESCRIPTION.getNominal());
assertEquals(COUPON, BOND_DESCRIPTION.getCoupon());
}
@Test
public void testHashCodeEquals() {
final BondIborSecurity bond = new BondIborSecurity(NOMINAL, COUPON, STANDARD_SETTLEMENT_TIME);
BondIborSecurity other = new BondIborSecurity(NOMINAL, COUPON, STANDARD_SETTLEMENT_TIME);
assertEquals(bond, other);
assertEquals(bond.hashCode(), other.hashCode());
other = new BondIborSecurity(NOMINAL_DEFINITION.toDerivative(REFERENCE_DATE.minusDays(1)), COUPON, STANDARD_SETTLEMENT_TIME);
assertFalse(other.equals(bond));
other = new BondIborSecurity(NOMINAL, (Annuity<Coupon>) COUPON_DEFINITION.toDerivative(REFERENCE_DATE.minusDays(1), FIXING_TS), STANDARD_SETTLEMENT_TIME);
assertFalse(other.equals(bond));
}
}