/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.engine;
import static com.opengamma.sesame.config.ConfigBuilder.column;
import static com.opengamma.sesame.config.ConfigBuilder.configureView;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Set;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZonedDateTime;
import com.codahale.metrics.MetricRegistry;
import com.google.common.base.Optional;
import com.google.common.cache.CacheBuilder;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.MoreExecutors;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.service.ServiceContext;
import com.opengamma.service.ThreadLocalServiceContext;
import com.opengamma.sesame.EngineTestUtils;
import com.opengamma.sesame.Environment;
import com.opengamma.sesame.cache.NoOpCacheInvalidator;
import com.opengamma.sesame.config.FunctionModelConfig;
import com.opengamma.sesame.config.ViewConfig;
import com.opengamma.sesame.function.AvailableImplementationsImpl;
import com.opengamma.sesame.function.AvailableOutputsImpl;
import com.opengamma.sesame.function.Output;
import com.opengamma.sesame.graph.FunctionBuilder;
import com.opengamma.sesame.marketdata.MarketDataEnvironment;
import com.opengamma.sesame.marketdata.MarketDataEnvironmentBuilder;
import com.opengamma.sesame.marketdata.MarketDataRequirement;
import com.opengamma.sesame.marketdata.RawId;
import com.opengamma.sesame.marketdata.SingleValueRequirement;
import com.opengamma.sesame.marketdata.TimeSeriesRequirement;
import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.LocalDateRange;
@Test(groups = TestGroup.UNIT)
public class ViewTest {
private static final String FOO = "Foo";
private static final RawId<Double> ID1 = RawId.of(ExternalIdBundle.of("s", "1"));
private static final RawId<Double> ID2 = RawId.of(ExternalIdBundle.of("s", "2"));
private static final RawId<Double> ID3 = RawId.of(ExternalIdBundle.of("s", "3"));
private static final LocalDateRange DATE_RANGE1 =
LocalDateRange.of(
LocalDate.of(2011, 3, 8),
LocalDate.of(2012, 3, 7),
true);
private static final LocalDateRange DATE_RANGE2 =
LocalDateRange.of(
LocalDate.of(2010, 4, 8),
LocalDate.of(2013, 6, 7),
true);
@BeforeMethod
public void setUp() throws Exception {
ThreadLocalServiceContext.init(ServiceContext.of(ImmutableMap.<Class<?>, Object>of()));
}
public void gatherRequirements() {
ViewConfig config = configureView("test view", column(FOO));
View view = view(config);
CalculationArguments calculationArguments = CalculationArguments.builder().valuationTime(ZonedDateTime.now()).build();
Set<MarketDataRequirement> requirements =
view.gatherRequirements(
MarketDataEnvironmentBuilder.empty(),
calculationArguments,
ImmutableList.of("a string"));
ImmutableSet<? extends MarketDataRequirement> expected =
ImmutableSet.of(
SingleValueRequirement.of(ID1),
TimeSeriesRequirement.of(ID2, DATE_RANGE1),
TimeSeriesRequirement.of(ID3, DATE_RANGE2));
assertEquals(expected, requirements);
}
public void gatherRequirementsWithSuppliedData() {
ViewConfig config = configureView("test view", column(FOO));
View view = view(config);
ZonedDateTime valuationTime = ZonedDateTime.now();
CalculationArguments calculationArguments = CalculationArguments.builder().valuationTime(valuationTime).build();
// this satisfies the requirement in the function
LocalDateDoubleTimeSeries timeSeries1 =
ImmutableLocalDateDoubleTimeSeries.builder()
.put(DATE_RANGE1.getStartDateInclusive(), 1d)
.put(DATE_RANGE1.getEndDateInclusive(), 2d)
.build();
// This shouldn't satisfy the requirement in the function because the date range is different but it does
// See the comment in MapMarketDataBundle.get(id, type, dateRange) and PLT-633
LocalDateDoubleTimeSeries timeSeries2 =
ImmutableLocalDateDoubleTimeSeries.builder()
.put(DATE_RANGE2.getStartDateInclusive(), 1d)
.put(DATE_RANGE2.getEndDateInclusive().minusDays(1), 2d)
.build();
MarketDataEnvironment suppliedData =
new MarketDataEnvironmentBuilder()
.add(ID1, 1d)
.add(ID2, timeSeries1)
.add(ID3, timeSeries2)
.valuationTime(valuationTime)
.build();
Set<MarketDataRequirement> requirements =
view.gatherRequirements(
suppliedData,
calculationArguments,
ImmutableList.of("a string"));
ImmutableSet<? extends MarketDataRequirement> expected = ImmutableSet.of();
// this should be the correct behaviour but currently isn't because of PLT-633
//ImmutableSet<? extends MarketDataRequirement> expected = ImmutableSet.of(TimeSeriesRequirement.of(ID3, DATE_RANGE2));
assertEquals(expected, requirements);
}
private static View view(ViewConfig config) {
ImmutableSet<Class<?>> inputTypes = ImmutableSet.<Class<?>>of(String.class);
AvailableOutputsImpl availableOutputs = new AvailableOutputsImpl(inputTypes);
availableOutputs.register(Fn1.class);
AvailableImplementationsImpl availableImplementations = new AvailableImplementationsImpl();
availableImplementations.register(Impl1.class, Impl2.class);
return new View(
config,
MoreExecutors.sameThreadExecutor(),
FunctionModelConfig.EMPTY,
new FunctionBuilder(),
FunctionService.NONE,
ComponentMap.EMPTY,
inputTypes,
availableOutputs,
availableImplementations,
EngineTestUtils.createCacheProvider(),
CacheBuilder.newBuilder(),
new NoOpCacheInvalidator(),
Optional.<MetricRegistry>absent()
);
}
public interface Fn1 {
@Output(FOO)
Object foo(Environment env, String s);
}
public static class Impl1 implements Fn1 {
private final Fn2 _fn2;
public Impl1(Fn2 fn2) {
_fn2 = fn2;
}
@Override
public Object foo(Environment env, String s) {
env.getMarketDataBundle().get(ID1, Double.class);
return _fn2.bar(env);
}
}
public interface Fn2 {
String bar(Environment env);
}
public static class Impl2 implements Fn2 {
@Override
public String bar(Environment env) {
env.getMarketDataBundle().get(ID2, Double.class, DATE_RANGE1);
env.getMarketDataBundle().get(ID3, Double.class, DATE_RANGE2);
return "BAR";
}
}
}