/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.view.cycle;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Collections;
import java.util.Set;
import org.fudgemsg.FudgeContext;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.cache.InMemoryViewComputationCacheSource;
import com.opengamma.engine.cache.ViewComputationCache;
import com.opengamma.engine.depgraph.DependencyGraph;
import com.opengamma.engine.depgraph.DependencyGraphExplorer;
import com.opengamma.engine.depgraph.DependencyNode;
import com.opengamma.engine.depgraph.builder.TestDependencyGraphBuilder;
import com.opengamma.engine.depgraph.builder.TestDependencyGraphBuilder.NodeBuilder;
import com.opengamma.engine.depgraph.impl.DependencyGraphExplorerImpl;
import com.opengamma.engine.depgraph.impl.DependencyGraphImpl;
import com.opengamma.engine.depgraph.impl.DependencyNodeFunctionImpl;
import com.opengamma.engine.function.EmptyFunctionParameters;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.MarketDataSourcingFunction;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ComputedValue;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.id.UniqueId;
import com.opengamma.util.test.TestGroup;
/**
*
*/
@Test(groups = TestGroup.UNIT)
public class LiveDataDeltaCalculatorTest {
FunctionCompilationContext _context = new FunctionCompilationContext();
DependencyGraph _graph;
DependencyNode[] _node = new DependencyNode[5];
ValueSpecification[] _value = new ValueSpecification[_node.length];
ViewComputationCache _cache;
ViewComputationCache _previousCache;
@BeforeMethod
public void setUp() {
createTestGraph();
final InMemoryViewComputationCacheSource source = new InMemoryViewComputationCacheSource(FudgeContext.GLOBAL_DEFAULT);
_cache = source.getCache(UniqueId.of("Test", "ViewCycle", "1"), "Default");
_previousCache = source.getCache(UniqueId.of("Test", "ViewCycle", "0"), "Default");
}
private LiveDataDeltaCalculator deltaCalculator() {
return deltaCalculator(Collections.<ValueSpecification>emptySet());
}
private LiveDataDeltaCalculator deltaCalculator(final Set<ValueSpecification> dirtySpecifications) {
return new LiveDataDeltaCalculator(_graph, _cache, _previousCache, dirtySpecifications);
}
private ComputationTargetSpecification getTarget(final String name) {
return new ComputationTargetSpecification(ComputationTargetType.PRIMITIVE, UniqueId.of("testdomain", name));
}
private void put(final ViewComputationCache cache, final int id, final Object value) {
cache.putSharedValue(new ComputedValue(_value[id], value));
}
/**
* Creates the test graph (data flows downwards - 0 & 1 are market data nodes)
*
* <pre>
* 0 1
* \ / \
* 2 3
* \ /
* 4
* </pre>
*/
private void createTestGraph() {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("test");
NodeBuilder n0 = gb.addNode(MarketDataSourcingFunction.INSTANCE, getTarget("Node0"));
NodeBuilder n1 = gb.addNode(MarketDataSourcingFunction.INSTANCE, getTarget("Node1"));
NodeBuilder n2 = gb.addNode(DependencyNodeFunctionImpl.of("Mock", EmptyFunctionParameters.INSTANCE), getTarget("Node2"));
NodeBuilder n3 = gb.addNode(DependencyNodeFunctionImpl.of("Mock", EmptyFunctionParameters.INSTANCE), getTarget("Node3"));
NodeBuilder n4 = gb.addNode(DependencyNodeFunctionImpl.of("Mock", EmptyFunctionParameters.INSTANCE), getTarget("Node4"));
_value[0] = n0.addOutput("MarketValue");
n2.addInput(_value[0]);
_value[1] = n1.addOutput("MarketValue");
n2.addInput(_value[1]);
n3.addInput(_value[1]);
_value[2] = n2.addOutput("IntermediateValue");
n4.addInput(_value[2]);
_value[3] = n3.addOutput("IntermediateValue");
n4.addInput(_value[3]);
_value[4] = n4.addTerminalOutput("TerminalValue");
_graph = gb.buildGraph();
final DependencyGraphExplorer dge = new DependencyGraphExplorerImpl(_graph);
for (int i = 0; i < _value.length; i++) {
_node[i] = dge.getNodeProducing(_value[i]);
}
}
public void noChangeA() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator();
put(_cache, 0, 6.0);
put(_previousCache, 0, 6.0);
deltaCalculator.computeDelta();
assertEquals(ImmutableSet.copyOf(DependencyGraphImpl.getDependencyNodes(_graph)), deltaCalculator.getUnchangedNodes());
assertEquals(Collections.emptySet(), deltaCalculator.getChangedNodes());
}
public void noChangeB() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator();
put(_cache, 1, 6.0);
put(_previousCache, 1, 6.0);
deltaCalculator.computeDelta();
assertEquals(ImmutableSet.copyOf(DependencyGraphImpl.getDependencyNodes(_graph)), deltaCalculator.getUnchangedNodes());
assertEquals(Collections.emptySet(), deltaCalculator.getChangedNodes());
}
public void noChangeC() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator();
put(_cache, 2, 6.0);
put(_previousCache, 2, 6.0);
deltaCalculator.computeDelta();
assertEquals(ImmutableSet.copyOf(DependencyGraphImpl.getDependencyNodes(_graph)), deltaCalculator.getUnchangedNodes());
assertEquals(Collections.emptySet(), deltaCalculator.getChangedNodes());
}
public void changeA() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator();
put(_cache, 0, 6.0);
put(_previousCache, 0, 7.0);
deltaCalculator.computeDelta();
assertEquals(Sets.newHashSet(_node[1], _node[3]), deltaCalculator.getUnchangedNodes());
assertEquals(Sets.newHashSet(_node[0], _node[2], _node[4]), deltaCalculator.getChangedNodes());
}
public void changeB() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator();
put(_cache, 1, 6.0);
put(_previousCache, 1, 7.0);
deltaCalculator.computeDelta();
assertEquals(Sets.newHashSet(_node[0]), deltaCalculator.getUnchangedNodes());
assertEquals(Sets.newHashSet(_node[1], _node[2], _node[3], _node[4]), deltaCalculator.getChangedNodes());
}
public void changeC() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator();
put(_cache, 2, 6.0);
put(_previousCache, 2, 7.0);
deltaCalculator.computeDelta();
assertEquals(ImmutableSet.copyOf(DependencyGraphImpl.getDependencyNodes(_graph)), deltaCalculator.getUnchangedNodes());
assertEquals(Collections.emptySet(), deltaCalculator.getChangedNodes());
}
public void parameterChangeA() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator(Collections.singleton(_value[2]));
deltaCalculator.computeDelta();
assertEquals(Sets.newHashSet(_node[0], _node[1], _node[3]), deltaCalculator.getUnchangedNodes());
assertEquals(Sets.newHashSet(_node[2], _node[4]), deltaCalculator.getChangedNodes());
}
public void parameterChangeB() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator(Collections.singleton(_value[3]));
deltaCalculator.computeDelta();
assertEquals(Sets.newHashSet(_node[0], _node[1], _node[2]), deltaCalculator.getUnchangedNodes());
assertEquals(Sets.newHashSet(_node[3], _node[4]), deltaCalculator.getChangedNodes());
}
public void parameterChangeC() {
final LiveDataDeltaCalculator deltaCalculator = deltaCalculator(Collections.singleton(_value[4]));
deltaCalculator.computeDelta();
assertEquals(Sets.newHashSet(_node[0], _node[1], _node[2], _node[3]), deltaCalculator.getUnchangedNodes());
assertEquals(Sets.newHashSet(_node[4]), deltaCalculator.getChangedNodes());
}
}