/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.function.scenarios.curvedata; import static com.opengamma.sesame.config.ConfigBuilder.argument; import static com.opengamma.sesame.config.ConfigBuilder.arguments; import static com.opengamma.sesame.config.ConfigBuilder.config; import static com.opengamma.sesame.config.ConfigBuilder.function; import static com.opengamma.sesame.config.ConfigBuilder.implementations; import static com.opengamma.util.result.ResultTestUtils.assertSuccess; import java.util.Map; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.ZonedDateTime; import com.opengamma.financial.analytics.curve.CurveSpecification; import com.opengamma.financial.currency.SimpleCurrencyMatrix; import com.opengamma.id.ExternalIdBundle; import com.opengamma.sesame.CurveSpecificationMarketDataFn; import com.opengamma.sesame.DefaultCurveSpecificationMarketDataFn; import com.opengamma.sesame.Environment; import com.opengamma.sesame.SimpleEnvironment; import com.opengamma.sesame.config.FunctionModelConfig; import com.opengamma.sesame.function.Output; import com.opengamma.sesame.function.scenarios.FilteredScenarioDefinition; import com.opengamma.sesame.graph.FunctionModel; import com.opengamma.sesame.marketdata.DefaultMarketDataFn; import com.opengamma.sesame.marketdata.MapMarketDataBundle; import com.opengamma.sesame.marketdata.MarketDataBundle; import com.opengamma.sesame.marketdata.MarketDataEnvironmentBuilder; import com.opengamma.sesame.marketdata.MarketDataFn; import com.opengamma.sesame.marketdata.RawId; import com.opengamma.util.result.Result; import com.opengamma.util.test.TestGroup; @Test(groups = TestGroup.UNIT) @SuppressWarnings("unchecked") public class CurveDataShiftDecoratorTest { private static final ZonedDateTime VALUATION_TIME = ZonedDateTime.now(); private static final MarketDataBundle MARKET_DATA_BUNDLE = new MapMarketDataBundle(new MarketDataEnvironmentBuilder() .add(RawId.of(CurveTestUtils.ID1.toBundle()), 0.1) .add(RawId.of(CurveTestUtils.ID2.toBundle()), 0.2) .add(RawId.of(CurveTestUtils.ID3.toBundle()), 0.7) .add(RawId.of(CurveTestUtils.ID4.toBundle()), 0.4) .valuationTime(ZonedDateTime.now()) .build()); private static final FunctionModelConfig CONFIG = config(implementations(Fn.class, Impl.class, MarketDataFn.class, DefaultMarketDataFn.class, CurveSpecificationMarketDataFn.class, DefaultCurveSpecificationMarketDataFn.class), arguments(function(DefaultMarketDataFn.class, argument("currencyMatrix", new SimpleCurrencyMatrix())))); private static final FunctionModelConfig DECORATED_CONFIG = CONFIG.decoratedWith(CurveDataShiftDecorator.class); private static final Fn FN = FunctionModel.build(Fn.class, DECORATED_CONFIG); private static final CurveSpecificationMatcher MATCHER = CurveSpecificationMatcher.named(CurveTestUtils.CURVE_NAME); @Test public void absolute() { CurveDataParallelShift shift = new CurveDataParallelShift(0.1, MATCHER); FilteredScenarioDefinition scenarioDef = new FilteredScenarioDefinition(shift); SimpleEnvironment env = new SimpleEnvironment(VALUATION_TIME, MARKET_DATA_BUNDLE, scenarioDef); Result<Map<ExternalIdBundle, Double>> result = FN.foo(env, CurveTestUtils.CURVE_SPEC); assertSuccess(result); Map<ExternalIdBundle, Double> shiftedValues = result.getValue(); CurveTestUtils.checkValues(shiftedValues, 0.2, 0.3, 0.6, 0.5); } @Test public void relative() { CurveDataRelativeShift shift = new CurveDataRelativeShift(0.1, MATCHER); FilteredScenarioDefinition scenarioDef = new FilteredScenarioDefinition(shift); SimpleEnvironment env = new SimpleEnvironment(VALUATION_TIME, MARKET_DATA_BUNDLE, scenarioDef); Result<Map<ExternalIdBundle, Double>> result = FN.foo(env, CurveTestUtils.CURVE_SPEC); assertSuccess(result); Map<ExternalIdBundle, Double> shiftedValues = result.getValue(); CurveTestUtils.checkValues(shiftedValues, 0.11, 0.22, 0.67, 0.44); } @Test public void noMatch() { CurveDataParallelShift shift = new CurveDataParallelShift(0.1, MATCHER); FilteredScenarioDefinition scenarioDef = new FilteredScenarioDefinition(shift); SimpleEnvironment env = new SimpleEnvironment(VALUATION_TIME, MARKET_DATA_BUNDLE, scenarioDef); CurveSpecification curveSpec = new CurveSpecification(LocalDate.now(), "a different name", CurveTestUtils.NODES); Result<Map<ExternalIdBundle, Double>> result = FN.foo(env, curveSpec); assertSuccess(result); Map<ExternalIdBundle, Double> shiftedValues = result.getValue(); CurveTestUtils.checkValues(shiftedValues, 0.1, 0.2, 0.7, 0.4); } @Test public void multipleSameType() { CurveDataParallelShift shift1 = new CurveDataParallelShift(0.1, MATCHER); CurveDataParallelShift shift2 = new CurveDataParallelShift(0.2, MATCHER); FilteredScenarioDefinition scenarioDef = new FilteredScenarioDefinition(shift1, shift2); SimpleEnvironment env = new SimpleEnvironment(VALUATION_TIME, MARKET_DATA_BUNDLE, scenarioDef); Result<Map<ExternalIdBundle, Double>> result = FN.foo(env, CurveTestUtils.CURVE_SPEC); assertSuccess(result); Map<ExternalIdBundle, Double> shiftedValues = result.getValue(); CurveTestUtils.checkValues(shiftedValues, 0.4, 0.5, 0.4, 0.7); } @Test public void multipleDifferentTypes() { CurveDataParallelShift abs = new CurveDataParallelShift(0.1, MATCHER); CurveDataRelativeShift rel = new CurveDataRelativeShift(0.1, MATCHER); FilteredScenarioDefinition scenarioDef = new FilteredScenarioDefinition(abs, rel); SimpleEnvironment env = new SimpleEnvironment(VALUATION_TIME, MARKET_DATA_BUNDLE, scenarioDef); Result<Map<ExternalIdBundle, Double>> result = FN.foo(env, CurveTestUtils.CURVE_SPEC); assertSuccess(result); Map<ExternalIdBundle, Double> shiftedValues = result.getValue(); CurveTestUtils.checkValues(shiftedValues, 0.22, 0.33, 0.56, 0.55); } @Test public void multipleReversed() { CurveDataRelativeShift rel = new CurveDataRelativeShift(0.1, MATCHER); CurveDataParallelShift abs = new CurveDataParallelShift(0.1, MATCHER); FilteredScenarioDefinition scenarioDef = new FilteredScenarioDefinition(rel, abs); SimpleEnvironment env = new SimpleEnvironment(VALUATION_TIME, MARKET_DATA_BUNDLE, scenarioDef); Result<Map<ExternalIdBundle, Double>> result = FN.foo(env, CurveTestUtils.CURVE_SPEC); assertSuccess(result); Map<ExternalIdBundle, Double> shiftedValues = result.getValue(); CurveTestUtils.checkValues(shiftedValues, 0.21, 0.32, 0.57, 0.54); } public interface Fn { @Output("Foo") Result<Map<ExternalIdBundle, Double>> foo(Environment env, CurveSpecification curveSpec); } public static class Impl implements Fn { private final CurveSpecificationMarketDataFn _marketDataFn; public Impl(CurveSpecificationMarketDataFn marketDataFn) { _marketDataFn = marketDataFn; } @Override public Result<Map<ExternalIdBundle, Double>> foo(Environment env, CurveSpecification curveSpec) { return _marketDataFn.requestData(env, curveSpec); } } }