/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.instrument.bond;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import java.util.Collections;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.interestrate.bond.definition.BillSecurity;
import com.opengamma.analytics.financial.interestrate.bond.definition.BillTransaction;
import com.opengamma.analytics.financial.interestrate.bond.provider.BillSecurityDiscountingMethod;
import com.opengamma.analytics.financial.legalentity.CreditRating;
import com.opengamma.analytics.financial.legalentity.LegalEntity;
import com.opengamma.analytics.financial.legalentity.Region;
import com.opengamma.analytics.financial.legalentity.Sector;
import com.opengamma.analytics.financial.schedule.ScheduleCalculator;
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.i18n.Country;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Tests related to the construction of bills transaction.
*/
@Test(groups = TestGroup.UNIT)
public class BillTransactionDefinitionTest {
/** The currency */
private final static Currency EUR = Currency.EUR;
/** The holiday calendar */
private static final Calendar CALENDAR = new MondayToFridayCalendar("TARGET");
/** The day count */
private static final DayCount ACT360 = DayCounts.ACT_360;
/** The settlement days */
private static final int SETTLEMENT_DAYS = 2;
/** The yield convention */
private static final YieldConvention YIELD_CONVENTION = YieldConventionFactory.INSTANCE.getYieldConvention("INTEREST@MTY");
/** Belgian government name */
private final static String ISSUER_BEL_NAME = "BELGIUM GOVT";
/** German government name */
private final static String ISSUER_GER_NAME = "GERMANY GOVT";
/** Belgian government entity */
private final static LegalEntity ISSUER_BEL = new LegalEntity(null, ISSUER_BEL_NAME, Collections.singleton(CreditRating.of("A", "Custom", true)), Sector.of("Government"), Region.of("Belgium", Country.BE, Currency.EUR));
/** German government entity */
private final static LegalEntity ISSUER_GER = new LegalEntity(null, ISSUER_GER_NAME, Collections.singleton(CreditRating.of("AA", "Custom", true)), Sector.of("Government"), Region.of("Germany", Country.DE, Currency.EUR));
/** The maturity */
private final static ZonedDateTime END_DATE = DateUtils.getUTCDate(2012, 2, 29);
/** The notional */
private final static double NOTIONAL = 1000;
/** The underlying bill */
private final static BillSecurityDefinition BILL_SEC_DEFINITION = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL);
/** The quantity */
private final static double QUANTITY = 123456;
/** The settlement date */
private final static ZonedDateTime SETTLE_DATE = DateUtils.getUTCDate(2012, 1, 18);
/** The settlement amount */
private final static double SETTLE_AMOUNT = -NOTIONAL * QUANTITY * 99.95;
/** The discounting curve name */
private final static String DSC_NAME = "EUR Discounting";
/** The credit curve name */
private final static String CREDIT_NAME = "EUR BELGIUM GOVT";
/** The transaction */
private final static BillTransactionDefinition BILL_TRA_DEFINITION = new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE, SETTLE_AMOUNT);
/** The pricing method */
private static final BillSecurityDiscountingMethod METHOD_BILL_SECURITY = BillSecurityDiscountingMethod.getInstance();
/**
* Tests failure for a null underlying.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullUnderlying() {
new BillTransactionDefinition(null, QUANTITY, SETTLE_DATE, SETTLE_AMOUNT);
}
/**
* Tests failure for a null settlement date.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullSettleDate() {
new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, null, SETTLE_AMOUNT);
}
/**
* Tests failure for a negative settle amount
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void wrongSettleAmount() {
new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE, -SETTLE_AMOUNT);
}
/**
* Tests the bill getters.
*/
@Test
public void getters() {
assertEquals("Bill Transaction Definition: getter", BILL_SEC_DEFINITION, BILL_TRA_DEFINITION.getUnderlying());
assertEquals("Bill Transaction Definition: getter", QUANTITY, BILL_TRA_DEFINITION.getQuantity());
assertEquals("Bill Transaction Definition: getter", SETTLE_DATE, BILL_TRA_DEFINITION.getSettlementDate());
assertEquals("Bill Transaction Definition: getter", SETTLE_AMOUNT, BILL_TRA_DEFINITION.getSettlementAmount());
}
/**
* Tests the constructor from yield.
*/
@Test
public void fromYield() {
final double yield = 0.0020;
final double accrualFactor = ACT360.getDayCountFraction(SETTLE_DATE, END_DATE);
final double price = METHOD_BILL_SECURITY.priceFromYield(YIELD_CONVENTION, yield, accrualFactor);
final double settlementAmount = -QUANTITY * price * NOTIONAL;
final BillTransactionDefinition from = BillTransactionDefinition.fromYield(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE, yield, CALENDAR);
final BillTransactionDefinition constructed = new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE, settlementAmount);
assertEquals("Bill Transaction Definition: fromYield", constructed, from);
}
/**
* Tests the equal and hash-code methods.
*/
@Test
public void equalHash() {
assertEquals("Bill Transaction Definition: equal-hash code", BILL_TRA_DEFINITION, BILL_TRA_DEFINITION);
final BillTransactionDefinition other = new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE, SETTLE_AMOUNT);
assertEquals("Bill Transaction Definition: equal-hash code", BILL_TRA_DEFINITION, other);
assertEquals("Bill Transaction Definition: equal-hash code", BILL_TRA_DEFINITION.hashCode(), other.hashCode());
BillTransactionDefinition modified;
modified = new BillTransactionDefinition(new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_GER), QUANTITY, SETTLE_DATE, SETTLE_AMOUNT);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION.equals(modified));
modified = new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY + 10.0, SETTLE_DATE, SETTLE_AMOUNT);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION.equals(modified));
modified = new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE.plusDays(1), SETTLE_AMOUNT);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION.equals(modified));
modified = new BillTransactionDefinition(BILL_SEC_DEFINITION, QUANTITY, SETTLE_DATE, SETTLE_AMOUNT + 1.0);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION.equals(modified));
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivativeStandard() {
final ZonedDateTime referenceDateStandard = ScheduleCalculator.getAdjustedDate(SETTLE_DATE, -SETTLEMENT_DAYS, CALENDAR);
final BillTransaction transactionConverted1 = BILL_TRA_DEFINITION.toDerivative(referenceDateStandard);
final BillSecurity purchased1 = BILL_SEC_DEFINITION.toDerivative(referenceDateStandard, SETTLE_DATE);
final BillSecurity standard1 = BILL_SEC_DEFINITION.toDerivative(referenceDateStandard);
final BillTransaction transactionExpected1 = new BillTransaction(purchased1, QUANTITY, SETTLE_AMOUNT, standard1);
assertEquals("Bill Transaction: toDerivatives", transactionExpected1, transactionConverted1);
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivativeEarly() {
final ZonedDateTime referenceDateEarly = ScheduleCalculator.getAdjustedDate(SETTLE_DATE, -(SETTLEMENT_DAYS + 1), CALENDAR);
final BillTransaction transactionConverted2 = BILL_TRA_DEFINITION.toDerivative(referenceDateEarly);
final BillSecurity purchased2 = BILL_SEC_DEFINITION.toDerivative(referenceDateEarly, SETTLE_DATE);
final BillSecurity standard2 = BILL_SEC_DEFINITION.toDerivative(referenceDateEarly);
final BillTransaction transactionExpected2 = new BillTransaction(purchased2, QUANTITY, SETTLE_AMOUNT, standard2);
assertEquals("Bill Transaction: toDerivatives", transactionExpected2, transactionConverted2);
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivativeAtSettle() {
final ZonedDateTime referenceDate = SETTLE_DATE;
final BillTransaction transactionConverted = BILL_TRA_DEFINITION.toDerivative(referenceDate);
final BillSecurity purchased = BILL_SEC_DEFINITION.toDerivative(referenceDate, SETTLE_DATE);
final BillSecurity standard = BILL_SEC_DEFINITION.toDerivative(referenceDate);
final BillTransaction transactionExpected = new BillTransaction(purchased, QUANTITY, SETTLE_AMOUNT, standard);
assertEquals("Bill Transaction: toDerivatives", transactionExpected, transactionConverted);
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivativeBetweenSettleAndMaturity() {
final ZonedDateTime referenceDate = ScheduleCalculator.getAdjustedDate(SETTLE_DATE, SETTLEMENT_DAYS, CALENDAR);
final BillTransaction transactionConverted = BILL_TRA_DEFINITION.toDerivative(referenceDate);
final BillSecurity purchased = BILL_SEC_DEFINITION.toDerivative(referenceDate, SETTLE_DATE);
final BillSecurity standard = BILL_SEC_DEFINITION.toDerivative(referenceDate);
final BillTransaction transactionExpected = new BillTransaction(purchased, QUANTITY, 0.0, standard);
assertEquals("Bill Transaction: toDerivatives", transactionExpected, transactionConverted);
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivativeBetweenJustBeforeMaturity() {
final ZonedDateTime referenceDate = ScheduleCalculator.getAdjustedDate(END_DATE, -1, CALENDAR);
final BillTransaction transactionConverted = BILL_TRA_DEFINITION.toDerivative(referenceDate);
final BillSecurity purchased = BILL_SEC_DEFINITION.toDerivative(referenceDate, SETTLE_DATE);
final BillSecurity standard = BILL_SEC_DEFINITION.toDerivative(referenceDate);
final BillTransaction transactionExpected = new BillTransaction(purchased, QUANTITY, 0.0, standard);
assertEquals("Bill Transaction: toDerivatives", transactionExpected, transactionConverted);
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivativeBetweenAtMaturity() {
final ZonedDateTime referenceDate = END_DATE;
final BillTransaction transactionConverted = BILL_TRA_DEFINITION.toDerivative(referenceDate);
final BillSecurity purchased = BILL_SEC_DEFINITION.toDerivative(referenceDate, SETTLE_DATE);
final BillSecurity standard = BILL_SEC_DEFINITION.toDerivative(referenceDate);
final BillTransaction transactionExpected = new BillTransaction(purchased, QUANTITY, 0.0, standard);
assertEquals("Bill Transaction: toDerivatives", transactionExpected, transactionConverted);
}
}