/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.math.BigDecimal; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.ZonedDateTime; import com.google.common.collect.ImmutableSet; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlock; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount; import com.opengamma.analytics.math.matrix.DoubleMatrix2D; import com.opengamma.core.position.impl.SimpleTrade; import com.opengamma.core.security.impl.SimpleSecurityLink; import com.opengamma.sesame.function.scenarios.FilteredScenarioDefinition; import com.opengamma.sesame.marketdata.MarketDataBundle; import com.opengamma.sesame.sources.BondMockSources; import com.opengamma.sesame.trade.BondTrade; import com.opengamma.sesame.trade.TradeWrapper; import com.opengamma.util.result.Result; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.Pair; @Test(groups = TestGroup.UNIT) public class PreCalibratedMulticurveFnTest { private static final Environment ENV = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class)); private static final TradeWrapper<?> TRADE = createTrade(); private static TradeWrapper<?> createTrade() { SimpleTrade trade = new SimpleTrade(); trade.setQuantity(BigDecimal.ONE); trade.setTradeDate(LocalDate.of(2011, 3, 8)); SimpleSecurityLink securityLink = new SimpleSecurityLink(); securityLink.setTarget(BondMockSources.GOVERNMENT_BOND_SECURITY); trade.setSecurityLink(securityLink); return new BondTrade(trade); } @Test public void noCurvesForTrade() { CurveSelector curveSelector = mock(CurveSelector.class); when(curveSelector.getMulticurveNames(TRADE.getTrade())).thenReturn(Collections.<String>emptySet()); PreCalibratedMulticurveFn fn = new PreCalibratedMulticurveFn(curveSelector); assertFalse(fn.getMulticurveBundle(ENV, TRADE).isSuccess()); } @Test public void wrongNumberOfScenarioArgs() { Map<String, MulticurveBundle> emptyCurves = Collections.emptyMap(); PreCalibratedMulticurveArguments args1 = new PreCalibratedMulticurveArguments(emptyCurves); PreCalibratedMulticurveArguments args2 = new PreCalibratedMulticurveArguments(emptyCurves); FilteredScenarioDefinition scenarioDefinition = new FilteredScenarioDefinition(args1, args2); SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class), scenarioDefinition); Set<String> curveNames = ImmutableSet.of("a curve"); CurveSelector curveSelector = mock(CurveSelector.class); when(curveSelector.getMulticurveNames(TRADE.getTrade())).thenReturn(curveNames); PreCalibratedMulticurveFn fn = new PreCalibratedMulticurveFn(curveSelector); assertFalse(fn.getMulticurveBundle(env, TRADE).isSuccess()); } @Test public void expectedCurveNotAvailable() { Map<String, MulticurveBundle> curves = new HashMap<>(); LinkedHashMap<String, Pair<CurveBuildingBlock, DoubleMatrix2D>> linkedMap = new LinkedHashMap<>(); MulticurveBundle multicurveBundle = new MulticurveBundle(new MulticurveProviderDiscount(), new CurveBuildingBlockBundle(linkedMap)); curves.put("a curve", multicurveBundle); PreCalibratedMulticurveArguments args = new PreCalibratedMulticurveArguments(curves); FilteredScenarioDefinition scenarioDefinition = new FilteredScenarioDefinition(args); SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class), scenarioDefinition); Set<String> curveNames = ImmutableSet.of("a different curve"); CurveSelector curveSelector = mock(CurveSelector.class); when(curveSelector.getMulticurveNames(TRADE.getTrade())).thenReturn(curveNames); PreCalibratedMulticurveFn fn = new PreCalibratedMulticurveFn(curveSelector); assertFalse(fn.getMulticurveBundle(env, TRADE).isSuccess()); } @Test public void singleCurveFound() { Map<String, MulticurveBundle> curves = new HashMap<>(); LinkedHashMap<String, Pair<CurveBuildingBlock, DoubleMatrix2D>> linkedMap = new LinkedHashMap<>(); MulticurveBundle multicurveBundle = new MulticurveBundle(new MulticurveProviderDiscount(), new CurveBuildingBlockBundle(linkedMap)); curves.put("a curve", multicurveBundle); PreCalibratedMulticurveArguments args = new PreCalibratedMulticurveArguments(curves); FilteredScenarioDefinition scenarioDefinition = new FilteredScenarioDefinition(args); SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class), scenarioDefinition); Set<String> curveNames = ImmutableSet.of("a curve"); CurveSelector curveSelector = mock(CurveSelector.class); when(curveSelector.getMulticurveNames(TRADE.getTrade())).thenReturn(curveNames); PreCalibratedMulticurveFn fn = new PreCalibratedMulticurveFn(curveSelector); assertTrue(fn.getMulticurveBundle(env, TRADE).isSuccess()); } @Test public void multipleCurvesFound() { Map<String, MulticurveBundle> curves = new HashMap<>(); LinkedHashMap<String, Pair<CurveBuildingBlock, DoubleMatrix2D>> linkedMap1 = new LinkedHashMap<>(); MulticurveBundle multicurveBundle1 = new MulticurveBundle(new MulticurveProviderDiscount(), new CurveBuildingBlockBundle(linkedMap1)); curves.put("curve1", multicurveBundle1); LinkedHashMap<String, Pair<CurveBuildingBlock, DoubleMatrix2D>> linkedMap2 = new LinkedHashMap<>(); MulticurveBundle multicurveBundle2 = new MulticurveBundle(new MulticurveProviderDiscount(), new CurveBuildingBlockBundle(linkedMap2)); curves.put("curve2", multicurveBundle2); PreCalibratedMulticurveArguments args = new PreCalibratedMulticurveArguments(curves); FilteredScenarioDefinition scenarioDefinition = new FilteredScenarioDefinition(args); SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class), scenarioDefinition); Set<String> curveNames = ImmutableSet.of("curve1", "curve2"); CurveSelector curveSelector = mock(CurveSelector.class); when(curveSelector.getMulticurveNames(TRADE.getTrade())).thenReturn(curveNames); PreCalibratedMulticurveFn fn = new PreCalibratedMulticurveFn(curveSelector); Result<MulticurveBundle> result = fn.getMulticurveBundle(env, TRADE); assertTrue(result.isSuccess()); } }