/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.depgraph;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Collection;
import org.apache.commons.lang.ObjectUtils;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.common.collect.Sets;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.MarketDataSourcingFunction;
import com.opengamma.engine.test.MockFunction;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.util.test.TestGroup;
/**
* Tests the dependency graph building with trivial constructions.
*/
@Test(groups = TestGroup.UNIT)
public class DepGraphBasicTest extends AbstractDependencyGraphBuilderTest {
public void singleOutputSingleFunctionNode() {
DepGraphTestHelper helper = helper();
MockFunction function = helper.addFunctionProducing1and2();
DependencyGraphBuilder builder = helper.createBuilder(null);
builder.addTarget(Sets.newHashSet(helper.getRequirement1()));
DependencyGraph graph = builder.getDependencyGraph();
assertNotNull(graph);
assertTrue(graph.getOutputSpecifications().contains(helper.getSpec1()));
assertTrue(graph.getOutputSpecifications().contains(helper.getSpec2()));
Collection<DependencyNode> nodes = graph.getDependencyNodes();
assertNotNull(nodes);
assertEquals(1, nodes.size());
DependencyNode node = nodes.iterator().next();
assertEquals(function, node.getFunction().getFunction());
assertEquals(function.getDefaultParameters(), node.getFunction().getParameters());
assertTrue(node.getOutputValues().contains(helper.getSpec1()));
assertTrue(node.getOutputValues().contains(helper.getSpec2()));
assertTrue(node.getInputNodes().isEmpty());
assertEquals(helper.getTarget().toSpecification(), node.getComputationTarget());
graph.removeUnnecessaryValues();
nodes = graph.getDependencyNodes();
assertNotNull(nodes);
assertEquals(1, nodes.size());
node = nodes.iterator().next();
assertEquals(function, node.getFunction().getFunction());
assertEquals(function.getDefaultParameters(), node.getFunction().getParameters());
assertTrue(node.getOutputValues().contains(helper.getSpec1()));
assertFalse(node.getOutputValues().contains(helper.getSpec2()));
assertTrue(node.getInputNodes().isEmpty());
}
/**
* When you have multiple requirements produced by the same function, should only have a single node using that function.
*/
public void multipleOutputsSingleFunctionNode() {
DepGraphTestHelper helper = helper();
MockFunction function = helper.addFunctionProducing1and2();
DependencyGraphBuilder builder = helper.createBuilder(null);
builder.addTarget(Sets.newHashSet(helper.getRequirement1()));
builder.addTarget(Sets.newHashSet(helper.getRequirement2()));
DependencyGraph graph = builder.getDependencyGraph();
assertNotNull(graph);
Collection<DependencyNode> nodes = graph.getDependencyNodes();
assertNotNull(nodes);
assertEquals(1, nodes.size());
DependencyNode node = nodes.iterator().next();
assertEquals(function, node.getFunction().getFunction());
assertEquals(function.getDefaultParameters(), node.getFunction().getParameters());
assertTrue(node.getOutputValues().contains(helper.getSpec1()));
assertTrue(node.getOutputValues().contains(helper.getSpec2()));
assertTrue(node.getInputNodes().isEmpty());
}
public void unsatisfiableDependency() {
DepGraphTestHelper helper = helper();
helper.addFunctionProducing1and2();
ValueRequirement anotherReq = new ValueRequirement("Req-3", helper.getTarget().toSpecification());
DependencyGraphBuilder builder = helper.createBuilder(null);
expectCompletion(builder, builder.getContext().resolveRequirement(helper.getRequirement1(), null, null));
expectFailure(builder, builder.getContext().resolveRequirement(anotherReq, null, null));
}
public void doubleLevelNoLiveData() {
DepGraphTestHelper helper = helper();
MockFunction fn1 = helper.addFunctionRequiring2Producing1();
MockFunction fn2 = helper.addFunctionProducing2();
DependencyGraphBuilder builder = helper.createBuilder(null);
builder.addTarget(helper.getRequirement1());
DependencyGraph graph = builder.getDependencyGraph();
assertNotNull(graph);
graph.removeUnnecessaryValues();
assertTrue(graph.getOutputSpecifications().contains(helper.getSpec1()));
assertTrue(graph.getOutputSpecifications().contains(helper.getSpec2()));
Collection<DependencyNode> nodes = graph.getDependencyNodes();
assertNotNull(nodes);
assertEquals(2, nodes.size());
for (DependencyNode node : nodes) {
if (ObjectUtils.equals(node.getFunction().getFunction(), fn1)) {
assertTrue(node.getOutputValues().contains(helper.getSpec1()));
assertFalse(node.getOutputValues().contains(helper.getSpec2()));
assertTrue(node.getInputValues().contains(helper.getSpec2()));
assertEquals(1, node.getInputNodes().size());
assertEquals(helper.getTarget().toSpecification(), node.getComputationTarget());
} else if (ObjectUtils.equals(node.getFunction().getFunction(), fn2)) {
assertFalse(node.getOutputValues().contains(helper.getSpec1()));
assertTrue(node.getOutputValues().contains(helper.getSpec2()));
assertTrue(node.getInputValues().isEmpty());
assertTrue(node.getInputNodes().isEmpty());
} else {
Assert.fail("Unexpected function definition");
}
}
}
public void doubleLevelLiveData() {
DepGraphTestHelper helper = helper();
MockFunction fn1 = helper.addFunctionRequiring2Producing1();
helper.make2AvailableFromLiveData();
DependencyGraphBuilder builder = helper.createBuilder(null);
builder.addTarget(helper.getRequirement1());
DependencyGraph graph = builder.getDependencyGraph();
assertNotNull(graph);
graph.removeUnnecessaryValues();
assertTrue(graph.getOutputSpecifications().contains(helper.getSpec1()));
Collection<DependencyNode> nodes = graph.getDependencyNodes();
assertNotNull(nodes);
assertEquals(2, nodes.size());
for (DependencyNode node : nodes) {
if (ObjectUtils.equals(node.getFunction().getFunction(), fn1)) {
assertTrue(node.getOutputValues().contains(helper.getSpec1()));
assertEquals(1, node.getInputNodes().size());
ValueSpecification inputSpec = node.getInputValues().iterator().next();
assertEquals(helper.getSpec2().getValueName(), inputSpec.getValueName());
assertEquals(helper.getSpec2().getTargetSpecification(), inputSpec.getTargetSpecification());
assertEquals(helper.getTarget().toSpecification(), node.getComputationTarget());
} else if (node.getFunction().getFunction() instanceof MarketDataSourcingFunction) {
assertFalse(node.getOutputValues().contains(helper.getSpec1()));
assertEquals(1, node.getOutputValues().size());
ValueSpecification outputSpec = node.getOutputValues().iterator().next();
assertEquals(helper.getSpec2().getValueName(), outputSpec.getValueName());
assertEquals(helper.getSpec2().getTargetSpecification(), outputSpec.getTargetSpecification());
assertTrue(node.getInputValues().isEmpty());
assertTrue(node.getInputNodes().isEmpty());
} else {
Assert.fail("Unexpected function definition");
}
}
}
public void incrementalBuild() {
final DepGraphTestHelper helper = helper();
helper.addFunctionRequiring2Producing1();
helper.addFunctionProducing2();
DependencyGraphBuilder builder = helper.createBuilder(null);
builder.setDependencyGraph(new DependencyGraph("DEFAULT"));
builder.addTarget(helper.getRequirement2());
final DependencyGraph graph1 = builder.getDependencyGraph();
assertNotNull(graph1);
assertEquals(1, graph1.getDependencyNodes().size());
builder = helper.createBuilder(null);
builder.setDependencyGraph(graph1);
builder.addTarget(helper.getRequirement1());
final DependencyGraph graph2 = builder.getDependencyGraph();
assertNotNull(graph2);
final Collection<DependencyNode> graph2Nodes = graph2.getDependencyNodes();
assertEquals(2, graph2Nodes.size());
assertTrue(graph2Nodes.containsAll(graph1.getDependencyNodes()));
builder = helper.createBuilder(null);
for (DependencyNode node : graph2Nodes) {
new DependencyNode(ComputationTarget.NULL).addInputNode(node);
if (node.getOutputValues().contains(helper.getSpec1())) {
assertEquals(1, node.getDependentNodes().size());
} else {
assertEquals(2, node.getDependentNodes().size());
}
}
// graph2 is now a subgraph of a larger graph containing two more nodes
builder.setDependencyGraph(graph2);
builder.addTarget(helper.getRequirement2Foo());
final DependencyGraph graph3 = builder.getDependencyGraph();
assertNotNull(graph3);
assertEquals(2, graph3.getDependencyNodes().size());
assertEquals(graph2.getDependencyNodes(), graph3.getDependencyNodes());
// the build should have modified the supplied nodes
for (DependencyNode node : graph2Nodes) {
if (node.getOutputValues().contains(helper.getSpec1())) {
assertEquals(0, node.getDependentNodes().size());
} else {
assertEquals(1, node.getDependentNodes().size());
}
}
}
}