/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.view.compilation;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Arrays;
import java.util.concurrent.ConcurrentHashMap;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.depgraph.DependencyGraph;
import com.opengamma.engine.depgraph.builder.TestDependencyGraphBuilder;
import com.opengamma.engine.function.CompiledFunctionDefinition;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.resolver.CompiledFunctionResolver;
import com.opengamma.engine.target.ComputationTargetReference;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.test.TestGroup;
/**
* Tests {@link CompiledViewDefinitionWithGraphsImpl}.
*/
@Test(groups = TestGroup.UNIT)
public class CompiledViewDefinitionTest {
private final Instant _time0 = Instant.now();
private final Instant _time1 = _time0.plusMillis(1);
private final Instant _time2 = _time0.plusMillis(2);
private final Instant _time3 = _time0.plusMillis(3);
private final Instant _time4 = _time0.plusMillis(4);
private final Instant _time5 = _time0.plusMillis(5);
private void createDependencyNode(final TestDependencyGraphBuilder builder, final Instant functionStart, final Instant functionEnd) {
final String function;
if (functionStart != null) {
assert functionEnd == null;
function = "start" + functionStart.toString();
} else if (functionEnd != null) {
function = "end" + functionEnd.toString();
} else {
function = "foo";
}
builder.addNode(function, ComputationTargetSpecification.NULL);
}
private DependencyGraph graphNoStartEndTimes() {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("no start/end");
createDependencyNode(gb, null, null);
createDependencyNode(gb, null, null);
return gb.buildGraph();
}
private DependencyGraph graphOneEndTime(final Instant end) {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("one end");
createDependencyNode(gb, null, null);
createDependencyNode(gb, null, end);
return gb.buildGraph();
}
private DependencyGraph graphTwoEndTimes(final Instant end1, final Instant end2) {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("two ends");
createDependencyNode(gb, null, null);
createDependencyNode(gb, null, end1);
createDependencyNode(gb, null, end2);
return gb.buildGraph();
}
private DependencyGraph graphOneStartTime(final Instant start) {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("one start");
createDependencyNode(gb, null, null);
createDependencyNode(gb, start, null);
return gb.buildGraph();
}
private DependencyGraph graphTwoStartTimes(final Instant start1, final Instant start2) {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("two starts");
createDependencyNode(gb, null, null);
createDependencyNode(gb, start1, null);
createDependencyNode(gb, start2, null);
return gb.buildGraph();
}
private CompiledViewDefinitionWithGraphsImpl buildCompiledViewDefinition(final DependencyGraph... graphs) {
final CompiledFunctionResolver compiledResolver = mock(CompiledFunctionResolver.class);
when(compiledResolver.getFunction(Mockito.<String>any())).thenAnswer(new Answer<CompiledFunctionDefinition>() {
@Override
public CompiledFunctionDefinition answer(final InvocationOnMock invocation) throws Throwable {
final CompiledFunctionDefinition cfd = mock(CompiledFunctionDefinition.class);
final String function = (String) invocation.getArguments()[0];
if (function.startsWith("start")) {
final Instant validFrom = Instant.parse(function.substring(5));
when(cfd.getEarliestInvocationTime()).thenReturn(validFrom);
} else if (function.startsWith("end")) {
final Instant validTo = Instant.parse(function.substring(3));
when(cfd.getLatestInvocationTime()).thenReturn(validTo);
}
return cfd;
}
});
final FunctionCompilationContext compilationContext = new FunctionCompilationContext();
compilationContext.setFunctionInitId(0);
final ViewCompilationServices vcs = mock(ViewCompilationServices.class);
when(vcs.getFunctionCompilationContext()).thenReturn(compilationContext);
final ViewCompilationContext context = mock(ViewCompilationContext.class);
when(context.getActiveResolutions()).thenReturn(new ConcurrentHashMap<ComputationTargetReference, UniqueId>());
when(context.getCompiledFunctionResolver()).thenReturn(compiledResolver);
when(context.getResolverVersionCorrection()).thenReturn(VersionCorrection.of(_time0, _time0));
when(context.getServices()).thenReturn(vcs);
when(context.getViewDefinition()).thenReturn(mock(ViewDefinition.class));
return CompiledViewDefinitionWithGraphsImpl.of(context, "", Arrays.asList(graphs), null);
}
@Test
public void testNoValidityTimes() {
final CompiledViewDefinitionWithGraphsImpl model = buildCompiledViewDefinition(graphNoStartEndTimes());
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, Instant.ofEpochMilli(Long.MIN_VALUE)));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, Instant.ofEpochMilli(Long.MAX_VALUE)));
}
@Test
public void testNoStartTime1() {
final CompiledViewDefinitionWithGraphsImpl model = buildCompiledViewDefinition(graphNoStartEndTimes(), graphOneEndTime(_time0), graphTwoEndTimes(_time1, _time2));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, Instant.ofEpochMilli(Long.MIN_VALUE)));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time0));
assertFalse(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time1));
}
@Test
public void testNoStartTime2() {
final CompiledViewDefinitionWithGraphsImpl model = buildCompiledViewDefinition(graphNoStartEndTimes(), graphOneEndTime(_time1), graphTwoEndTimes(_time0, _time2));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, Instant.ofEpochMilli(Long.MIN_VALUE)));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time0));
assertFalse(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time1));
}
@Test
public void testNoEndTime1() {
final CompiledViewDefinitionWithGraphsImpl model = buildCompiledViewDefinition(graphNoStartEndTimes(), graphOneStartTime(_time2), graphTwoStartTimes(_time0, _time1));
assertFalse(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time1));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time2));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, Instant.ofEpochMilli(Long.MAX_VALUE)));
}
@Test
public void testNoEndTime2() {
final CompiledViewDefinitionWithGraphsImpl model = buildCompiledViewDefinition(graphNoStartEndTimes(), graphOneStartTime(_time1), graphTwoStartTimes(_time0, _time2));
assertFalse(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time1));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time2));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, Instant.ofEpochMilli(Long.MAX_VALUE)));
}
@Test
public void testStartEndTime() {
final CompiledViewDefinitionWithGraphsImpl model = buildCompiledViewDefinition(graphNoStartEndTimes(), graphOneStartTime(_time0), graphTwoStartTimes(_time1, _time2),
graphOneEndTime(_time3), graphTwoEndTimes(_time4, _time5));
assertFalse(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time1));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time2));
assertTrue(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time3));
assertFalse(CompiledViewDefinitionWithGraphsImpl.isValidFor(model, _time4));
}
}