/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.depgraph.impl; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import java.util.HashSet; import java.util.Set; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.depgraph.DependencyGraph; 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.target.ComputationTargetType; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.engine.view.compilation.InvalidTargetDependencyNodeFilter; import com.opengamma.id.UniqueId; import com.opengamma.util.test.TestGroup; /** * Unit test for the {@link RootDiscardingSubgrapher} class. */ @Test(groups = TestGroup.UNIT) public class RootDiscardingSubgrapherTest { private UniqueId id(final int id) { return UniqueId.of("Test", Integer.toString(id)); } private ComputationTargetSpecification target(final int id) { return new ComputationTargetSpecification(ComputationTargetType.PRIMITIVE, id(id)); } private ValueRequirement req(final int id) { return new ValueRequirement("V", target(id)); } private NodeBuilder node(final TestDependencyGraphBuilder builder, final int id) { return builder.addNode("F", target(id)); } /** * Creates a graph of the form: * * <pre> * N1 -> N2* * </pre> */ private DependencyGraph smallGraph() { final TestDependencyGraphBuilder builder = new TestDependencyGraphBuilder("small"); NodeBuilder nb = node(builder, 1); final ValueSpecification v1 = nb.addOutput("V"); nb = node(builder, 2); nb.addInput(v1); nb.addTerminalOutput("V"); return builder.buildGraph(); } /** * Creates a graph of the form: * * <pre> * N1 ---> N4*------- * \ * N2 ---> N5 \ > N8* * \ N7*---/ * -> / * N3 ---> N6 * </pre> */ private DependencyGraph largeGraph() { final TestDependencyGraphBuilder builder = new TestDependencyGraphBuilder("large"); NodeBuilder nb = node(builder, 1); final ValueSpecification v1 = nb.addOutput("V"); nb = node(builder, 2); final ValueSpecification v2 = nb.addOutput("V"); nb = node(builder, 3); final ValueSpecification v3 = nb.addOutput("V"); nb = node(builder, 4); nb.addInput(v1); final ValueSpecification v4 = nb.addTerminalOutput("V"); nb = node(builder, 5); nb.addInput(v2); final ValueSpecification v5 = nb.addOutput("V"); nb = node(builder, 6); nb.addInput(v2); nb.addInput(v3); final ValueSpecification v6 = nb.addOutput("V"); nb = node(builder, 7); nb.addInput(v5); nb.addInput(v6); final ValueSpecification v7 = nb.addTerminalOutput("V"); nb = node(builder, 8); nb.addInput(v4); nb.addInput(v7); nb.addTerminalOutput("V"); return builder.buildGraph(); } public void testReturnSameGraph() { final RootDiscardingSubgrapher filter = new RootDiscardingSubgrapher() { @Override public boolean acceptNode(final DependencyNode node) { return true; } }; DependencyGraph graph = smallGraph(); assertSame(filter.subGraph(graph, null), graph); graph = largeGraph(); assertSame(filter.subGraph(graph, null), graph); graph = smallGraph(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), null), DependencyGraphImpl.getRootNodes(graph)); graph = largeGraph(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), null), DependencyGraphImpl.getRootNodes(graph)); } public void testReturnEmptyGraph() { final RootDiscardingSubgrapher filter = new RootDiscardingSubgrapher() { @Override public boolean acceptNode(final DependencyNode node) { return false; } }; assertNull(filter.subGraph(smallGraph(), null)); assertNull(filter.subGraph(largeGraph(), null)); DependencyGraph graph = smallGraph(); assertNull(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), null)); graph = largeGraph(); assertNull(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), null)); } public void testLeafNode1() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(1))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); assertEquals(filter.subGraph(largeGraph(), missing).getSize(), 5); assertEquals(missing, ImmutableSet.of(req(4), req(8))); } public void testLeafNode2() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(2))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); assertEquals(filter.subGraph(largeGraph(), missing).getSize(), 3); assertEquals(missing, ImmutableSet.of(req(7), req(8))); missing.clear(); assertEquals(filter.subGraph(smallGraph(), missing).getSize(), 1); assertEquals(missing, ImmutableSet.of(req(2))); missing.clear(); DependencyGraph graph = largeGraph(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 2); assertEquals(missing, ImmutableSet.of(req(7), req(8))); missing.clear(); graph = smallGraph(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 1); assertEquals(missing, ImmutableSet.of(req(2))); } public void testLeafNode3() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(3))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); final DependencyGraph graph = largeGraph(); assertEquals(filter.subGraph(graph, missing).getSize(), 4); assertEquals(missing, ImmutableSet.of(req(7), req(8))); missing.clear(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 2); assertEquals(missing, ImmutableSet.of(req(7), req(8))); } public void testLeafNodes1and3() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(1), id(3))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); final DependencyGraph graph = largeGraph(); assertEquals(filter.subGraph(graph, missing).getSize(), 2); assertEquals(missing, ImmutableSet.of(req(4), req(7), req(8))); missing.clear(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 1); assertEquals(missing, ImmutableSet.of(req(4), req(7), req(8))); } public void testMiddleNode() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(5))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); final DependencyGraph graph = largeGraph(); assertEquals(filter.subGraph(graph, missing).getSize(), 5); assertEquals(missing, ImmutableSet.of(req(7), req(8))); missing.clear(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 2); assertEquals(missing, ImmutableSet.of(req(7), req(8))); } public void testRootNode() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(8))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); final DependencyGraph graph = largeGraph(); assertEquals(filter.subGraph(graph, missing).getSize(), 7); assertEquals(missing, ImmutableSet.of(req(8))); missing.clear(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 2); assertEquals(missing, ImmutableSet.of(req(8))); } public void testRootAndLeafNode3() { final RootDiscardingSubgrapher filter = new InvalidTargetDependencyNodeFilter(ImmutableSet.of(id(3), id(8))); final Set<ValueRequirement> missing = new HashSet<ValueRequirement>(); final DependencyGraph graph = largeGraph(); assertEquals(filter.subGraph(graph, missing).getSize(), 4); assertEquals(missing, ImmutableSet.of(req(7), req(8))); missing.clear(); assertEquals(filter.subGraph(DependencyGraphImpl.getRootNodes(graph), graph.getTerminalOutputs(), missing).size(), 2); assertEquals(missing, ImmutableSet.of(req(7), req(8))); } }