/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.instrument.payment; 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.OpenGammaRuntimeException; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedFxReset; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborFxReset; import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborSpread; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.schedule.ScheduleCalculator; 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.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; /** * Tests CouponIborFxResetDefinition. */ @Test(groups = TestGroup.UNIT) @SuppressWarnings("unchecked") public class CouponIborFxResetDefinitionTest { private static final Period TENOR = Period.ofMonths(3); private static final int SETTLEMENT_DAYS = 2; private static final Calendar CALENDAR = new MondayToFridayCalendar("A"); 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 Currency CUR = Currency.EUR; private static final IborIndex INDEX = new IborIndex(CUR, TENOR, SETTLEMENT_DAYS, DAY_COUNT_INDEX, BUSINESS_DAY, IS_EOM, "Deprecated"); 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, 7); private static final ZonedDateTime ACCRUAL_START_DATE = DateUtils.getUTCDate(2011, 1, 6); private static final ZonedDateTime ACCRUAL_END_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 double SPREAD = -0.001; // -10 bps private static final ZonedDateTime FIXING_DATE_SAME_AS_FX = DateUtils.getUTCDate(2011, 1, 3); private static final CouponIborFxResetDefinition CPN_SAME_FIXING_DATES = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FIXING_DATE_SAME_AS_FX, INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); private static final ZonedDateTime FIXING_DATE_AFTER_FX = FIXING_DATE_SAME_AS_FX.plusDays(2); private static final CouponIborFxResetDefinition CPN_FX_FIXED_FIRST = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FIXING_DATE_AFTER_FX, INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); private static final ZonedDateTime FIXING_DATE_BEFORE_FX = FIXING_DATE_SAME_AS_FX.minusDays(2); private static final CouponIborFxResetDefinition CPN_INDEX_FIXED_FIRST = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FIXING_DATE_BEFORE_FX, INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); private static final double FX_FIXING_RATE = 1.40; private static final DoubleTimeSeries<ZonedDateTime> FX_FIXING_TS_10 = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] {FX_FIXING_DATE.minusDays(11), FX_FIXING_DATE.minusDays(10) }, new double[] {1.38, 1.39 }); private static final DoubleTimeSeries<ZonedDateTime> FX_FIXING_TS_1 = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] {FX_FIXING_DATE.minusDays(2), FX_FIXING_DATE.minusDays(1) }, new double[] {1.38, 1.39 }); private static final DoubleTimeSeries<ZonedDateTime> FX_FIXING_TS_0 = ImmutableZonedDateTimeDoubleTimeSeries.ofUTC( new ZonedDateTime[] {FX_FIXING_DATE.minusDays(2), FX_FIXING_DATE.minusDays(1), FX_FIXING_DATE }, new double[] {1.38, 1.39, FX_FIXING_RATE }); private static final double FIXING_RATE = 0.04; private static final DoubleTimeSeries<ZonedDateTime> INDEX_FIXING_TS_SAME = ImmutableZonedDateTimeDoubleTimeSeries .ofUTC(new ZonedDateTime[] {FIXING_DATE_SAME_AS_FX }, new double[] {FIXING_RATE }); private static final DoubleTimeSeries<ZonedDateTime> INDEX_FIXING_TS_AFTER_FX = ImmutableZonedDateTimeDoubleTimeSeries .ofUTC(new ZonedDateTime[] {FIXING_DATE_AFTER_FX }, new double[] {FIXING_RATE }); private static final DoubleTimeSeries<ZonedDateTime> INDEX_FIXING_TS_BEFORE_FX = ImmutableZonedDateTimeDoubleTimeSeries .ofUTC(new ZonedDateTime[] {FIXING_DATE_BEFORE_FX }, new double[] {FIXING_RATE }); private static final DoubleTimeSeries<ZonedDateTime> INDEX_FIXING_TS_OLD = ImmutableZonedDateTimeDoubleTimeSeries .ofUTC(new ZonedDateTime[] {FIXING_DATE_BEFORE_FX.minusDays(10) }, new double[] {FIXING_RATE }); private static final double TOLERANCE_AMOUNT = 1.0E-6; /** * */ @Test public void testGetter() { ZonedDateTime expFixingPeriodStartDate = ScheduleCalculator.getAdjustedDate(FIXING_DATE_SAME_AS_FX, INDEX.getSpotLag(), CALENDAR); ZonedDateTime expFixingPeriodEndDate = ScheduleCalculator.getAdjustedDate(expFixingPeriodStartDate, INDEX.getTenor(), INDEX.getBusinessDayConvention(), CALENDAR, INDEX.isEndOfMonth()); CouponIborFxResetDefinition cpnRe = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction(expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); assertEquals(cpnRe, CPN_SAME_FIXING_DATES); assertEquals(NOTIONAL, CPN_SAME_FIXING_DATES.getNotional(), TOLERANCE_AMOUNT); assertEquals(FIXING_DATE_SAME_AS_FX, CPN_SAME_FIXING_DATES.getIborIndexFixingDate()); assertEquals(SPREAD, CPN_SAME_FIXING_DATES.getSpread(), TOLERANCE_AMOUNT); assertEquals(PAYMENT_DATE, CPN_SAME_FIXING_DATES.getPaymentDate()); assertEquals(ACCRUAL_START_DATE, CPN_SAME_FIXING_DATES.getAccrualStartDate()); assertEquals(ACCRUAL_END_DATE, CPN_SAME_FIXING_DATES.getAccrualEndDate()); assertEquals(CALENDAR, CPN_SAME_FIXING_DATES.getCalendar()); assertEquals(expFixingPeriodStartDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodStartDate()); assertEquals(expFixingPeriodEndDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodEndDate()); assertEquals(INDEX.getDayCount().getDayCountFraction(expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodAccrualFactor()); assertEquals(CUR_REF, CPN_SAME_FIXING_DATES.getReferenceCurrency()); assertEquals(FX_FIXING_DATE, CPN_SAME_FIXING_DATES.getFxFixingDate()); assertEquals(FX_DELIVERY_DATE, CPN_SAME_FIXING_DATES.getFxDeliveryDate()); } /** * Without time series */ @Test public void toDerivativeWithoutHts() { /* * ibor index fixing same as fx fixing */ ZonedDateTime valuationDate = FX_FIXING_DATE.minusDays(10); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double iborFixingTime = fixingTime; double deliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); CouponIborFxReset cpnExpected = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, iborFixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fixingTime, deliveryTime); CouponIborFxReset cpnConverted = CPN_SAME_FIXING_DATES.toDerivative(valuationDate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnExpected, cpnConverted); /* * ibor index fixing before as fx fixing */ fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); iborFixingTime = TimeCalculator.getTimeBetween(valuationDate, FIXING_DATE_BEFORE_FX); cpnExpected = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, iborFixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fixingTime, deliveryTime); cpnConverted = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnExpected, cpnConverted); /* * ibor index fixing after as fx fixing */ fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); iborFixingTime = TimeCalculator.getTimeBetween(valuationDate, FIXING_DATE_AFTER_FX); cpnExpected = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, iborFixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fixingTime, deliveryTime); cpnConverted = CPN_FX_FIXED_FIRST.toDerivative(valuationDate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnExpected, cpnConverted); } /** * valuationDate is before FX fixing data, and before index fixing date */ @Test public void toDerivativeBeforeFxBeforeIndex() { ZonedDateTime valuationDate = FX_FIXING_DATE.minusDays(10); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double deliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); /* * ibor index fixing same as fx fixing */ DoubleTimeSeries<ZonedDateTime>[] htsArray1 = new DoubleTimeSeries[] {INDEX_FIXING_TS_SAME, FX_FIXING_TS_10 }; Payment cpnConverted1 = CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArray1); CouponIborFxReset cpnExpected1 = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fixingTime, deliveryTime); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnExpected1, cpnConverted1); /* * ibor index fixing before fx fixing */ DoubleTimeSeries<ZonedDateTime>[] htsArray2 = new DoubleTimeSeries[] {INDEX_FIXING_TS_OLD, FX_FIXING_TS_10 }; Payment cpnConverted2 = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArray2); double fixingTime2 = TimeCalculator.getTimeBetween(valuationDate, FIXING_DATE_BEFORE_FX); double fixingPeriodStartTime2 = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime2 = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); CouponIborFxReset cpnExpected2 = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, fixingTime2, INDEX, fixingPeriodStartTime2, fixingPeriodEndTime2, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fixingTime, deliveryTime); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnExpected2, cpnConverted2); /* * ibor index fixing after fx fixing */ DoubleTimeSeries<ZonedDateTime>[] htsArray3 = new DoubleTimeSeries[] {INDEX_FIXING_TS_OLD, FX_FIXING_TS_10 }; Payment cpnConverted3 = CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArray3); double fixingTime3 = TimeCalculator.getTimeBetween(valuationDate, FIXING_DATE_AFTER_FX); double fixingPeriodStartTime3 = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime3 = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); CouponIborFxReset cpnExpected3 = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, fixingTime3, INDEX, fixingPeriodStartTime3, fixingPeriodEndTime3, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fixingTime, deliveryTime); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnExpected3, cpnConverted3); } /** * valuationDate is on FX fixing data, and on index fixing date */ @Test public void toDerivativeOnFxOnIndex() { ZonedDateTime valuationDate = FX_FIXING_DATE; double fixingTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingDate()); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fxFixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double fXDeliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); /* * FX rate, index Rate, not available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithoutFxRateWithoutIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_1 }; CouponIborFxReset cpnWithoutFxIndexExpected = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithoutFxIndex = CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArrayWithoutFxRateWithoutIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithoutFxIndexExpected, cpnConvertedWithoutFxIndex); /* * FX rate available, index Rate not available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithFxRateWithoutIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_0 }; CouponIborSpread cpnWithFxExpected = new CouponIborSpread(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_SAME_FIXING_DATES.getIborIndexFixingPeriodAccrualFactor(), SPREAD); Payment cpnConvertedWithFx = CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArrayWithFxRateWithoutIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxExpected, cpnConvertedWithFx); /* * FX rate not available, index Rate available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithoutFxRateWithIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_SAME, FX_FIXING_TS_1 }; CouponFixedFxReset cpnWithIndexExpected = new CouponFixedFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, FIXING_RATE + SPREAD, CUR_REF, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithIndex = CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArrayWithoutFxRateWithIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithIndexExpected, cpnConvertedWithIndex); /* * FX rate, index Rate available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithFxRateIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_SAME, FX_FIXING_TS_0 }; CouponFixed cpnWithFxIndexExpected = new CouponFixed(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, FIXING_RATE + SPREAD); Payment cpnConvertedWithFxIndex = CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArrayWithFxRateIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxIndexExpected, cpnConvertedWithFxIndex); } /** * valuationDate is after FX fixing data, and after index fixing date */ @Test public void toDerivativeAfterFxAfterIndex() { ZonedDateTime valuationDate1 = FX_FIXING_DATE.plusDays(1); /* * ibor index fixing same as fx fixing */ DoubleTimeSeries<ZonedDateTime>[] htsArray1 = new DoubleTimeSeries[] {INDEX_FIXING_TS_SAME, FX_FIXING_TS_0 }; double paymentTime1 = TimeCalculator.getTimeBetween(valuationDate1, PAYMENT_DATE); CouponFixed cpnWithFxIndexExpected1 = new CouponFixed(CUR_PAY, paymentTime1, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, FIXING_RATE + SPREAD); Payment cpnConvertedWithFxIndex1 = CPN_SAME_FIXING_DATES.toDerivative(valuationDate1, htsArray1); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxIndexExpected1, cpnConvertedWithFxIndex1); /* * ibor index fixing before fx fixing */ ZonedDateTime valuationDate2 = FX_FIXING_DATE.plusDays(1); DoubleTimeSeries<ZonedDateTime>[] htsArray2 = new DoubleTimeSeries[] {INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_0 }; double paymentTime2 = TimeCalculator.getTimeBetween(valuationDate2, PAYMENT_DATE); CouponFixed cpnWithFxIndexExpected2 = new CouponFixed(CUR_PAY, paymentTime2, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, FIXING_RATE + SPREAD); Payment cpnConvertedWithFxRate2 = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate2, htsArray2); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxIndexExpected2, cpnConvertedWithFxRate2); /* * ibor index fixing after fx fixing */ ZonedDateTime valuationDate3 = FX_FIXING_DATE.plusDays(2); DoubleTimeSeries<ZonedDateTime>[] htsArray3 = new DoubleTimeSeries[] {INDEX_FIXING_TS_AFTER_FX, FX_FIXING_TS_0 }; double paymentTime3 = TimeCalculator.getTimeBetween(valuationDate3, PAYMENT_DATE); CouponFixed cpnWithFxIndexExpected3 = new CouponFixed(CUR_PAY, paymentTime3, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, FIXING_RATE + SPREAD); Payment cpnConvertedWithFxRate3 = CPN_FX_FIXED_FIRST.toDerivative(valuationDate3, htsArray3); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxIndexExpected3, cpnConvertedWithFxRate3); } /** * valuationDate is on FX fixing data, but before index fixing date */ @Test public void toDerivativeOnFxBeforeIndex() { ZonedDateTime valuationDate = FX_FIXING_DATE; double fixingTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingDate()); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fxFixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double fXDeliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); /* * FX rate not available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithoutFxRate = new DoubleTimeSeries[] {INDEX_FIXING_TS_AFTER_FX, FX_FIXING_TS_1 }; CouponIborFxReset cpnWithoutFxRateExpected = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithoutFxRate = CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithoutFxRate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithoutFxRateExpected, cpnConvertedWithoutFxRate); /* * FX rate available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithFxRate = new DoubleTimeSeries[] {INDEX_FIXING_TS_AFTER_FX, FX_FIXING_TS_0 }; CouponIborSpread cpnWithFxRateExpected = new CouponIborSpread(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD); Payment cpnConvertedWithFxRate = CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithFxRate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxRateExpected, cpnConvertedWithFxRate); } /** * valuationDate is on FX fixing data, but after index fixing date */ @Test public void toDerivativeOnFxAfterIndex() { ZonedDateTime valuationDate = FX_FIXING_DATE; double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fxFixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double fXDeliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); /* * FX rate not available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithoutFxRate = new DoubleTimeSeries[] {INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_1 }; CouponFixedFxReset cpnWithIndexExpected = new CouponFixedFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, FIXING_RATE + SPREAD, CUR_REF, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithIndex = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithoutFxRate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithIndexExpected, cpnConvertedWithIndex); /* * FX rate available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithFxRate = new DoubleTimeSeries[] {INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_0 }; CouponFixed cpnWithFxIndexExpected = new CouponFixed(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, FIXING_RATE + SPREAD); Payment cpnConvertedWithFxIndex = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithFxRate); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxIndexExpected, cpnConvertedWithFxIndex); } /** * valuationDate is before FX fixing data, but on index fixing date */ @Test public void toDerivativeBeforeFxOnIndex() { ZonedDateTime valuationDate = FIXING_DATE_BEFORE_FX; double fixingTime = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingDate()); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fxFixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double fXDeliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); /* * index not available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithoutIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_OLD, FX_FIXING_TS_10 }; CouponIborFxReset cpnWithoutIndexExpected = new CouponIborFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_INDEX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD, CUR, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithoutIndex = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithoutIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithoutIndexExpected, cpnConvertedWithoutIndex); /* * Index available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_10 }; CouponFixedFxReset cpnWithIndexExpected = new CouponFixedFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, FIXING_RATE + SPREAD, CUR_REF, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithIndex = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithIndexExpected, cpnConvertedWithIndex); } /** * valuationDate is after FX fixing data, but on index fixing date */ @Test public void toDerivativeAfterFxOnIndex() { ZonedDateTime valuationDate = FIXING_DATE_AFTER_FX; double fixingTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingDate()); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); /* * Index not available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithFxRateWithoutIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_SAME, FX_FIXING_TS_0 }; CouponIborSpread cpnWithFxExpected = new CouponIborSpread(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD); Payment cpnConvertedWithFx = CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithFxRateWithoutIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxExpected, cpnConvertedWithFx); /* * Index available */ DoubleTimeSeries<ZonedDateTime>[] htsArrayWithFxRateIndex = new DoubleTimeSeries[] { INDEX_FIXING_TS_AFTER_FX, FX_FIXING_TS_0 }; CouponFixed cpnWithFxIndexExpected = new CouponFixed(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, FIXING_RATE + SPREAD); Payment cpnConvertedWithFxIndex = CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArrayWithFxRateIndex); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxIndexExpected, cpnConvertedWithFxIndex); } /** * valuationDate is before FX fixing data, but after index fixing date */ @Test public void toDerivativeBeforeFxAfterIndex() { ZonedDateTime valuationDate = FX_FIXING_DATE.minusDays(1); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); double fxFixingTime = TimeCalculator.getTimeBetween(valuationDate, FX_FIXING_DATE); double fXDeliveryTime = TimeCalculator.getTimeBetween(valuationDate, FX_DELIVERY_DATE); DoubleTimeSeries<ZonedDateTime>[] htsArray = new DoubleTimeSeries[] { INDEX_FIXING_TS_BEFORE_FX, FX_FIXING_TS_1 }; CouponFixedFxReset cpnWithIndexExpected = new CouponFixedFxReset(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL, FIXING_RATE + SPREAD, CUR_REF, fxFixingTime, fXDeliveryTime); Payment cpnConvertedWithIndex = CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArray); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithIndexExpected, cpnConvertedWithIndex); } /** * valuationDate is after FX fixing data, but before index fixing date */ @Test public void toDerivativeAfterFxBeforeIndex() { ZonedDateTime valuationDate = FX_FIXING_DATE.plusDays(1); double fixingTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingDate()); double fixingPeriodStartTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodStartDate()); double fixingPeriodEndTime = TimeCalculator.getTimeBetween(valuationDate, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodEndDate()); double paymentTime = TimeCalculator.getTimeBetween(valuationDate, PAYMENT_DATE); DoubleTimeSeries<ZonedDateTime>[] htsArray = new DoubleTimeSeries[] { INDEX_FIXING_TS_AFTER_FX, FX_FIXING_TS_0 }; CouponIborSpread cpnWithFxExpected = new CouponIborSpread(CUR_PAY, paymentTime, ACCRUAL_FACTOR, NOTIONAL * FX_FIXING_RATE, fixingTime, INDEX, fixingPeriodStartTime, fixingPeriodEndTime, CPN_FX_FIXED_FIRST.getIborIndexFixingPeriodAccrualFactor(), SPREAD); Payment cpnConvertedWithFx = CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArray); assertEquals("CouponIborFxResetDefinition: toDerivative", cpnWithFxExpected, cpnConvertedWithFx); } /** * Test hashCode and equals */ @Test public void hashCodeEqualsTest() { ZonedDateTime expFixingPeriodStartDate = ScheduleCalculator.getAdjustedDate(FIXING_DATE_SAME_AS_FX, INDEX.getSpotLag(), CALENDAR); ZonedDateTime expFixingPeriodEndDate = ScheduleCalculator.getAdjustedDate(expFixingPeriodStartDate, INDEX.getTenor(), INDEX.getBusinessDayConvention(), CALENDAR, INDEX.isEndOfMonth()); CouponIborFxResetDefinition cpnRe = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction(expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); assertFalse(cpnRe.hashCode() == CPN_FX_FIXED_FIRST.hashCode()); assertFalse(cpnRe.equals(CPN_FX_FIXED_FIRST)); assertFalse(cpnRe.equals(CPN_FX_FIXED_FIRST.getIndex())); assertTrue(cpnRe.equals(CPN_SAME_FIXING_DATES)); assertTrue(cpnRe.hashCode() == CPN_SAME_FIXING_DATES.hashCode()); assertTrue(cpnRe.equals(cpnRe)); CouponIborFxResetDefinition cpn2 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction(expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, Currency.JPY, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn3 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE.plusDays(1), ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction(expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn4 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE.plusDays(1), ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn5 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE.plusDays(1), ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn6 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR + 0.01, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn7 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL * 0.1, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn8 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE.plusDays(1), expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn9 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate.plusDays(1), expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn10 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate.plusDays(1), INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn11 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR) + 0.01, INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn12 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD + 0.01, new MondayToFridayCalendar("B"), CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); IborIndex index = new IborIndex(CUR, TENOR, SETTLEMENT_DAYS, DAY_COUNT_INDEX, BUSINESS_DAY, false, "Deprecated"); CouponIborFxResetDefinition cpn13 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), index, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn14 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE.plusDays(1), FX_DELIVERY_DATE); CouponIborFxResetDefinition cpn15 = new CouponIborFxResetDefinition(CUR_PAY, PAYMENT_DATE, ACCRUAL_START_DATE, ACCRUAL_END_DATE, ACCRUAL_FACTOR, NOTIONAL, FX_FIXING_DATE, expFixingPeriodStartDate, expFixingPeriodEndDate, INDEX.getDayCount().getDayCountFraction( expFixingPeriodStartDate, expFixingPeriodEndDate, CALENDAR), INDEX, SPREAD, CALENDAR, CUR_REF, FX_FIXING_DATE, FX_DELIVERY_DATE.plusDays(1)); CouponIborFxResetDefinition[] cpnArray = new CouponIborFxResetDefinition[] {cpn2, cpn3, cpn4, cpn5, cpn6, cpn7, cpn8, cpn9, cpn10, cpn11, cpn12, cpn13, cpn14, cpn15, null }; for (int i = 0; i < cpnArray.length; ++i) { assertFalse(cpnRe.equals(cpnArray[i])); } } /** * FX rate not available */ @Test(expectedExceptions = OpenGammaRuntimeException.class) public void nullFxRateTest() { ZonedDateTime valuationDate = FX_FIXING_DATE.minusDays(1); DoubleTimeSeries<ZonedDateTime>[] htsArray = new DoubleTimeSeries[] { INDEX_FIXING_TS_OLD, FX_FIXING_TS_1 }; CPN_INDEX_FIXED_FIRST.toDerivative(valuationDate, htsArray); } /** * Index rate not available */ @Test(expectedExceptions = OpenGammaRuntimeException.class) public void nullIndexRateTest() { ZonedDateTime valuationDate = FX_FIXING_DATE.plusDays(1); DoubleTimeSeries<ZonedDateTime>[] htsArray = new DoubleTimeSeries[] { INDEX_FIXING_TS_AFTER_FX, FX_FIXING_TS_10 }; CPN_FX_FIXED_FIRST.toDerivative(valuationDate, htsArray); } /** * time series not available */ @Test(expectedExceptions = IllegalArgumentException.class) public void dateAfterFixingTest() { ZonedDateTime valuationDate = FX_FIXING_DATE.plusDays(1); CPN_SAME_FIXING_DATES.toDerivative(valuationDate); } /** * too small number of time series */ @Test(expectedExceptions = IllegalArgumentException.class) public void singleTimeSeriesTest() { ZonedDateTime valuationDate = PAYMENT_DATE; DoubleTimeSeries<ZonedDateTime>[] htsArray = new DoubleTimeSeries[] {INDEX_FIXING_TS_SAME }; CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArray); } /** * reference data is after payment date */ @Test(expectedExceptions = IllegalArgumentException.class) public void dateAfterPaymentTest() { ZonedDateTime valuationDate = PAYMENT_DATE.plusDays(1); DoubleTimeSeries<ZonedDateTime>[] htsArray = new DoubleTimeSeries[] {INDEX_FIXING_TS_SAME, FX_FIXING_TS_10 }; CPN_SAME_FIXING_DATES.toDerivative(valuationDate, htsArray); } }