/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.data;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrows;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static com.opengamma.strata.collect.TestHelper.date;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.opengamma.strata.collect.timeseries.LocalDateDoubleTimeSeries;
/**
* Test {@link MarketData} and {@link ImmutableMarketData}.
*/
@Test
public class MarketDataTest {
private static final LocalDate VAL_DATE = date(2015, 6, 30);
private static final TestingNamedId ID1 = new TestingNamedId("1");
private static final TestingNamedId ID2 = new TestingNamedId("2");
private static final TestingNamedId ID3 = new TestingNamedId("3");
private static final TestingObservableId ID4 = new TestingObservableId("4");
private static final TestingObservableId ID5 = new TestingObservableId("5");
private static final String VAL1 = "1";
private static final String VAL2 = "2";
private static final String VAL3 = "3";
private static final LocalDateDoubleTimeSeries TIME_SERIES = LocalDateDoubleTimeSeries.builder()
.put(date(2011, 3, 8), 1.1)
.put(date(2011, 3, 10), 1.2)
.build();
//-------------------------------------------------------------------------
public void test_of_2arg() {
Map<MarketDataId<?>, Object> dataMap = ImmutableMap.of(ID1, VAL1, ID2, VAL2);
MarketData test = MarketData.of(VAL_DATE, dataMap);
assertEquals(test.containsValue(ID1), true);
assertEquals(test.getValue(ID1), VAL1);
assertEquals(test.findValue(ID1), Optional.of(VAL1));
assertEquals(test.containsValue(ID2), true);
assertEquals(test.getValue(ID2), VAL2);
assertEquals(test.findValue(ID2), Optional.of(VAL2));
assertEquals(test.containsValue(ID3), false);
assertThrows(() -> test.getValue(ID3), MarketDataNotFoundException.class);
assertEquals(test.findValue(ID3), Optional.empty());
assertEquals(test.getIds(), ImmutableSet.of(ID1, ID2));
assertEquals(test.findIds(ID1.getMarketDataName()), ImmutableSet.of(ID1));
assertEquals(test.findIds(new TestingName("Foo")), ImmutableSet.of());
assertEquals(test.getTimeSeries(ID4), LocalDateDoubleTimeSeries.empty());
assertEquals(test.getTimeSeries(ID5), LocalDateDoubleTimeSeries.empty());
}
public void test_of_3arg() {
Map<MarketDataId<?>, Object> dataMap = ImmutableMap.of(ID1, VAL1);
Map<ObservableId, LocalDateDoubleTimeSeries> tsMap = ImmutableMap.of(ID5, TIME_SERIES);
MarketData test = MarketData.of(VAL_DATE, dataMap, tsMap);
assertEquals(test.containsValue(ID1), true);
assertEquals(test.getValue(ID1), VAL1);
assertEquals(test.findValue(ID1), Optional.of(VAL1));
assertEquals(test.containsValue(ID2), false);
assertThrows(() -> test.getValue(ID2), MarketDataNotFoundException.class);
assertEquals(test.findValue(ID2), Optional.empty());
assertEquals(test.getIds(), ImmutableSet.of(ID1));
assertEquals(test.getTimeSeries(ID4), LocalDateDoubleTimeSeries.empty());
assertEquals(test.getTimeSeries(ID5), TIME_SERIES);
}
public void empty() {
MarketData test = MarketData.empty(VAL_DATE);
assertEquals(test.containsValue(ID1), false);
assertEquals(test.getIds(), ImmutableSet.of());
assertEquals(test.getTimeSeries(ID4), LocalDateDoubleTimeSeries.empty());
}
//-------------------------------------------------------------------------
public void test_builder() {
ImmutableMarketData test = ImmutableMarketData.builder(VAL_DATE.plusDays(1))
.valuationDate(VAL_DATE)
.addValue(ID1, "123")
.addValueMap(ImmutableMap.of(ID3, "201"))
.addTimeSeries(ID4, TIME_SERIES)
.build();
assertEquals(test.getValuationDate(), VAL_DATE);
assertEquals(test.getValues().get(ID1), "123");
assertEquals(test.getIds(), ImmutableSet.of(ID1, ID3));
assertEquals(test.getTimeSeries().get(ID4), TIME_SERIES);
}
public void test_of_badType() {
Map<MarketDataId<?>, Object> dataMap = ImmutableMap.of(ID1, 123d);
assertThrows(() -> MarketData.of(VAL_DATE, dataMap), ClassCastException.class);
}
public void test_of_null() {
Map<MarketDataId<?>, Object> dataMap = new HashMap<>();
dataMap.put(ID1, null);
assertThrowsIllegalArg(() -> MarketData.of(VAL_DATE, dataMap));
}
//-------------------------------------------------------------------------
public void test_defaultMethods() {
MarketData test = new MarketData() {
@Override
public LocalDate getValuationDate() {
return VAL_DATE;
}
@Override
public LocalDateDoubleTimeSeries getTimeSeries(ObservableId id) {
return TIME_SERIES;
}
@Override
@SuppressWarnings("unchecked")
public <T> Optional<T> findValue(MarketDataId<T> id) {
return id.equals(ID1) ? Optional.of((T) VAL1) : Optional.empty();
}
@Override
public Set<MarketDataId<?>> getIds() {
return ImmutableSet.of();
}
@Override
public <T> Set<MarketDataId<T>> findIds(MarketDataName<T> name) {
return ImmutableSet.of();
}
@Override
public Set<ObservableId> getTimeSeriesIds() {
return ImmutableSet.of();
}
};
assertEquals(test.getValuationDate(), VAL_DATE);
assertEquals(test.containsValue(ID1), true);
assertEquals(test.containsValue(ID2), false);
assertEquals(test.getValue(ID1), VAL1);
assertThrows(() -> test.getValue(ID2), MarketDataNotFoundException.class);
assertEquals(test.findValue(ID1), Optional.of(VAL1));
assertEquals(test.findValue(ID2), Optional.empty());
}
//-------------------------------------------------------------------------
public void test_combinedWith_noClash() {
Map<MarketDataId<?>, Object> dataMap1 = ImmutableMap.of(ID1, VAL1);
MarketData test1 = MarketData.of(VAL_DATE, dataMap1);
Map<MarketDataId<?>, Object> dataMap2 = ImmutableMap.of(ID2, VAL2);
MarketData test2 = MarketData.of(VAL_DATE, dataMap2);
MarketData test = test1.combinedWith(test2);
assertEquals(test.getValue(ID1), VAL1);
assertEquals(test.getValue(ID2), VAL2);
assertEquals(test.getIds(), ImmutableSet.of(ID1, ID2));
}
public void test_combinedWith_noClashSame() {
Map<MarketDataId<?>, Object> dataMap1 = ImmutableMap.of(ID1, VAL1);
MarketData test1 = MarketData.of(VAL_DATE, dataMap1);
Map<MarketDataId<?>, Object> dataMap2 = ImmutableMap.of(ID1, VAL1, ID2, VAL2);
MarketData test2 = MarketData.of(VAL_DATE, dataMap2);
MarketData test = test1.combinedWith(test2);
assertEquals(test.getValue(ID1), VAL1);
assertEquals(test.getValue(ID2), VAL2);
assertEquals(test.getIds(), ImmutableSet.of(ID1, ID2));
}
public void test_combinedWith_clash() {
Map<MarketDataId<?>, Object> dataMap1 = ImmutableMap.of(ID1, VAL1);
MarketData test1 = MarketData.of(VAL_DATE, dataMap1);
Map<MarketDataId<?>, Object> dataMap2 = ImmutableMap.of(ID1, VAL3);
MarketData test2 = MarketData.of(VAL_DATE, dataMap2);
MarketData combined = test1.combinedWith(test2);
assertEquals(combined.getValue(ID1), VAL1);
assertEquals(combined.getIds(), ImmutableSet.of(ID1));
}
public void test_combinedWith_dateMismatch() {
Map<MarketDataId<?>, Object> dataMap1 = ImmutableMap.of(ID1, VAL1);
MarketData test1 = MarketData.of(VAL_DATE, dataMap1);
Map<MarketDataId<?>, Object> dataMap2 = ImmutableMap.of(ID1, VAL3);
MarketData test2 = MarketData.of(VAL_DATE.plusDays(1), dataMap2);
assertThrowsIllegalArg(() -> test1.combinedWith(test2));
}
/**
* Tests the combinedWith method when the MarketData instances are not both ImmutableMarketData.
*/
public void test_combinedWith_differentTypes() {
Map<MarketDataId<?>, Object> dataMap1 = ImmutableMap.of(ID1, VAL1, ID2, VAL2);
MarketData test1 = MarketData.of(VAL_DATE, dataMap1);
Map<MarketDataId<?>, Object> dataMap2 = ImmutableMap.of(ID1, VAL1);
MarketData test2 = MarketData.of(VAL_DATE, dataMap2);
ExtendedMarketData<String> test3 = ExtendedMarketData.of(ID1, VAL3, test2);
MarketData test = test3.combinedWith(test1);
assertEquals(test.getValue(ID1), VAL3);
assertEquals(test.getValue(ID2), VAL2);
assertEquals(test.getIds(), ImmutableSet.of(ID1, ID2));
}
//-------------------------------------------------------------------------
public void test_withValue() {
Map<MarketDataId<?>, Object> dataMap = ImmutableMap.of(ID1, VAL1);
MarketData test = MarketData.of(VAL_DATE, dataMap).withValue(ID1, VAL3);
assertEquals(test.getValue(ID1), VAL3);
}
//-------------------------------------------------------------------------
public void coverage() {
Map<MarketDataId<?>, Object> dataMap = ImmutableMap.of(ID1, VAL1);
ImmutableMarketData test = ImmutableMarketData.of(VAL_DATE, dataMap);
coverImmutableBean(test);
Map<MarketDataId<?>, Object> dataMap2 = ImmutableMap.of(ID2, VAL2);
ImmutableMarketData test2 = ImmutableMarketData.of(VAL_DATE.minusDays(1), dataMap2);
coverBeanEquals(test, test2);
}
public void test_serialization() {
Map<MarketDataId<?>, Object> dataMap = ImmutableMap.of(ID1, VAL1);
MarketData test = MarketData.of(VAL_DATE, dataMap);
assertSerialization(test);
}
}