/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.curve;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.threeten.bp.LocalTime;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.opengamma.DataNotFoundException;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.interestrate.CompoundingType;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.convention.Convention;
import com.opengamma.core.convention.ConventionSource;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.analytics.ircurve.strips.CashNode;
import com.opengamma.financial.analytics.ircurve.strips.ContinuouslyCompoundedRateNode;
import com.opengamma.financial.analytics.ircurve.strips.CreditSpreadNode;
import com.opengamma.financial.analytics.ircurve.strips.DiscountFactorNode;
import com.opengamma.financial.analytics.ircurve.strips.FRANode;
import com.opengamma.financial.analytics.ircurve.strips.FXForwardNode;
import com.opengamma.financial.analytics.ircurve.strips.InflationNodeType;
import com.opengamma.financial.analytics.ircurve.strips.RateFutureNode;
import com.opengamma.financial.analytics.ircurve.strips.RollDateFRANode;
import com.opengamma.financial.analytics.ircurve.strips.RollDateSwapNode;
import com.opengamma.financial.analytics.ircurve.strips.SwapNode;
import com.opengamma.financial.analytics.ircurve.strips.ZeroCouponInflationNode;
import com.opengamma.financial.convention.CMSLegConvention;
import com.opengamma.financial.convention.CompoundingIborLegConvention;
import com.opengamma.financial.convention.DepositConvention;
import com.opengamma.financial.convention.FinancialConvention;
import com.opengamma.financial.convention.IborIndexConvention;
import com.opengamma.financial.convention.InflationLegConvention;
import com.opengamma.financial.convention.InterestRateFutureConvention;
import com.opengamma.financial.convention.MockConvention;
import com.opengamma.financial.convention.OISLegConvention;
import com.opengamma.financial.convention.OvernightIndexConvention;
import com.opengamma.financial.convention.PriceIndexConvention;
import com.opengamma.financial.convention.RollDateFRAConvention;
import com.opengamma.financial.convention.RollDateSwapConvention;
import com.opengamma.financial.convention.StubType;
import com.opengamma.financial.convention.SwapFixedLegConvention;
import com.opengamma.financial.convention.SwapIndexConvention;
import com.opengamma.financial.convention.VanillaIborLegConvention;
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.financial.convention.rolldate.RollDateAdjusterFactory;
import com.opengamma.financial.security.index.OvernightIndex;
import com.opengamma.financial.security.index.PriceIndex;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.service.ServiceContext;
import com.opengamma.service.ThreadLocalServiceContext;
import com.opengamma.service.VersionCorrectionProvider;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.Tenor;
/**
*
*/
@Test(groups = TestGroup.UNIT)
public class CurveNodeCurrencyVisitorTest {
private static final String SCHEME = "Test";
private static final BusinessDayConvention MODIFIED_FOLLOWING = BusinessDayConventions.MODIFIED_FOLLOWING;
private static final DayCount ACT_360 = DayCounts.ACT_360;
private static final ExternalId US = ExternalSchemes.financialRegionId("US");
private static final ExternalId EU = ExternalSchemes.financialRegionId("EU");
private static final ExternalId NYLON = ExternalSchemes.financialRegionId("US+GB");
private static final String BBG_TICKER = "BLOOMBERG_TICKER";
private static final ExternalId FIXED_LEG_ID = ExternalId.of(SCHEME, "USD Swap Fixed Leg");
private static final ExternalId DEPOSIT_1M_ID = ExternalId.of(SCHEME, "USD 1m Deposit");
private static final String USDLIBOR_CONVENTION_NAME = "ICE LIBOR USD";
private static final ExternalId RATE_FUTURE_3M_ID = ExternalId.of(SCHEME, "USD 3m Rate Future");
private static final ExternalId SWAP_3M_IBOR_ID = ExternalId.of(SCHEME, "USD 3m Floating Leg");
private static final ExternalId SWAP_6M_EURIBOR_ID = ExternalId.of(SCHEME, "EUR 6m Floating Leg");
private static final ExternalId OVERNIGHT_CONVENTION_ID = ExternalId.of(SCHEME, "USD Overnight");
private static final ExternalId OIS_ID = ExternalId.of(SCHEME, "USD OIS Leg");
private static final ExternalId FX_FORWARD_ID = ExternalId.of(SCHEME, "FX Forward");
private static final ExternalId SWAP_INDEX_ID = ExternalId.of(SCHEME, "3M Swap Index");
private static final ExternalId CMS_SWAP_ID = ExternalId.of(SCHEME, "USD CMS");
private static final ExternalId COMPOUNDING_IBOR_ID = ExternalId.of(SCHEME, "USD Compounding Libor");
private static final ExternalId IMM_3M_EXPIRY_CONVENTION = ExternalId.of(SCHEME, RollDateAdjusterFactory.QUARTERLY_IMM_ROLL_STRING);
private static final ExternalId PRICE_INDEX_US_CONVENTION_ID = ExternalId.of(SCHEME, "USD CPI");
private static final ExternalId ZERO_COUPON_INFLATION_ID = ExternalId.of(SCHEME, "ZCI");
private static final ExternalId IMM_SWAP_ID = ExternalId.of(SCHEME, "USD IMM Swap");
private static final ExternalId IMM_FRA_ID = ExternalId.of(SCHEME, "USD IMM FRA");
private static final String USD_OVERNIGHT_NAME = "Fed Funds Effective Rate";
private static final OvernightIndex USD_OVERNIGHT = new OvernightIndex(USD_OVERNIGHT_NAME, OVERNIGHT_CONVENTION_ID);
private static final ExternalId USD_OVERNIGHT_ID = ExternalId.of("BLOOMBERG_TICKER", "FEDL1 Index");
private static final ExternalId USDLIBOR_CONVENTION_ID = ExternalId.of(SCHEME, USDLIBOR_CONVENTION_NAME);
private static final IborIndexConvention USDLIBOR_CONVENTION = new IborIndexConvention(USDLIBOR_CONVENTION_NAME, ExternalIdBundle.of(USDLIBOR_CONVENTION_ID),
ACT_360, MODIFIED_FOLLOWING, 2, false, Currency.USD, LocalTime.of(11, 0), "US", US, US, "Page");
private static final String USDLIBOR1M_NAME = "USDLIBOR1M";
private static final com.opengamma.financial.security.index.IborIndex USDLIBOR1M =
new com.opengamma.financial.security.index.IborIndex(USDLIBOR1M_NAME, "ICE LIBOR 1M - USD", Tenor.ONE_MONTH, USDLIBOR_CONVENTION_ID);
private static final ExternalId USDLIBOR1M_ID = ExternalId.of(BBG_TICKER, "US0001M Index");
private static final String USDLIBOR3M_NAME = "USDLIBOR3M";
private static final com.opengamma.financial.security.index.IborIndex USDLIBOR3M =
new com.opengamma.financial.security.index.IborIndex(USDLIBOR3M_NAME, "ICE LIBOR 3M - USD", Tenor.THREE_MONTHS, USDLIBOR_CONVENTION_ID);
private static final ExternalId USDLIBOR3M_ID = ExternalId.of(BBG_TICKER, "US0003M Index");
private static final String USDLIBOR6M_NAME = "USDLIBOR6M";
private static final com.opengamma.financial.security.index.IborIndex USDLIBOR6M =
new com.opengamma.financial.security.index.IborIndex(USDLIBOR6M_NAME, "ICE LIBOR 6M - USD", Tenor.SIX_MONTHS, USDLIBOR_CONVENTION_ID);
private static final ExternalId USDLIBOR6M_ID = ExternalId.of(BBG_TICKER, "US0006M Index");
private static final String EURIBOR_CONVENTION_NAME = "EUR Euribor";
private static final ExternalId EURIBOR_CONVENTION_ID = ExternalId.of(SCHEME, EURIBOR_CONVENTION_NAME);
private static final IborIndexConvention EURIBOR_CONVENTION = new IborIndexConvention(EURIBOR_CONVENTION_NAME, ExternalIdBundle.of(EURIBOR_CONVENTION_ID),
ACT_360, MODIFIED_FOLLOWING, 2, false, Currency.EUR, LocalTime.of(11, 0), "EU", EU, EU, "Page");
private static final String EURIBOR1M_NAME = "EURIBOR1M";
private static final com.opengamma.financial.security.index.IborIndex EURIBOR1M =
new com.opengamma.financial.security.index.IborIndex(EURIBOR1M_NAME, "EURIBOR 1M ACT/360", Tenor.ONE_MONTH, EURIBOR_CONVENTION_ID);
private static final ExternalId EURIBOR1M_ID = ExternalId.of(BBG_TICKER, "EUR001M Index");
private static final String EURIBOR3M_NAME = "EURIBOR3M";
private static final com.opengamma.financial.security.index.IborIndex EURIBOR3M =
new com.opengamma.financial.security.index.IborIndex(EURIBOR3M_NAME, "EURIBOR 3M ACT/360", Tenor.THREE_MONTHS, EURIBOR_CONVENTION_ID);
private static final ExternalId EURIBOR3M_ID = ExternalId.of(BBG_TICKER, "EUR003M Index");
private static final String EURIBOR6M_NAME = "EURIBOR6M";
private static final com.opengamma.financial.security.index.IborIndex EURIBOR6M =
new com.opengamma.financial.security.index.IborIndex(EURIBOR6M_NAME, "EURIBOR 6M ACT/360", Tenor.SIX_MONTHS, EURIBOR_CONVENTION_ID);
private static final ExternalId EURIBOR6M_ID = ExternalId.of(BBG_TICKER, "EUR006M Index");
private static final SwapFixedLegConvention FIXED_LEG = new SwapFixedLegConvention("USD Swap Fixed Leg", ExternalId.of(SCHEME, "USD Swap Fixed Leg").toBundle(),
Tenor.SIX_MONTHS, ACT_360, MODIFIED_FOLLOWING, Currency.USD, NYLON, 2, false, StubType.NONE, false, 2);
private static final VanillaIborLegConvention SWAP_3M_LIBOR = new VanillaIborLegConvention("USD 3m Floating Leg", ExternalId.of(SCHEME, "USD 3m Floating Leg").toBundle(),
USDLIBOR3M_ID, false, SCHEME, Tenor.THREE_MONTHS, 2, false, StubType.NONE, false, 2);
private static final VanillaIborLegConvention SWAP_6M_EURIBOR = new VanillaIborLegConvention("EUR 6m Floating Leg", ExternalId.of(SCHEME, "EUR 6m Floating Leg").toBundle(),
EURIBOR3M_ID, false, SCHEME, Tenor.SIX_MONTHS, 2, false, StubType.NONE, false,2 );
private static final OISLegConvention OIS = new OISLegConvention("USD OIS Leg", ExternalId.of(SCHEME, "USD OIS Leg").toBundle(), USD_OVERNIGHT_ID,
Tenor.ONE_YEAR, MODIFIED_FOLLOWING, 2, false, StubType.NONE, false, 1);
private static final DepositConvention DEPOSIT_1M = new DepositConvention("USD 1m Deposit", DEPOSIT_1M_ID.toBundle(),
ACT_360, MODIFIED_FOLLOWING, 2, false, Currency.USD, US);
private static final InterestRateFutureConvention RATE_FUTURE_3M = new InterestRateFutureConvention("USD 3m Rate Future", RATE_FUTURE_3M_ID.toBundle(),
IMM_3M_EXPIRY_CONVENTION, NYLON, USDLIBOR3M_ID);
private static final OvernightIndexConvention OVERNIGHT = new OvernightIndexConvention("USD Overnight", ExternalId.of(SCHEME, "USD Overnight").toBundle(),
ACT_360, 1, Currency.USD, NYLON);
private static final SwapIndexConvention SWAP_INDEX = new SwapIndexConvention("3M Swap Index", ExternalId.of(SCHEME, "3M Swap Index").toBundle(), LocalTime.of(11, 0),
SWAP_3M_IBOR_ID);
private static final CompoundingIborLegConvention COMPOUNDING_IBOR = new CompoundingIborLegConvention("USD Compounding Libor", ExternalId.of(SCHEME, "USD Compounding Libor").toBundle(),
USDLIBOR3M_ID, Tenor.THREE_MONTHS, CompoundingType.COMPOUNDING, Tenor.ONE_MONTH, StubType.SHORT_START, 2, false, StubType.LONG_START, true, 1);
private static final PriceIndexConvention PRICE_INDEX_CONVENTION = new PriceIndexConvention("USD CPI", ExternalId.of(SCHEME, "USD CPI").toBundle(), Currency.USD, US,
ExternalId.of("TS", "CPI"));
private static final String PRICE_INDEX_US_NAME = "US CPI Urban Consumers NSA";
private static final ExternalId PRICE_INDEX_US_ID = ExternalId.of(BBG_TICKER, "CPURNSA Index");
private static final PriceIndex PRICE_INDEX_US = new PriceIndex(PRICE_INDEX_US_NAME, "US CPI Urban Consumers NSA - Nice Description", PRICE_INDEX_US_CONVENTION_ID);
private static final InflationLegConvention INFLATION_LEG = new InflationLegConvention("ZCI", ExternalId.of(SCHEME, "ZCI").toBundle(), MODIFIED_FOLLOWING, ACT_360, false,
3, 2, PRICE_INDEX_US_ID);
private static final CMSLegConvention CMS = new CMSLegConvention("USD CMS", ExternalId.of(SCHEME, "USD CMS").toBundle(), SWAP_INDEX_ID, Tenor.SIX_MONTHS, false);
private static final RollDateSwapConvention IMM_SWAP = new RollDateSwapConvention("USD IMM Swap", ExternalId.of(SCHEME, "USD IMM Swap").toBundle(), FIXED_LEG_ID, SWAP_3M_IBOR_ID, IMM_3M_EXPIRY_CONVENTION);
private static final RollDateFRAConvention IMM_FRA = new RollDateFRAConvention("USD IMM FRA", ExternalId.of(SCHEME, "USD IMM FRA").toBundle(), USDLIBOR3M_ID, IMM_3M_EXPIRY_CONVENTION);
private final Map<ExternalId, Convention> _conventions = ImmutableMap.<ExternalId, Convention>builder()
.put(DEPOSIT_1M_ID, DEPOSIT_1M)
.put(FIXED_LEG_ID, FIXED_LEG)
.put(RATE_FUTURE_3M_ID, RATE_FUTURE_3M)
.put(SWAP_3M_IBOR_ID, SWAP_3M_LIBOR)
.put(OIS_ID, OIS)
.put(OVERNIGHT_CONVENTION_ID, OVERNIGHT)
.put(SWAP_INDEX_ID, SWAP_INDEX)
.put(CMS_SWAP_ID, CMS)
.put(SWAP_6M_EURIBOR_ID, SWAP_6M_EURIBOR)
.put(COMPOUNDING_IBOR_ID, COMPOUNDING_IBOR)
.put(PRICE_INDEX_US_CONVENTION_ID, PRICE_INDEX_CONVENTION)
.put(ZERO_COUPON_INFLATION_ID, INFLATION_LEG)
.put(IMM_SWAP_ID, IMM_SWAP)
.put(IMM_FRA_ID, IMM_FRA)
.put(EURIBOR_CONVENTION_ID, EURIBOR_CONVENTION)
.put(USDLIBOR_CONVENTION_ID, USDLIBOR_CONVENTION)
.build();
// Security map. Used for index.
private final Map<ExternalIdBundle, Security> _securities = ImmutableMap.<ExternalIdBundle, Security>builder()
.put(USD_OVERNIGHT_ID.toBundle(), USD_OVERNIGHT)
.put(USDLIBOR1M_ID.toBundle(), USDLIBOR1M)
.put(USDLIBOR3M_ID.toBundle(), USDLIBOR3M)
.put(USDLIBOR6M_ID.toBundle(), USDLIBOR6M)
.put(EURIBOR1M_ID.toBundle(), EURIBOR1M)
.put(EURIBOR3M_ID.toBundle(), EURIBOR3M)
.put(EURIBOR6M_ID.toBundle(), EURIBOR6M)
.put(PRICE_INDEX_US_ID.toBundle(), PRICE_INDEX_US)
.build();
private final CurveNodeCurrencyVisitor _visitor = new CurveNodeCurrencyVisitor();
@BeforeMethod
public void setup() {
ConventionSource conventionSource = new TestConventionSource(_conventions);
SecuritySource securitySource = new MySecuritySource(_securities);
VersionCorrectionProvider vcProvider = new VersionCorrectionProvider() {
@Override
public VersionCorrection getPortfolioVersionCorrection() {
return VersionCorrection.LATEST;
}
@Override
public VersionCorrection getConfigVersionCorrection() {
return VersionCorrection.LATEST;
}
};
ThreadLocalServiceContext.init(
ServiceContext.of(
ImmutableMap.of(
SecuritySource.class, securitySource,
ConventionSource.class, conventionSource,
VersionCorrectionProvider.class, vcProvider)));
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullCashConvention() {
setupEmptyConventionSource();
final CashNode node = new CashNode(Tenor.ONE_DAY, Tenor.ONE_WEEK, DEPOSIT_1M_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullFRAConvention() {
final FRANode node = new FRANode(Tenor.ONE_DAY, Tenor.THREE_MONTHS, USDLIBOR3M_ID, SCHEME);
setupEmptyConventionSource();
node.accept(_visitor);
}
private void setupEmptyConventionSource() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of());
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullRateFutureConvention() {
final RateFutureNode node =
new RateFutureNode(2, Tenor.ONE_DAY, Tenor.THREE_MONTHS, Tenor.THREE_MONTHS, RATE_FUTURE_3M_ID, SCHEME);
setupEmptyConventionSource();
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullRateFutureUnderlyingConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(RATE_FUTURE_3M_ID, RATE_FUTURE_3M));
final RateFutureNode node =
new RateFutureNode(2, Tenor.ONE_DAY, Tenor.THREE_MONTHS, Tenor.THREE_MONTHS, RATE_FUTURE_3M_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullSwapPayConvention() {
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, SWAP_3M_IBOR_ID, SCHEME);
setupEmptyConventionSource();
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullSwapReceiveConvention() {
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, SWAP_3M_IBOR_ID, SCHEME);
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(FIXED_LEG_ID, FIXED_LEG));
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullIborUnderlyingConvention() {
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, SWAP_3M_IBOR_ID, SCHEME);
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
SWAP_3M_IBOR_ID, SWAP_3M_LIBOR));
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullCMSIndexUnderlyingConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(FIXED_LEG_ID, FIXED_LEG,SWAP_INDEX_ID, SWAP_INDEX));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, SWAP_INDEX_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullCMSUnderlyingConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
CMS_SWAP_ID, CMS));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, CMS_SWAP_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullOISUnderlyingConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
OIS_ID, OIS));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, OIS_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullFixedLegConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(OIS_ID, OIS));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, OIS_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullCompoundingIborLegConvention() {
final CompoundingIborLegConvention compoundingIbor =
new CompoundingIborLegConvention(
"USD Compounding Libor", ExternalId.of(SCHEME, "USD Compounding Libor").toBundle(),
USDLIBOR3M_ID, Tenor.THREE_MONTHS, CompoundingType.COMPOUNDING, Tenor.ONE_MONTH,
StubType.SHORT_START, 2, false, StubType.LONG_START, true, 1);
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
COMPOUNDING_IBOR_ID, compoundingIbor));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, COMPOUNDING_IBOR_ID, SCHEME);
node.accept(_visitor);
}
@Test(expectedExceptions = DataNotFoundException.class)
public void testWrongUnderlyingCompoundingIborLegConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
COMPOUNDING_IBOR_ID, COMPOUNDING_IBOR));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, COMPOUNDING_IBOR_ID, SCHEME);
node.accept(_visitor);
}
private void setupConventionSource(Map<ExternalId, Convention> conventions) {
ServiceContext context = ThreadLocalServiceContext.getInstance()
.with(ConventionSource.class, new TestConventionSource(conventions));
ThreadLocalServiceContext.init(context);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullZeroCouponInflationConvention() {
setupEmptyConventionSource();
final ZeroCouponInflationNode node = new ZeroCouponInflationNode(
Tenor.EIGHT_MONTHS, ZERO_COUPON_INFLATION_ID, FIXED_LEG_ID, InflationNodeType.INTERPOLATED, "TEST");
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullPriceIndexConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(ZERO_COUPON_INFLATION_ID, INFLATION_LEG));
final ZeroCouponInflationNode node = new ZeroCouponInflationNode(
Tenor.EIGHT_MONTHS, ZERO_COUPON_INFLATION_ID, FIXED_LEG_ID, InflationNodeType.MONTHLY, "TEST");
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullIMMFRAConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(USDLIBOR_CONVENTION_ID, USDLIBOR_CONVENTION));
final RollDateFRANode node = new RollDateFRANode(Tenor.ONE_DAY, Tenor.THREE_MONTHS, 4, 40, IMM_FRA_ID, "Test");
node.accept(_visitor);
}
@Test(expectedExceptions = ClassCastException.class)
public void testWrongTypeIMMFRAConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(IMM_FRA_ID, FIXED_LEG));
final RollDateSwapNode node = new RollDateSwapNode(Tenor.ONE_DAY, 4, 40, IMM_FRA_ID, "Test");
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullIMMSwapConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
SWAP_3M_IBOR_ID, SWAP_3M_LIBOR));
final RollDateSwapNode node = new RollDateSwapNode(Tenor.ONE_DAY, 4, 40, IMM_SWAP_ID, "Test");
node.accept(_visitor);
}
@Test(expectedExceptions = ClassCastException.class)
public void testWrongTypeIMMSwapConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(IMM_SWAP_ID, FIXED_LEG));
final RollDateSwapNode node = new RollDateSwapNode(Tenor.ONE_DAY, 4, 40, IMM_SWAP_ID, "Test");
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullPayIMMSwapConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
IMM_SWAP_ID, IMM_SWAP,
SWAP_3M_IBOR_ID, SWAP_3M_LIBOR));
final RollDateSwapNode node = new RollDateSwapNode(Tenor.ONE_DAY, 4, 40, IMM_SWAP_ID, "Test");
node.accept(_visitor);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testNullReceiveIMMSwapConvention() {
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
IMM_SWAP_ID, IMM_SWAP,
FIXED_LEG_ID, FIXED_LEG));
final RollDateSwapNode node = new RollDateSwapNode(Tenor.ONE_DAY, 4, 40, IMM_SWAP_ID, "Test");
node.accept(_visitor);
}
@Test(expectedExceptions = IllegalStateException.class)
public void testUnhandledConvention() {
final FinancialConvention convention = new MockConvention(
UniqueId.of("Convention", "Test"), "Mock", ExternalIdBundle.of("A", "B"), Currency.GBP);
setupConventionSource(ImmutableMap.<ExternalId, Convention>of(
FIXED_LEG_ID, FIXED_LEG,
ExternalId.of("A", "B"), convention));
final SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, ExternalId.of("A", "B"), SCHEME);
node.accept(_visitor);
}
@Test
public void testCash() {
final CashNode node = new CashNode(Tenor.ONE_DAY, Tenor.ONE_WEEK, DEPOSIT_1M_ID, SCHEME);
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
}
@Test
public void testContinuouslyCompoundedRateNode() {
final ContinuouslyCompoundedRateNode node = new ContinuouslyCompoundedRateNode(SCHEME, Tenor.TWELVE_MONTHS);
assertEquals(0, node.accept(_visitor).size());
}
@Test
public void testCreditSpreadNode() {
final CreditSpreadNode node = new CreditSpreadNode(SCHEME, Tenor.THREE_MONTHS);
assertEquals(0, node.accept(_visitor).size());
}
@Test
public void testDiscountFactorNode() {
final DiscountFactorNode node = new DiscountFactorNode(SCHEME, Tenor.FIVE_YEARS);
assertEquals(0, node.accept(_visitor).size());
}
@Test
public void testFRANode() {
final FRANode node = new FRANode(Tenor.ONE_DAY, Tenor.THREE_MONTHS, USDLIBOR3M_ID, SCHEME);
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
}
@Test
public void testFXForwardNode() {
final FXForwardNode node = new FXForwardNode(Tenor.ONE_DAY, Tenor.ONE_YEAR, FX_FORWARD_ID, Currency.EUR, Currency.AUD, SCHEME);
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(2, currencies.size());
assertEquals(Sets.newHashSet(Currency.EUR, Currency.AUD), currencies);
}
@Test
public void testIMMFRANode() {
final RollDateFRANode node = new RollDateFRANode(Tenor.ONE_DAY, Tenor.THREE_MONTHS, 4, 40, IMM_FRA_ID, "Test");
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
}
@Test
public void testIMMSwapNode() {
final RollDateSwapNode node = new RollDateSwapNode(Tenor.ONE_DAY, 4, 40, IMM_SWAP_ID, "Test");
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
}
@Test
public void testRateFutureNode() {
final RateFutureNode node = new RateFutureNode(2, Tenor.ONE_DAY, Tenor.THREE_MONTHS, Tenor.THREE_MONTHS, RATE_FUTURE_3M_ID, SCHEME);
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
}
@Test
public void testSwapNode() {
SwapNode node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, SWAP_3M_IBOR_ID, SCHEME);
Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, OIS_ID, SCHEME);
currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, CMS_SWAP_ID, SCHEME);
currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, FIXED_LEG_ID, COMPOUNDING_IBOR_ID, SCHEME);
currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
node = new SwapNode(Tenor.ONE_DAY, Tenor.TEN_YEARS, SWAP_3M_IBOR_ID, SWAP_6M_EURIBOR_ID, SCHEME);
currencies = node.accept(_visitor);
assertEquals(2, currencies.size());
assertEquals(Sets.newHashSet(Currency.EUR, Currency.USD), currencies);
}
@Test
public void testZeroCouponInflationNode() {
final ZeroCouponInflationNode node = new ZeroCouponInflationNode(
Tenor.EIGHT_YEARS, ZERO_COUPON_INFLATION_ID, FIXED_LEG_ID, InflationNodeType.INTERPOLATED, "TEST");
final Set<Currency> currencies = node.accept(_visitor);
assertEquals(1, currencies.size());
assertEquals(Currency.USD, currencies.iterator().next());
}
/**
* A simplified local version of a HolidaySource for tests.
*/
private static class MySecuritySource implements SecuritySource {
/** Security source as a map for tests **/
private final Map<ExternalIdBundle, Security> _map;
/**
* @param map The map of id/Security
*/
public MySecuritySource(Map<ExternalIdBundle, Security> map) {
_map = map;
}
@Override
public Collection<Security> get(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
return null;
}
@Override
public Map<ExternalIdBundle, Collection<Security>> getAll(Collection<ExternalIdBundle> bundles, VersionCorrection versionCorrection) {
return null;
}
@Override
public Collection<Security> get(ExternalIdBundle bundle) {
return null;
}
@Override
public Security getSingle(ExternalIdBundle bundle) {
return _map.get(bundle);
}
@Override
public Security getSingle(ExternalIdBundle bundle, VersionCorrection versionCorrection) {
return _map.get(bundle);
}
@Override
public Map<ExternalIdBundle, Security> getSingle(Collection<ExternalIdBundle> bundles, VersionCorrection versionCorrection) {
return null;
}
@Override
public Security get(UniqueId uniqueId) {
return null;
}
@Override
public Security get(ObjectId objectId, VersionCorrection versionCorrection) {
return null;
}
@Override
public Map<UniqueId, Security> get(Collection<UniqueId> uniqueIds) {
return null;
}
@Override
public Map<ObjectId, Security> get(Collection<ObjectId> objectIds, VersionCorrection versionCorrection) {
return null;
}
@Override
public ChangeManager changeManager() {
return null;
}
}
}