/** * 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 org.testng.AssertJUnit.assertEquals; import java.io.IOException; import java.math.BigDecimal; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.testng.annotations.Test; import org.threeten.bp.Instant; import org.threeten.bp.LocalDate; import org.threeten.bp.OffsetTime; import org.threeten.bp.ZonedDateTime; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Table; import com.google.common.collect.TreeBasedTable; import com.opengamma.core.position.PortfolioNode; import com.opengamma.core.position.Position; import com.opengamma.core.position.Trade; import com.opengamma.core.position.impl.SimpleCounterparty; import com.opengamma.core.position.impl.SimplePortfolioNode; import com.opengamma.core.position.impl.SimplePosition; import com.opengamma.core.position.impl.SimpleTrade; import com.opengamma.core.security.impl.SimpleSecurityLink; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.calcnode.EmptyAggregatedExecutionLog; import com.opengamma.engine.value.ComputedValueResult; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.engine.view.execution.ViewCycleExecutionOptions; import com.opengamma.financial.security.fra.FRASecurity; import com.opengamma.financial.security.fx.FXForwardSecurity; import com.opengamma.id.ExternalId; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdentifiable; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; @Test(groups = TestGroup.UNIT) public class ScenarioResultsWriterTest { private static final ValueSpecification VALUE_SPEC = new ValueSpecification("foo", ComputationTargetSpecification.NULL, ValueProperties.with(ValuePropertyNames.FUNCTION, "bar").get()); private final String _scenario1Name = "scenario1Name"; private final String _scenario2Name = "scenario2Name"; private final String _valuationTime1 = "2014-02-17T12:00Z"; private final String _valuationTime2 = "2013-02-17T12:00Z"; private final String _id1 = "Tst~123"; private final String _id2 = "Tst~234"; private final String _param1Value1 = "param1Value1"; private final String _param1Value2 = "param1Value2"; private final String _param2Value1 = "param2Value1"; private final String _param2Value2 = "param2Value2"; private final String _res1Name = "Result1"; private final String _res2Name = "Result2"; private final String _param1Name = "param1Name"; private final String _param2Name = "param2Name"; @Test public void shortFormat() throws IOException { List<String> expectedList = ImmutableList.of( // header ----- row("ScenarioName", "ValuationTime", "Type", "Description", "PositionId", "ParamName1", "ParamValue1", "ParamName2", "ParamValue2", _res1Name, _res2Name), // scenario 1 trade 1 ----- row(_scenario1Name, _valuationTime1, "FXForward", "An FX Forward", _id1, _param1Name, _param1Value1, _param2Name, _param2Value1, 1, 2), // scenario 1 trade 2 ----- row(_scenario1Name, _valuationTime1, "FRA", "A FRA", _id2, _param1Name, _param1Value1, _param2Name, _param2Value1, 3, 4), // scenario 2 trade 1 ----- row(_scenario2Name, _valuationTime2, "FXForward", "An FX Forward", _id1, _param1Name, _param1Value2, _param2Name, _param2Value2, 5, 6), // scenario 2 trade 2 ----- row(_scenario2Name, _valuationTime2, "FRA", "A FRA", _id2, _param1Name, _param1Value2, _param2Name, _param2Value2, 7, 8)); String expected = StringUtils.join(expectedList, "\n") + "\n"; StringBuilder builder = new StringBuilder(); ScenarioResultsWriter.writeShortFormat(scenarioResults(), builder); assertEquals(expected, builder.toString()); } @Test public void longFormat() throws IOException { List<String> expectedList = ImmutableList.of( // header ----- row("ScenarioName", "ValuationTime", "Type", "Description", "PositionId", "ParamName1", "ParamValue1", "ParamName2", "ParamValue2", "ResultName", "ResultValue"), // scenario 1 trade 1 result 1----- row(_scenario1Name, _valuationTime1, "FXForward", "An FX Forward", _id1, _param1Name, _param1Value1, _param2Name, _param2Value1, _res1Name, 1), // scenario 1 trade 1 result 2 ----- row(_scenario1Name, _valuationTime1, "FXForward", "An FX Forward", _id1, _param1Name, _param1Value1, _param2Name, _param2Value1, _res2Name, 2), // scenario 1 trade 2 result 1 ----- row(_scenario1Name, _valuationTime1, "FRA", "A FRA", _id2, _param1Name, _param1Value1, _param2Name, _param2Value1, _res1Name, 3), // scenario 1 trade 2 result 2 ----- row(_scenario1Name, _valuationTime1, "FRA", "A FRA", _id2, _param1Name, _param1Value1, _param2Name, _param2Value1, _res2Name, 4), // scenario 2 trade 1 result 1 ----- row(_scenario2Name, _valuationTime2, "FXForward", "An FX Forward", _id1, _param1Name, _param1Value2, _param2Name, _param2Value2, _res1Name, 5), // scenario 2 trade 1 result 2----- row(_scenario2Name, _valuationTime2, "FXForward", "An FX Forward", _id1, _param1Name, _param1Value2, _param2Name, _param2Value2, _res2Name, 6), // scenario 2 trade 2 result 1 ----- row(_scenario2Name, _valuationTime2, "FRA", "A FRA", _id2, _param1Name, _param1Value2, _param2Name, _param2Value2, _res1Name, 7), // scenario 2 trade 2 result 2 ----- row(_scenario2Name, _valuationTime2, "FRA", "A FRA", _id2, _param1Name, _param1Value2, _param2Name, _param2Value2, _res2Name, 8)); String expected = StringUtils.join(expectedList, "\n") + "\n"; StringBuilder builder = new StringBuilder(); ScenarioResultsWriter.writeLongFormat(scenarioResults(), builder); assertEquals(expected, builder.toString()); } private List<ScenarioResultModel> scenarioResults() { Position fxFwdPos = createFxForwardPosition(); Position fraPos = createFraPosition(); Trade fxFwdTrade = fxFwdPos.getTrades().iterator().next(); Trade fraTrade = fraPos.getTrades().iterator().next(); PortfolioNode node = new SimplePortfolioNode(UniqueId.parse("node~1"), "node"); List<UniqueIdentifiable> targets = ImmutableList.of(node, fxFwdPos, fxFwdTrade, fraPos, fraTrade); List<String> columnNames = ImmutableList.of(_res1Name, _res2Name); Table<Integer, Integer, Object> table1 = TreeBasedTable.create(); table1.put(0, 0, compuatedValue(0)); table1.put(0, 1, compuatedValue(0)); table1.put(1, 0, compuatedValue(1)); table1.put(1, 1, compuatedValue(2)); table1.put(2, 0, compuatedValue(1)); table1.put(2, 1, compuatedValue(2)); table1.put(3, 0, compuatedValue(3)); table1.put(3, 1, compuatedValue(4)); table1.put(4, 0, compuatedValue(3)); table1.put(4, 1, compuatedValue(4)); ViewCycleExecutionOptions executionOptions1 = ViewCycleExecutionOptions.builder() .setValuationTime(Instant.parse(_valuationTime1)) .setName(_scenario1Name) .create(); SimpleResultModel simpleResultModel1 = new SimpleResultModel(targets, columnNames, table1, executionOptions1); Map<String, Object> scenarioParams1 = ImmutableMap.<String, Object>of(_param1Name, _param1Value1, _param2Name, _param2Value1); ScenarioResultModel scenarioResultModel1 = new ScenarioResultModel(simpleResultModel1, scenarioParams1); Table<Integer, Integer, Object> table2 = TreeBasedTable.create(); table2.put(0, 0, compuatedValue(0)); table2.put(0, 1, compuatedValue(0)); table2.put(1, 0, compuatedValue(5)); table2.put(1, 1, compuatedValue(6)); table2.put(2, 0, compuatedValue(5)); table2.put(2, 1, compuatedValue(6)); table2.put(3, 0, compuatedValue(7)); table2.put(3, 1, compuatedValue(8)); table2.put(4, 0, compuatedValue(7)); table2.put(4, 1, compuatedValue(8)); ViewCycleExecutionOptions executionOptions2 = ViewCycleExecutionOptions.builder() .setValuationTime(Instant.parse(_valuationTime2)) .setName(_scenario2Name) .create(); SimpleResultModel simpleResultModel2 = new SimpleResultModel(targets, columnNames, table2, executionOptions2); Map<String, Object> scenarioParams2 = ImmutableMap.<String, Object>of(_param1Name, _param1Value2, _param2Name, _param2Value2); ScenarioResultModel scenarioResultModel2 = new ScenarioResultModel(simpleResultModel2, scenarioParams2); return ImmutableList.of(scenarioResultModel1, scenarioResultModel2); } private static Object compuatedValue(int value) { return new ComputedValueResult(VALUE_SPEC, value, EmptyAggregatedExecutionLog.INSTANCE); } private Position createFxForwardPosition() { ExternalId externalId = ExternalId.parse("a~1"); FXForwardSecurity security = new FXForwardSecurity(Currency.EUR, 1, Currency.USD, 1, ZonedDateTime.now(), externalId); security.setName("An FX Forward"); SimplePosition position = new SimplePosition(BigDecimal.ONE, security.getExternalIdBundle()); position.setUniqueId(UniqueId.parse(_id1)); SimpleCounterparty counterparty = new SimpleCounterparty(ExternalId.parse("a~b")); SimpleTrade trade = new SimpleTrade(security, BigDecimal.ONE, counterparty, LocalDate.now(), OffsetTime.now()); SimpleSecurityLink securityLink = new SimpleSecurityLink(); securityLink.setTarget(security); position.setSecurityLink(securityLink); position.addTrade(trade); return position; } private Position createFraPosition() { ZonedDateTime now = ZonedDateTime.now(); FRASecurity security = new FRASecurity(Currency.GBP, ExternalId.parse("b~2"), now, now, 1, 1, ExternalId.parse("c~3"), now); security.setName("A FRA"); SimplePosition position = new SimplePosition(BigDecimal.ONE, security.getExternalIdBundle()); position.setUniqueId(UniqueId.parse(_id2)); SimpleCounterparty counterparty = new SimpleCounterparty(ExternalId.parse("a~b")); SimpleTrade trade = new SimpleTrade(security, BigDecimal.ONE, counterparty, LocalDate.now(), OffsetTime.now()); SimpleSecurityLink securityLink = new SimpleSecurityLink(); securityLink.setTarget(security); position.setSecurityLink(securityLink); position.addTrade(trade); return position; } private static String row(Object... values) { return StringUtils.join(values, ScenarioResultsWriter.DELIMITER); } }