/**
* 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.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.analytics.util.time.TimeCalculator;
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 security.
*/
@Test(groups = TestGroup.UNIT)
public class BillSecurityDefinitionTest {
/** The currency */
private final static Currency EUR = Currency.EUR;
/** A holiday calendar */
private static final Calendar CALENDAR = new MondayToFridayCalendar("TARGET");
/** The day count */
private static final DayCount ACT360 = DayCounts.ACT_360;
/** The number of 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;
/** A security definition */
private final static BillSecurityDefinition BILL_SEC_DEFINITION1 = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
/** A security definition */
private final static BillSecurityDefinition BILL_SEC_DEFINITION2 = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL);
/** The pricing date */
private final static ZonedDateTime REFERENCE_DATE = DateUtils.getUTCDate(2012, 1, 17);
/**
* Tests failure for a null currency.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullCurrency1() {
new BillSecurityDefinition(null, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
}
/**
* Tests failure for a null maturity.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullEndDate1() {
new BillSecurityDefinition(EUR, null, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
}
/**
* Tests failure for a null calendar.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullCalendar1() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, null, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
}
/**
* Tests failure for a null yield convention.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullYield1() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, null, ACT360, ISSUER_BEL_NAME);
}
/**
* Tests failure for a null day count.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullDayCount1() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, null, ISSUER_BEL_NAME);
}
/**
* Tests failure for a null issuer name.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullIssuerName() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, (String) null);
}
/**
* Tests failure for a null issuer.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullIssuer() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, (LegalEntity) null);
}
/**
* Tests failure for a negative notional.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void notionalPositive() {
new BillSecurityDefinition(EUR, END_DATE, -NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
}
/**
* Tests failure for a null currency.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullCurrency2() {
new BillSecurityDefinition(null, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL);
}
/**
* Tests failure for a null maturity.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullEndDate2() {
new BillSecurityDefinition(EUR, null, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL);
}
/**
* Tests failure for a null calendar.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullCalendar2() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, null, YIELD_CONVENTION, ACT360, ISSUER_BEL);
}
/**
* Tests failure for a null yield convention.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullYield2() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, null, ACT360, ISSUER_BEL);
}
/**
* Tests failure for a null day count.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullDayCount2() {
new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, null, ISSUER_BEL);
}
/**
* Tests the bill getters.
*/
@Test
public void getters() {
assertEquals("Bill Security Definition: getter", EUR, BILL_SEC_DEFINITION1.getCurrency());
assertEquals("Bill Security Definition: getter", END_DATE, BILL_SEC_DEFINITION1.getEndDate());
assertEquals("Bill Security Definition: getter", NOTIONAL, BILL_SEC_DEFINITION1.getNotional());
assertEquals("Bill Security Definition: getter", SETTLEMENT_DAYS, BILL_SEC_DEFINITION1.getSettlementDays());
assertEquals("Bill Security Definition: getter", CALENDAR, BILL_SEC_DEFINITION1.getCalendar());
assertEquals("Bill Security Definition: getter", YIELD_CONVENTION, BILL_SEC_DEFINITION1.getYieldConvention());
assertEquals("Bill Security Definition: getter", ACT360, BILL_SEC_DEFINITION1.getDayCount());
assertEquals("Bill Security Definition: getter", new LegalEntity(null, ISSUER_BEL_NAME, null, null, null), BILL_SEC_DEFINITION1.getIssuerEntity());
assertEquals("Bill Security Definition: getter", ISSUER_BEL_NAME, BILL_SEC_DEFINITION1.getIssuer());
}
/**
* Tests the equal and hash-code methods.
*/
@Test
public void equalHash() {
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1, BILL_SEC_DEFINITION1);
BillSecurityDefinition other = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1, other);
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.hashCode(), other.hashCode());
BillSecurityDefinition modified;
modified = new BillSecurityDefinition(Currency.USD, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE.plusDays(1), NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL + 10.0, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS + 1, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, new MondayToFridayCalendar("OTHER"), YIELD_CONVENTION, ACT360, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YieldConventionFactory.INSTANCE.getYieldConvention("DISCOUNT"), ACT360, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, DayCounts.ACT_365, ISSUER_BEL_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_GER_NAME);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
other = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, new LegalEntity(null, ISSUER_BEL_NAME, null, null, null));
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1, other);
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.hashCode(), other.hashCode());
other = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_BEL);
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION2, other);
assertEquals("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION2.hashCode(), other.hashCode());
modified = new BillSecurityDefinition(EUR, END_DATE, NOTIONAL, SETTLEMENT_DAYS, CALENDAR, YIELD_CONVENTION, ACT360, ISSUER_GER);
assertFalse("Bill Security Definition: equal-hash code", BILL_SEC_DEFINITION1.equals(modified));
}
/**
* Tests the toDerivative methods.
*/
@Test
public void toDerivative() {
final ZonedDateTime standardSettlementDate = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE, SETTLEMENT_DAYS, CALENDAR);
final BillSecurity securityConverted1 = BILL_SEC_DEFINITION1.toDerivative(REFERENCE_DATE, standardSettlementDate);
final double standardSettlementTime = TimeCalculator.getTimeBetween(REFERENCE_DATE, standardSettlementDate);
final double endTime = TimeCalculator.getTimeBetween(REFERENCE_DATE, END_DATE);
final double accrualFactorStandard = ACT360.getDayCountFraction(standardSettlementDate, END_DATE);
final BillSecurity securityExpected1 = new BillSecurity(EUR, standardSettlementTime, endTime, NOTIONAL, YIELD_CONVENTION, accrualFactorStandard, ISSUER_BEL_NAME);
assertEquals("Bill Security Definition: toDerivative", securityExpected1, securityConverted1);
final BillSecurity securityConverted2 = BILL_SEC_DEFINITION1.toDerivative(REFERENCE_DATE);
assertEquals("Bill Security Definition: toDerivative", securityExpected1, securityConverted2);
final ZonedDateTime otherSettlementDate = ScheduleCalculator.getAdjustedDate(REFERENCE_DATE, SETTLEMENT_DAYS + 1, CALENDAR);
final BillSecurity securityConverted3 = BILL_SEC_DEFINITION1.toDerivative(REFERENCE_DATE, otherSettlementDate);
final double otherSettlementTime = TimeCalculator.getTimeBetween(REFERENCE_DATE, otherSettlementDate);
final double accrualFactorOther = ACT360.getDayCountFraction(otherSettlementDate, END_DATE);
final BillSecurity securityExpected3 = new BillSecurity(EUR, otherSettlementTime, endTime, NOTIONAL, YIELD_CONVENTION, accrualFactorOther, ISSUER_BEL_NAME);
assertEquals("Bill Security Definition: toDerivative", securityExpected3, securityConverted3);
}
}