/** * 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.assertNotNull; import java.util.Collections; import java.util.Set; import org.testng.annotations.Test; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.depgraph.impl.DependencyGraphImpl; 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.ValueProperties; 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 with requirement constraints */ @Test(groups = TestGroup.UNIT) public class DepGraphConstraintsTest extends AbstractDependencyGraphBuilderTest { public void functionByName1() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); final MockFunction fn = helper.addFunctionProducing2(); final MockFunction fnBeta = helper.addFunctionProducing2Beta(); DependencyGraphBuilder builder = helper.createBuilder(new FunctionPriority() { @Override public int getPriority(CompiledFunctionDefinition function) { if (function.getFunctionDefinition().getUniqueId().equals(fnBeta.getUniqueId())) { return -1; } return 0; } }); builder.addTarget(helper.getRequirement2()); builder.addTarget(helper.getRequirement2Beta()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); graph = DependencyGraphImpl.removeUnnecessaryValues(graph); assertGraphContains(graph, fn, fnBeta); } finally { TestLifecycle.end(); } } public void functionByName2() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); helper.addFunctionProducing2(); final MockFunction fnBeta = helper.addFunctionProducing2Beta(); DependencyGraphBuilder builder = helper.createBuilder(new FunctionPriority() { @Override public int getPriority(CompiledFunctionDefinition function) { if (function.getFunctionDefinition().getUniqueId().equals(fnBeta.getUniqueId())) { return 1; } return 0; } }); builder.addTarget(helper.getRequirement2Beta()); builder.addTarget(helper.getRequirement2Beta()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); graph = DependencyGraphImpl.removeUnnecessaryValues(graph); assertGraphContains(graph, fnBeta); } finally { TestLifecycle.end(); } } public void functionByNameMissing() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); helper.addFunctionProducing2(); final DependencyGraphBuilder builder = helper.createBuilder(null); expectCompletion(builder, builder.getContext().resolveRequirement(helper.getRequirement2(), null, null)); expectFailure(builder, builder.getContext().resolveRequirement(helper.getRequirement2Beta(), null, null)); } finally { TestLifecycle.end(); } } public void functionWithProperty() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); final MockFunction fn1 = helper.addFunctionProducing(helper.getValue1Foo()); helper.addFunctionRequiringProducing(helper.getRequirement1Bar(), helper.getValue2Bar()); final MockFunction fn2b = helper.addFunctionRequiringProducing(helper.getRequirement1Foo(), helper.getValue2Foo()); final DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(helper.getRequirement2Foo()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); graph = DependencyGraphImpl.removeUnnecessaryValues(graph); assertGraphContains(graph, fn1, fn2b); } finally { TestLifecycle.end(); } } public void functionWithPropertyMissing() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); helper.addFunctionProducing(helper.getValue1Foo()); helper.addFunctionRequiringProducing(helper.getRequirement1Bar(), helper.getValue2Bar()); helper.addFunctionRequiringProducing(helper.getRequirement1Foo(), helper.getValue2Foo()); final DependencyGraphBuilder builder = helper.createBuilder(null); expectFailure(builder, builder.getContext().resolveRequirement(helper.getRequirement2Bar(), null, null)); } finally { TestLifecycle.end(); } } public void outputBasedRequirements() { 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 req1any = helper.getRequirement1Any(); return Collections.singleton(new ValueSpecification(req1any.getValueName(), target.toSpecification(), req1any.getConstraints().copy() .with(ValuePropertyNames.FUNCTION, getUniqueId()).get())); } @Override public Set<ValueRequirement> getRequirements(FunctionCompilationContext context, ComputationTarget target, ValueRequirement desiredValue) { return Collections.singleton(new ValueRequirement(helper.getRequirement2Any().getValueName(), target.toSpecification(), ValueProperties.with("TEST", desiredValue.getConstraints().getValues("TEST")).get())); } }; helper.getFunctionRepository().addFunction(fnConv); DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(helper.getRequirement1Bar()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); assertGraphContains(graph, fn2Bar, fnConv); } finally { TestLifecycle.end(); } } }