com.opengamma.engine.depgraph.DepGraphBasicTest.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.engine.depgraph.DepGraphBasicTest.java

Source

/**
 * 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());
            }
        }
    }

}