/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.instrument.cash.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.cash.DepositZeroDefinition;
import com.opengamma.analytics.financial.instrument.index.GeneratorDeposit;
import com.opengamma.analytics.financial.instrument.index.generator.EURDeposit;
import com.opengamma.analytics.financial.interestrate.ContinuousInterestRate;
import com.opengamma.analytics.financial.interestrate.InterestRate;
import com.opengamma.analytics.financial.interestrate.PeriodicInterestRate;
import com.opengamma.analytics.financial.interestrate.cash.derivative.DepositZero;
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.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Tests related to the construction and the conversion to derivative of DepositZeroDefinition.
*/
@Test(groups = TestGroup.UNIT)
public class DepositZeroDefinitionTest {
private static final Calendar TARGET = new MondayToFridayCalendar("TARGET");
private static final GeneratorDeposit GENERATOR = new EURDeposit(TARGET);
private static final Currency EUR = GENERATOR.getCurrency();
private static final ZonedDateTime TRADE_DATE = DateUtils.getUTCDate(2011, 12, 12);
private static final ZonedDateTime SPOT_DATE = ScheduleCalculator.getAdjustedDate(TRADE_DATE, GENERATOR.getSpotLag(), TARGET);
private static final double NOTIONAL = 100000000;
private static final double RATE_FIGURE = 0.0250;
private static final InterestRate RATE = new ContinuousInterestRate(RATE_FIGURE);
private static final Period DEPOSIT_PERIOD = Period.ofMonths(6);
private static final ZonedDateTime END_DATE = ScheduleCalculator.getAdjustedDate(SPOT_DATE, DEPOSIT_PERIOD, GENERATOR);
private static final DayCount DAY_COUNT = DayCounts.ACT_365;
private static final double DEPOSIT_AF = DAY_COUNT.getDayCountFraction(SPOT_DATE, END_DATE);
private static final Calendar CALENDAR = new MondayToFridayCalendar("Weekend");
private static final DepositZeroDefinition DEPOSIT_DEFINITION = new DepositZeroDefinition(EUR, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
private static final String CURVE_NAME = "Curve";
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullCurrency() {
new DepositZeroDefinition(null, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullStart() {
new DepositZeroDefinition(EUR, null, END_DATE, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullEnd() {
new DepositZeroDefinition(EUR, SPOT_DATE, null, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullRate() {
new DepositZeroDefinition(EUR, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF, null, CALENDAR, DAY_COUNT);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void nullDayCount() {
DepositZeroDefinition.from(EUR, SPOT_DATE, END_DATE, null, RATE, CALENDAR, DAY_COUNT);
}
@Test
/**
* Tests the getters
*/
public void getter() {
assertEquals("DepositZeroDefinition: getter", SPOT_DATE, DEPOSIT_DEFINITION.getStartDate());
assertEquals("DepositZeroDefinition: getter", END_DATE, DEPOSIT_DEFINITION.getEndDate());
assertEquals("DepositZeroDefinition: getter", NOTIONAL, DEPOSIT_DEFINITION.getNotional());
assertEquals("DepositZeroDefinition: getter", RATE, DEPOSIT_DEFINITION.getRate());
assertEquals("DepositZeroDefinition: getter", EUR, DEPOSIT_DEFINITION.getCurrency());
assertEquals("DepositZeroDefinition: getter", DEPOSIT_AF, DEPOSIT_DEFINITION.getPaymentAccrualFactor());
final double interestAmount = (1.0 / RATE.getDiscountFactor(DEPOSIT_AF) - 1) * NOTIONAL;
assertEquals("DepositZeroDefinition: getter", interestAmount, DEPOSIT_DEFINITION.getInterestAmount());
}
@Test
/**
* Tests the equal and hash code methods.
*/
public void equalHash() {
assertEquals("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION, DEPOSIT_DEFINITION);
final DepositZeroDefinition other = new DepositZeroDefinition(EUR, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
assertEquals("DepositZeroDefinition: equal-hash code", other, DEPOSIT_DEFINITION);
assertEquals("DepositZeroDefinition: equal-hash code", other.hashCode(), DEPOSIT_DEFINITION.hashCode());
DepositZeroDefinition modified;
modified = new DepositZeroDefinition(Currency.USD, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
assertFalse("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION.equals(modified));
modified = new DepositZeroDefinition(Currency.EUR, SPOT_DATE.plusDays(1), END_DATE, NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
assertFalse("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION.equals(modified));
modified = new DepositZeroDefinition(Currency.EUR, SPOT_DATE, END_DATE.plusDays(1), NOTIONAL, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
assertFalse("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION.equals(modified));
modified = new DepositZeroDefinition(Currency.EUR, SPOT_DATE, END_DATE, NOTIONAL + 1000, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
assertFalse("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION.equals(modified));
modified = new DepositZeroDefinition(Currency.EUR, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF + 0.01, RATE, CALENDAR, DAY_COUNT);
assertFalse("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION.equals(modified));
modified = new DepositZeroDefinition(Currency.EUR, SPOT_DATE, END_DATE, NOTIONAL, DEPOSIT_AF, new PeriodicInterestRate(RATE_FIGURE, 1), CALENDAR, DAY_COUNT);
assertFalse("DepositZeroDefinition: equal-hash code", DEPOSIT_DEFINITION.equals(modified));
}
@Test
/**
* Tests the builders.
*/
public void from() {
final DepositZeroDefinition from = DepositZeroDefinition.from(EUR, SPOT_DATE, END_DATE, DAY_COUNT, RATE, CALENDAR, DAY_COUNT);
final DepositZeroDefinition comp = new DepositZeroDefinition(EUR, SPOT_DATE, END_DATE, 1.0, DEPOSIT_AF, RATE, CALENDAR, DAY_COUNT);
assertEquals("DepositZeroDefinition - From", comp, from);
}
@Test
/**
* Tests toDerivative.
*/
public void toDerivativeTrade() {
final ZonedDateTime referenceDate = DateUtils.getUTCDate(2011, 12, 12);
final DepositZero converted = DEPOSIT_DEFINITION.toDerivative(referenceDate);
final double startTime = DAY_COUNT.getDayCountFraction(referenceDate, SPOT_DATE, CALENDAR);
final double endTime = DAY_COUNT.getDayCountFraction(referenceDate, END_DATE, CALENDAR);
final DepositZero expected = new DepositZero(EUR, startTime, endTime, NOTIONAL, NOTIONAL, DEPOSIT_AF, RATE, DEPOSIT_DEFINITION.getInterestAmount());
assertEquals("DepositZeroDefinition: toDerivative", expected, converted);
}
@Test
/**
* Tests toDerivative.
*/
public void toDerivativeBetweenTradeAndSettle() {
final ZonedDateTime referenceDate = DateUtils.getUTCDate(2011, 12, 13);
final DepositZero converted = DEPOSIT_DEFINITION.toDerivative(referenceDate);
final double startTime = DAY_COUNT.getDayCountFraction(referenceDate, SPOT_DATE, CALENDAR);
final double endTime = DAY_COUNT.getDayCountFraction(referenceDate, END_DATE, CALENDAR);
final DepositZero expected = new DepositZero(EUR, startTime, endTime, NOTIONAL, NOTIONAL, DEPOSIT_AF, RATE, DEPOSIT_DEFINITION.getInterestAmount());
assertEquals("DepositZeroDefinition: toDerivative", expected, converted);
}
@Test
/**
* Tests toDerivative.
*/
public void toDerivativeSettle() {
final ZonedDateTime referenceDate = SPOT_DATE;
final DepositZero converted = DEPOSIT_DEFINITION.toDerivative(referenceDate);
final double startTime = DAY_COUNT.getDayCountFraction(referenceDate, SPOT_DATE, CALENDAR);
final double endTime = DAY_COUNT.getDayCountFraction(referenceDate, END_DATE, CALENDAR);
final DepositZero expected = new DepositZero(EUR, startTime, endTime, NOTIONAL, NOTIONAL, DEPOSIT_AF, RATE, DEPOSIT_DEFINITION.getInterestAmount());
assertEquals("DepositZeroDefinition: toDerivative", expected, converted);
}
@Test
/**
* Tests toDerivative.
*/
public void toDerivativeBetweenSettleMaturity() {
final ZonedDateTime referenceDate = DateUtils.getUTCDate(2011, 12, 20);
final DepositZero converted = DEPOSIT_DEFINITION.toDerivative(referenceDate);
final double startTime = DAY_COUNT.getDayCountFraction(SPOT_DATE, referenceDate, CALENDAR);
final double endTime = DAY_COUNT.getDayCountFraction(referenceDate, END_DATE, CALENDAR);
final DepositZero expected = new DepositZero(EUR, startTime, endTime, NOTIONAL, NOTIONAL, DEPOSIT_AF, RATE, DEPOSIT_DEFINITION.getInterestAmount());
assertEquals("DepositZeroDefinition: toDerivative", expected, converted);
}
@Test
/**
* Tests toDerivative.
*/
public void toDerivativeMaturity() {
final ZonedDateTime referenceDate = END_DATE;
final DepositZero converted = DEPOSIT_DEFINITION.toDerivative(referenceDate);
final double startTime = DAY_COUNT.getDayCountFraction(SPOT_DATE, referenceDate, CALENDAR);
final double endTime = DAY_COUNT.getDayCountFraction(referenceDate, END_DATE, CALENDAR);
final DepositZero expected = new DepositZero(EUR, startTime, endTime, NOTIONAL, NOTIONAL, DEPOSIT_AF, RATE, DEPOSIT_DEFINITION.getInterestAmount());
assertEquals("DepositZeroDefinition: toDerivative", expected, converted);
}
}