/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.marketdata.manipulator.dsl; import static com.opengamma.integration.marketdata.manipulator.dsl.MarketDataDelegate.MarketDataType.FIXED_HISTORICAL; import static com.opengamma.integration.marketdata.manipulator.dsl.MarketDataDelegate.MarketDataType.LATEST_HISTORICAL; import static com.opengamma.integration.marketdata.manipulator.dsl.MarketDataDelegate.MarketDataType.LIVE; import static com.opengamma.integration.marketdata.manipulator.dsl.MarketDataDelegate.MarketDataType.SNAPSHOT; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import java.math.BigDecimal; import java.util.List; import java.util.Map; import org.codehaus.groovy.control.CompilerConfiguration; import org.testng.annotations.Test; import org.threeten.bp.Instant; import org.threeten.bp.LocalDateTime; import org.threeten.bp.Period; import org.threeten.bp.ZonedDateTime; import org.threeten.bp.format.DateTimeFormatter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.opengamma.engine.function.FunctionParameters; import com.opengamma.engine.function.SimpleFunctionParameters; import com.opengamma.engine.function.StructureManipulationFunction; import com.opengamma.engine.marketdata.manipulator.DistinctMarketDataSelector; import com.opengamma.engine.marketdata.manipulator.ScenarioDefinition; import com.opengamma.id.ExternalId; import com.opengamma.util.OpenGammaClock; import com.opengamma.util.test.TestGroup; import groovy.lang.Binding; import groovy.lang.GroovyShell; @Test(groups = TestGroup.UNIT) public class StandAloneScenarioScriptTest { private static final DateTimeFormatter s_dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); private static final String FOO = "foo"; private static final String BAR = "bar"; @Test public void view() { String scriptText = "view {\n" + " name 'an example view'\n" + " server 'svr:8080'\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); ViewDelegate viewDelegate = script.getViewDelegate(); assertEquals("an example view", viewDelegate.getName()); assertEquals("svr:8080", viewDelegate.getServer()); } @Test public void marketData() { String scriptText = "view {\n" + " marketData {\n" + " live 'Bloomberg'\n" + " live 'Activ'\n" + " snapshot 'the snapshot name'\n" + " fixedHistorical '2011-03-08 11:30'\n" + " latestHistorical\n" + " fixedHistorical '2012-03-10 12:30'\n" + " }\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); ImmutableList<MarketDataDelegate.MarketDataSpec> expectedSpecs = ImmutableList.of(spec(LIVE, "Bloomberg"), spec(LIVE, "Activ"), spec(SNAPSHOT, "the snapshot name"), spec(FIXED_HISTORICAL, "2011-03-08 11:30"), spec(LATEST_HISTORICAL, null), spec(FIXED_HISTORICAL, "2012-03-10 12:30")); MarketDataDelegate marketDataDelegate = script.getViewDelegate().getMarketDataDelegate(); assertEquals(expectedSpecs, marketDataDelegate.getSpecifications()); } @Test public void shockList() { String scriptText = "shockList {\n" + " foo = [1, 2, 3]\n" + " bar = ['a', 'b', 'c']\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); List<Map<String,Object>> params = script.getScenarioParameterList(); assertEquals(3, params.size()); assertEquals(1, params.get(0).get(FOO)); assertEquals("a", params.get(0).get(BAR)); assertEquals(2, params.get(1).get(FOO)); assertEquals("b", params.get(1).get(BAR)); assertEquals(3, params.get(2).get(FOO)); assertEquals("c", params.get(2).get(BAR)); } @Test public void shockGrid() { String scriptText = "shockGrid {\n" + " foo = [1, 2]\n" + " bar = ['a', 'b']\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); List<Map<String,Object>> params = script.getScenarioParameterList(); assertEquals(4, params.size()); assertEquals(1, params.get(0).get(FOO)); assertEquals("a", params.get(0).get(BAR)); assertEquals(1, params.get(1).get(FOO)); assertEquals("b", params.get(1).get(BAR)); assertEquals(2, params.get(2).get(FOO)); assertEquals("a", params.get(2).get(BAR)); assertEquals(2, params.get(3).get(FOO)); assertEquals("b", params.get(3).get(BAR)); } @Test public void scenarioList() { String scriptText = "shockList {\n" + " foo = [1, 2]\n" + " bar = ['a', 'b']\n" + " valTime = ['2014-01-14 12:03', '2014-02-14 12:03']\n" + "}\n" + "scenarios {\n" + " valuationTime valTime\n" + " marketData {\n" + " id 'SCHEME', bar\n" + " apply {\n" + " shift Absolute, foo\n" + " }\n" + " }\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); Simulation simulation = script.getSimulation(); Map<String, Scenario> scenarios = simulation.getScenarios(); assertEquals(2, scenarios.size()); checkScenario(scenarios, "a", 1, "2014-01-14 12:03"); checkScenario(scenarios, "b", 2, "2014-02-14 12:03"); } @Test public void scenarioGrid() { String scriptText = "shockGrid {\n" + " foo = [1, 2]\n" + " bar = ['a', 'b']\n" + "}\n" + "scenarios {\n" + " marketData {\n" + " id 'SCHEME', bar\n" + " apply {\n" + " shift Absolute, foo\n" + " }\n" + " }\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); Simulation simulation = script.getSimulation(); Map<String, Scenario> scenarios = simulation.getScenarios(); assertEquals(4, scenarios.size()); checkScenario(scenarios, "a", 1, null); checkScenario(scenarios, "a", 2, null); checkScenario(scenarios, "b", 1, null); checkScenario(scenarios, "b", 2, null); } @Test public void initialize() { String scriptText = "shockList {\n" + " foo = [100.bp, 20.pc, 1.y]\n" + "}"; StandAloneScenarioScript script = createScript(scriptText); List<Map<String,Object>> params = script.getScenarioParameterList(); assertEquals(3, params.size()); assertEquals(new BigDecimal("0.01"), params.get(0).get(FOO)); assertEquals(new BigDecimal("0.2"), params.get(1).get(FOO)); assertEquals(Period.ofYears(1), params.get(2).get(FOO)); } private static void checkScenario(Map<String, Scenario> scenarios, String id, double shiftAmount, String valuationTime) { String scenarioName; if (valuationTime != null) { scenarioName = "foo=" + (int) shiftAmount + " bar='" + id + "' valTime='" + valuationTime + "'"; } else { scenarioName = "foo=" + (int) shiftAmount + " bar='" + id + "'"; } Scenario scenario = scenarios.get(scenarioName); assertNotNull(scenario); ScenarioDefinition definition = scenario.createDefinition(); Instant valuationInstant; if (valuationTime != null) { LocalDateTime localTime = LocalDateTime.parse(valuationTime, s_dateFormatter); valuationInstant = ZonedDateTime.of(localTime, OpenGammaClock.getZone()).toInstant(); } else { valuationInstant = null; } assertEquals(valuationInstant, scenario.getValuationTime()); Map<DistinctMarketDataSelector, FunctionParameters> definitionMap = definition.getDefinitionMap(); PointSelector selector = new PointSelector(null, ImmutableSet.of(ExternalId.of("SCHEME", id)), null, null, null, null, null); FunctionParameters parameters = definitionMap.get(selector); CompositeStructureManipulator compositeManipulator = ((SimpleFunctionParameters) parameters).getValue(StructureManipulationFunction.EXPECTED_PARAMETER_NAME); MarketDataShift shift = (MarketDataShift) compositeManipulator.getManipulators().get(0); assertEquals(1 + shiftAmount, shift.execute(1.0, null, null)); } private static StandAloneScenarioScript createScript(String scriptText) { CompilerConfiguration config = new CompilerConfiguration(); config.setScriptBaseClass(StandAloneScenarioScript.class.getName()); GroovyShell shell = new GroovyShell(config); StandAloneScenarioScript script = (StandAloneScenarioScript) shell.parse(scriptText); Binding binding = new Binding(); SimulationUtils.registerAliases(binding); script.setBinding(binding); script.run(); return script; } private static MarketDataDelegate.MarketDataSpec spec(MarketDataDelegate.MarketDataType type, String spec) { return new MarketDataDelegate.MarketDataSpec(type, spec); } }