/** * 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.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import java.util.Collections; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Test; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.function.CompiledFunctionDefinition; import com.opengamma.engine.function.FunctionCompilationContext; import com.opengamma.engine.function.resolver.FunctionPriority; import com.opengamma.engine.test.MockFunction; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.util.test.TestGroup; import com.opengamma.util.test.TestLifecycle; /** * Tests the dependency graph building under late resolution conditions */ @Test(groups = TestGroup.UNIT) public class DepGraphLateResolutionTest extends AbstractDependencyGraphBuilderTest { private static final Logger s_logger = LoggerFactory.getLogger(DepGraphLateResolutionTest.class); public void backtrackCleanup() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); helper.addFunctionProducing(helper.getValue2Foo()); final MockFunction fn2Bar = helper.addFunctionProducing(helper.getValue2Bar()); final MockFunction fnConv = new MockFunction("conv", helper.getTarget()) { @Override public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target) { final ValueRequirement req = helper.getRequirement1Any(); return Collections.singleton(new ValueSpecification(req.getValueName(), target.toSpecification(), req.getConstraints().copy().with(ValuePropertyNames.FUNCTION, getUniqueId()) .get())); } @Override public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target, Map<ValueSpecification, ValueRequirement> inputs) { s_logger.debug("fnConv late resolving with inputs {}", inputs); assertEquals(1, inputs.size()); final ValueSpecification input = inputs.keySet().iterator().next(); if (!input.getProperties().getValues("TEST").contains("Bar")) { return Collections.emptySet(); } return super.getResults(context, target, inputs); } }; fnConv.addRequirement(helper.getRequirement2Any()); helper.getFunctionRepository().addFunction(fnConv); DependencyGraphBuilder builder = helper.createBuilder(new FunctionPriority() { @Override public int getPriority(CompiledFunctionDefinition function) { if (function == fnConv) { return 1; } if (function == fn2Bar) { return -1; } return 0; } }); builder.addTarget(helper.getRequirement1Bar()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); assertGraphContains(graph, fn2Bar, fnConv); } finally { TestLifecycle.end(); } } public void additionalRequirements() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); final MockFunction fn1Foo = helper.addFunctionProducing(helper.getValue1Foo()); final MockFunction fn2Bar = helper.addFunctionProducing(helper.getValue2Bar()); final MockFunction fnConv = new MockFunction("conv", helper.getTarget()) { @Override public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target) { final ValueRequirement req = helper.getRequirement1Any(); return Collections.singleton(new ValueSpecification(req.getValueName(), target.toSpecification(), req.getConstraints().copy().with(ValuePropertyNames.FUNCTION, getUniqueId()) .get())); } @Override public Set<ValueRequirement> getAdditionalRequirements(FunctionCompilationContext context, ComputationTarget target, Set<ValueSpecification> inputs, Set<ValueSpecification> outputs) { assertEquals(1, inputs.size()); assertTrue(inputs.contains(helper.getSpec2Bar())); assertEquals(1, outputs.size()); //final ValueSpecification expected = _result.compose(helper.getRequirement1Bar()); //s_logger.debug("Outputs={}, expected={}", outputs, expected); //assertTrue(outputs.contains(expected)); return Collections.singleton(helper.getRequirement1Foo()); } }; fnConv.addRequirement(helper.getRequirement2Any()); helper.getFunctionRepository().addFunction(fnConv); DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(helper.getRequirement1Bar()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); assertGraphContains(graph, fn2Bar, fnConv, fn1Foo); } finally { TestLifecycle.end(); } } public void additionalRequirementBacktracking() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); final MockFunction fn1Foo = helper.addFunctionProducing(helper.getValue1Foo()); final MockFunction fn2Foo = helper.addFunctionProducing(helper.getValue2Foo()); final MockFunction fn2Bar = helper.addFunctionProducing(helper.getValue2Bar()); final MockFunction fnConv = new MockFunction("conv", helper.getTarget()) { @Override public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target) { final ValueRequirement req = helper.getRequirement1Any(); return Collections.singleton(new ValueSpecification(req.getValueName(), target.toSpecification(), req.getConstraints().copy().with(ValuePropertyNames.FUNCTION, getUniqueId()) .get())); } @Override public Set<ValueRequirement> getAdditionalRequirements(FunctionCompilationContext context, ComputationTarget target, Set<ValueSpecification> inputs, Set<ValueSpecification> outputs) { if (inputs.contains(helper.getSpec2Foo())) { return Collections.singleton(helper.getRequirement2Beta()); } else { return Collections.singleton(helper.getRequirement1Foo()); } } }; fnConv.addRequirement(helper.getRequirement2Any()); helper.getFunctionRepository().addFunction(fnConv); DependencyGraphBuilder builder = helper.createBuilder(new FunctionPriority() { @Override public int getPriority(CompiledFunctionDefinition function) { if (function == fn2Foo) { return 1; } return 0; } }); builder.addTarget(helper.getRequirement1Bar()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); assertGraphContains(graph, fn2Bar, fnConv, fn1Foo); } finally { TestLifecycle.end(); } } }