package com.opengamma.sesame.marketdata.scenarios;
import static org.testng.AssertJUnit.assertEquals;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.opengamma.sesame.marketdata.FxMatrixId;
import com.opengamma.sesame.marketdata.MarketDataId;
@Test
public class ScenarioDefinitionTest {
private static final TestFilter FILTER_A = new TestFilter("a");
private static final TestFilter FILTER_B = new TestFilter("b");
private static final TestFilter FILTER_C = new TestFilter("c");
private static final TestPerturbation PERTURBATION_A1 = new TestPerturbation(1);
private static final TestPerturbation PERTURBATION_A2 = new TestPerturbation(2);
private static final TestPerturbation PERTURBATION_B1 = new TestPerturbation(3);
private static final TestPerturbation PERTURBATION_B2 = new TestPerturbation(4);
private static final TestPerturbation PERTURBATION_C1 = new TestPerturbation(5);
private static final TestPerturbation PERTURBATION_C2 = new TestPerturbation(6);
private static final PerturbationMapping<TestPerturbation> MAPPING_A =
PerturbationMapping.of(FILTER_A, PERTURBATION_A1, PERTURBATION_A2);
private static final PerturbationMapping<TestPerturbation> MAPPING_B =
PerturbationMapping.of(FILTER_B, PERTURBATION_B1, PERTURBATION_B2);
private static final PerturbationMapping<TestPerturbation> MAPPING_C =
PerturbationMapping.of(FILTER_C, PERTURBATION_C1, PERTURBATION_C2);
public void ofMappings() {
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, MAPPING_C);
ScenarioDefinition scenarioDefinition = ScenarioDefinition.ofMappings(mappings);
List<SingleScenarioDefinition> scenarios =
ImmutableList.of(
SingleScenarioDefinition.of(
"Scenario 1",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"Scenario 2",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)));
assertEquals(scenarios, scenarioDefinition.getScenarios());
}
public void ofMappingsWithNames() {
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, MAPPING_C);
ImmutableSet<String> scenarioNames = ImmutableSet.of("foo", "bar");
ScenarioDefinition scenarioDefinition = ScenarioDefinition.ofMappings(scenarioNames, mappings);
List<SingleScenarioDefinition> scenarios =
ImmutableList.of(
SingleScenarioDefinition.of(
"foo",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"bar",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)));
assertEquals(scenarios, scenarioDefinition.getScenarios());
}
public void allCombinationsOf() {
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, MAPPING_C);
ScenarioDefinition scenarioDefinition = ScenarioDefinition.ofAllCombinations(mappings);
List<SingleScenarioDefinition> scenarios =
ImmutableList.of(
SingleScenarioDefinition.of(
"Scenario 1",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"Scenario 2",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)),
SingleScenarioDefinition.of(
"Scenario 3",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"Scenario 4",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)),
SingleScenarioDefinition.of(
"Scenario 5",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"Scenario 6",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)),
SingleScenarioDefinition.of(
"Scenario 7",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"Scenario 8",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)));
assertEquals(scenarios, scenarioDefinition.getScenarios());
}
public void allCombinationsOfWithNames() {
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, MAPPING_C);
ImmutableSet<String> scenarioNames = ImmutableSet.of("foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7", "foo8");
ScenarioDefinition scenarioDefinition = ScenarioDefinition.ofAllCombinations(scenarioNames, mappings);
List<SingleScenarioDefinition> scenarios =
ImmutableList.of(
SingleScenarioDefinition.of(
"foo1",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"foo2",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)),
SingleScenarioDefinition.of(
"foo3",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"foo4",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)),
SingleScenarioDefinition.of(
"foo5",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"foo6",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)),
SingleScenarioDefinition.of(
"foo7",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"foo8",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)));
assertEquals(scenarios, scenarioDefinition.getScenarios());
}
/**
* Tests that a scenario definition won't be built if the scenarios names are specified and there
* are the wrong number. The mappings all have 2 perturbations which should mean 2 scenarios, but
* there are 3 scenario names.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void ofMappingsWrongNumberOfScenarioNames() {
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, MAPPING_C);
ImmutableSet<String> scenarioNames = ImmutableSet.of("foo", "bar", "baz");
ScenarioDefinition.ofMappings(scenarioNames, mappings);
}
/**
* Tests that a scenario definition won't be built if the mappings don't have the same number of perturbations
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void ofMappingsDifferentNumberOfPerturbations() {
PerturbationMapping<TestPerturbation> mappingC = PerturbationMapping.of(FILTER_C, PERTURBATION_C1);
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, mappingC);
ScenarioDefinition.ofMappings(mappings);
}
/**
* Tests that a scenario definition won't be built if the mappings don't have the same number of perturbations
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void ofMappingsWithNamesDifferentNumberOfPerturbations() {
PerturbationMapping<TestPerturbation> mappingC = PerturbationMapping.of(FILTER_C, PERTURBATION_C1);
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, mappingC);
ImmutableSet<String> scenarioNames = ImmutableSet.of("foo", "bar");
ScenarioDefinition.ofMappings(scenarioNames, mappings);
}
/**
* Tests that a scenario definition won't be built if the scenarios names are specified and there are the wrong number
*/
@Test(expectedExceptions = IllegalArgumentException.class)
public void allCombinationsOfWrongNumberOfScenarioNames() {
List<PerturbationMapping<TestPerturbation>> mappings = ImmutableList.of(MAPPING_A, MAPPING_B, MAPPING_C);
ImmutableSet<String> scenarioNames = ImmutableSet.of("foo1", "foo2", "foo3", "foo4", "foo5", "foo6", "foo7");
ScenarioDefinition.ofAllCombinations(scenarioNames, mappings);
}
public void ofScenarios() {
List<SingleScenarioDefinition> scenarios =
ImmutableList.of(
SingleScenarioDefinition.of(
"Scenario 1",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1)),
SingleScenarioDefinition.of(
"Scenario 2",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2)));
ScenarioDefinition scenarioDefinition = ScenarioDefinition.ofScenarios(scenarios);
assertEquals(scenarios, scenarioDefinition.getScenarios());
}
public void ofScenariosVarargs() {
SingleScenarioDefinition scenario1 =
SingleScenarioDefinition.of(
"Scenario 1",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A1),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B1),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C1));
SingleScenarioDefinition scenario2 =
SingleScenarioDefinition.of(
"Scenario 2",
SinglePerturbationMapping.of(FILTER_A, PERTURBATION_A2),
SinglePerturbationMapping.of(FILTER_B, PERTURBATION_B2),
SinglePerturbationMapping.of(FILTER_C, PERTURBATION_C2));
ScenarioDefinition scenarioDefinition = ScenarioDefinition.ofScenarios(scenario1, scenario2);
assertEquals(ImmutableList.of(scenario1, scenario2), scenarioDefinition.getScenarios());
}
private static final class TestPerturbation implements Perturbation {
private final int id;
private TestPerturbation(int id) {
this.id = id;
}
@Override
public Object apply(Object marketData, MatchDetails matchDetails) {
return marketData;
}
@Override
public Class<?> getMarketDataType() {
return Object.class;
}
@Override
public Class<? extends MatchDetails> getMatchDetailsType() {
return StandardMatchDetails.NoDetails.class;
}
@Override
public PerturbationTarget getTargetType() {
return PerturbationTarget.OUTPUT;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
TestPerturbation that = (TestPerturbation) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
private static final class TestFilter implements MarketDataFilter {
private final String name;
private TestFilter(String name) {
this.name = name;
}
@Override
public Set<? extends MatchDetails> apply(MarketDataId<?> marketDataId) {
return ImmutableSet.of();
}
@Override
public Set<? extends MatchDetails> apply(MarketDataId<?> marketDataId, Object marketData) {
return ImmutableSet.of();
}
@Override
public Class<?> getMarketDataType() {
return Object.class;
}
@Override
public Class<? extends MarketDataId<?>> getMarketDataIdType() {
return FxMatrixId.class;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
TestFilter that = (TestFilter) o;
return Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
}