/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.interestrate.payments.derivative;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import org.threeten.bp.Period;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.index.IborIndex;
import com.opengamma.analytics.util.time.TimeCalculator;
import com.opengamma.financial.convention.businessday.BusinessDayConvention;
import com.opengamma.financial.convention.businessday.BusinessDayConventions;
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 for CouponIborFxReset.
*/
@SuppressWarnings("unused")
@Test(groups = TestGroup.UNIT)
public class CouponIborFxResetTest {
private static final double RESET_TIME = 0.24;
private static final double FORWARD_YEAR_FRACTION = 0.27;
private static final double FIXING_PERIOD_START_TIME = 0.25;
private static final double FIXING_PERIOD_END_TIME = 0.52;
private static final Currency CUR = Currency.EUR;
private static final Period TENOR = Period.ofMonths(3);
private static final int SETTLEMENT_DAYS = 2;
private static final DayCount DAY_COUNT_INDEX = DayCounts.ACT_360;
private static final BusinessDayConvention BUSINESS_DAY = BusinessDayConventions.MODIFIED_FOLLOWING;
private static final boolean IS_EOM = true;
private static final IborIndex INDEX = new IborIndex(CUR, TENOR, SETTLEMENT_DAYS, DAY_COUNT_INDEX, BUSINESS_DAY,
IS_EOM, "Ibor");
private static final Currency CUR_REF = Currency.EUR;
private static final Currency CUR_PAY = Currency.USD;
private static final ZonedDateTime PAYMENT_DATE = DateUtils.getUTCDate(2011, 4, 6);
private static final ZonedDateTime FX_FIXING_DATE = DateUtils.getUTCDate(2011, 1, 3);
private static final ZonedDateTime FX_DELIVERY_DATE = DateUtils.getUTCDate(2011, 1, 6);
private static final double ACCRUAL_FACTOR = 0.267;
private static final double NOTIONAL = 1000000; //1m
private static final ZonedDateTime VALUATION_DATE = DateUtils.getUTCDate(2010, 7, 1);
private static final double PAYMENT_TIME = TimeCalculator.getTimeBetween(VALUATION_DATE, PAYMENT_DATE);
private static final double FX_FIXING_TIME = TimeCalculator.getTimeBetween(VALUATION_DATE, FX_FIXING_DATE);
private static final double FX_DELIVERY_TIME = TimeCalculator.getTimeBetween(VALUATION_DATE, FX_DELIVERY_DATE);
private static final double SPREAD = 0.02;
private static final CouponIborFxReset CPN = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION, SPREAD,
CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
/**
* Test getters
*/
@Test
public void getter() {
assertEquals("CouponIborFxReset", CUR_REF, CPN.getReferenceCurrency());
assertEquals("CouponIborFxReset", FX_FIXING_TIME, CPN.getFxFixingTime());
assertEquals("CouponIborFxReset", FX_DELIVERY_TIME, CPN.getFxDeliveryTime());
assertEquals("CouponIborFxReset", INDEX, CPN.getIndex());
assertEquals("CouponIborFxReset", SPREAD, CPN.getSpread());
assertEquals("CouponIborFxReset", FORWARD_YEAR_FRACTION, CPN.getIborIndexFixingAccrualFactor());
assertEquals("CouponIborFxReset", RESET_TIME, CPN.getIborIndexFixingTime());
assertEquals("CouponIborFxReset", FIXING_PERIOD_START_TIME, CPN.getIborIndexFixingPeriodStartTime());
assertEquals("CouponIborFxReset", FIXING_PERIOD_END_TIME, CPN.getIborIndexFixingPeriodEndTime());
}
/**
* iborIndexFixingPeriodStartTime >= iborIndexFixingTime violated
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void largeFixingiImeTest() {
new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME * 10.0, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
}
/**
* iborIndexFixingPeriodEndTime >= iborIndexFixingPeriodStartTime violated
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void startAfterEndTest() {
new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_START_TIME * 0.9, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
}
/**
* Ibor fixing period year fraction is negative
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void negativeFixingYearFractionTest() {
new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, -FORWARD_YEAR_FRACTION, SPREAD,
CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
}
/**
* Ibor index fixing time is negative
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void negativeFixingTimeTest() {
new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, -RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION, SPREAD,
CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
}
/**
* Test hashCode and equals
*/
@Test
public void hashCodeAndEqualsTest() {
CouponIborFxReset cpn0 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
assertTrue(CPN.equals(CPN));
assertTrue(cpn0.equals(CPN));
assertTrue(CPN.equals(cpn0));
assertTrue(cpn0.hashCode() == CPN.hashCode());
CouponIborFxReset cpn1 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME * 0.99, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset cpn2 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME * 0.99, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset cpn3 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME * 0.99, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset cpn4 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION * 0.99,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset cpn5 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD * 0.99, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset cpn6 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, Currency.AUD, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset cpn7 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME * 0.99, FX_DELIVERY_TIME);
CouponIborFxReset cpn8 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, INDEX, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME * 0.99);
IborIndex index = new IborIndex(CUR, TENOR, SETTLEMENT_DAYS, DAY_COUNT_INDEX, BUSINESS_DAY,
false, "Deprecated");
CouponIborFxReset cpn9 = new CouponIborFxReset(CUR_PAY, PAYMENT_TIME, ACCRUAL_FACTOR,
NOTIONAL, RESET_TIME, index, FIXING_PERIOD_START_TIME, FIXING_PERIOD_END_TIME, FORWARD_YEAR_FRACTION,
SPREAD, CUR_REF, FX_FIXING_TIME, FX_DELIVERY_TIME);
CouponIborFxReset[] cpnArray = new CouponIborFxReset[] {cpn1, cpn2, cpn3, cpn4, cpn5, cpn6, cpn7, cpn8, cpn9, null };
for (int i = 0; i < cpnArray.length; ++i) {
assertFalse(CPN.equals(cpnArray[i]));
}
assertFalse(CPN.equals(index));
}
}