/** * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.data.scenario; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static com.opengamma.strata.collect.TestHelper.date; import static org.assertj.core.api.Assertions.assertThat; import java.time.LocalDate; import java.util.Objects; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; import com.opengamma.strata.basics.StandardId; import com.opengamma.strata.collect.timeseries.LocalDateDoubleTimeSeries; import com.opengamma.strata.data.FieldName; import com.opengamma.strata.data.ObservableId; import com.opengamma.strata.data.ObservableSource; @Test public class CombinedScenarioMarketDataTest { private static final TestId TEST_ID1 = new TestId("1"); private static final TestId TEST_ID2 = new TestId("2"); private static final TestId TEST_ID3 = new TestId("3"); public void test_combinedWith() { LocalDateDoubleTimeSeries timeSeries1 = LocalDateDoubleTimeSeries.builder() .put(date(2011, 3, 8), 1) .put(date(2011, 3, 9), 2) .put(date(2011, 3, 10), 3) .build(); LocalDateDoubleTimeSeries timeSeries2 = LocalDateDoubleTimeSeries.builder() .put(date(2011, 3, 8), 10) .put(date(2011, 3, 9), 20) .put(date(2011, 3, 10), 30) .build(); LocalDateDoubleTimeSeries timeSeries2a = LocalDateDoubleTimeSeries.builder() .put(date(2011, 3, 8), 1000) .put(date(2011, 3, 9), 2000) .put(date(2011, 3, 10), 3000) .build(); LocalDateDoubleTimeSeries timeSeries3 = LocalDateDoubleTimeSeries.builder() .put(date(2011, 3, 8), 100) .put(date(2011, 3, 9), 200) .put(date(2011, 3, 10), 300) .build(); ImmutableScenarioMarketData marketData1 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addTimeSeries(TEST_ID1, timeSeries1) .addTimeSeries(TEST_ID2, timeSeries2) .addBox(TEST_ID1, MarketDataBox.ofScenarioValues(1.0, 1.1, 1.2)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(2.0, 2.1, 2.2)) .build(); ImmutableScenarioMarketData marketData2 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 10)) .addTimeSeries(TEST_ID2, timeSeries2a) .addTimeSeries(TEST_ID3, timeSeries3) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(21.0, 21.1, 21.2)) .addBox(TEST_ID3, MarketDataBox.ofScenarioValues(3.0, 3.1, 3.2)) .build(); // marketData1 values should be in the combined data when the same ID is present in both ImmutableScenarioMarketData expected = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addTimeSeries(TEST_ID1, timeSeries1) .addTimeSeries(TEST_ID2, timeSeries2) .addTimeSeries(TEST_ID3, timeSeries3) .addBox(TEST_ID1, MarketDataBox.ofScenarioValues(1.0, 1.1, 1.2)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(2.0, 2.1, 2.2)) .addBox(TEST_ID3, MarketDataBox.ofScenarioValues(3.0, 3.1, 3.2)) .build(); ScenarioMarketData combined = marketData1.combinedWith(marketData2); assertThat(combined).isEqualTo(expected); assertThat(combined.getIds()).isEqualTo(ImmutableSet.of(TEST_ID1, TEST_ID2, TEST_ID3)); } public void test_combinedWithIncompatibleScenarioCount() { ImmutableScenarioMarketData marketData1 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID1, MarketDataBox.ofScenarioValues(1.0, 1.1, 1.2)) .build(); ImmutableScenarioMarketData marketData2 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(1.0, 1.1)) .build(); assertThrowsIllegalArg(() -> marketData1.combinedWith(marketData2), ".* same number of scenarios .* 3 and 2"); } public void test_combinedWithReceiverHasOneScenario() { ImmutableScenarioMarketData marketData1 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID1, MarketDataBox.ofSingleValue(1.0)) .build(); ImmutableScenarioMarketData marketData2 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(1.0, 1.1)) .build(); ImmutableScenarioMarketData expected = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID1, MarketDataBox.ofSingleValue(1.0)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(1.0, 1.1)) .build(); ScenarioMarketData combined = marketData1.combinedWith(marketData2); assertThat(combined).isEqualTo(expected); assertThat(combined.getIds()).isEqualTo(ImmutableSet.of(TEST_ID1, TEST_ID2)); } public void test_combinedWithOtherHasOneScenario() { ImmutableScenarioMarketData marketData1 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(1.0, 1.1)) .build(); ImmutableScenarioMarketData marketData2 = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID1, MarketDataBox.ofSingleValue(1.0)) .build(); ImmutableScenarioMarketData expected = ImmutableScenarioMarketData.builder(LocalDate.of(2011, 3, 8)) .addBox(TEST_ID1, MarketDataBox.ofSingleValue(1.0)) .addBox(TEST_ID2, MarketDataBox.ofScenarioValues(1.0, 1.1)) .build(); ScenarioMarketData combined = marketData1.combinedWith(marketData2); assertThat(combined).isEqualTo(expected); assertThat(combined.getIds()).isEqualTo(ImmutableSet.of(TEST_ID1, TEST_ID2)); } //------------------------------------------------------------------------- private static final class TestId implements ObservableId { private final String id; private TestId(String id) { this.id = id; } @Override public StandardId getStandardId() { throw new UnsupportedOperationException("getStandardId not implemented"); } @Override public FieldName getFieldName() { throw new UnsupportedOperationException("getFieldName not implemented"); } @Override public ObservableSource getObservableSource() { throw new UnsupportedOperationException("getObservableSource not implemented"); } @Override public ObservableId withObservableSource(ObservableSource obsSource) { throw new UnsupportedOperationException("withObservableSource not implemented"); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } TestId testId = (TestId) o; return Objects.equals(id, testId.id); } @Override public int hashCode() { return Objects.hash(id); } } }