/**
* 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.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import org.testng.annotations.Test;
import com.google.common.collect.Sets;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.function.FunctionCompilationContext;
import com.opengamma.engine.function.FunctionExecutionContext;
import com.opengamma.engine.function.FunctionInputs;
import com.opengamma.engine.value.ComputedValue;
import com.opengamma.engine.value.ValueProperties;
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 optional inputs to functions.
*/
@Test(groups = TestGroup.UNIT)
public class DepGraphOptionalInputsTest extends AbstractDependencyGraphBuilderTest {
private static class OptionalInputsFunction extends TestFunction {
private final boolean _expect1;
private final boolean _expect2;
private final ValueRequirement _req1;
private final ValueRequirement _req2;
public OptionalInputsFunction(final DepGraphTestHelper helper, final boolean expect1, final boolean expect2) {
_expect1 = expect1;
_expect2 = expect2;
_req1 = helper.getRequirement2();
_req2 = helper.getRequirement1();
}
@Override
public Set<ComputedValue> execute(FunctionExecutionContext executionContext, FunctionInputs inputs, ComputationTarget target, Set<ValueRequirement> desiredValues) {
return null;
}
@Override
public Set<ValueRequirement> getRequirements(FunctionCompilationContext context, ComputationTarget target, ValueRequirement desiredValue) {
final Set<ValueRequirement> req = Sets.newHashSetWithExpectedSize(4);
req.add(_req1);
req.add(_req2);
return req;
}
@Override
public Set<ValueSpecification> getResults(final FunctionCompilationContext context, final ComputationTarget target, final Map<ValueSpecification, ValueRequirement> inputs) {
if (_expect1) {
assertTrue(inputs.values().contains(_req1));
} else {
assertFalse(inputs.values().contains(_req1));
}
if (_expect2) {
assertTrue(inputs.values().contains(_req2));
} else {
assertFalse(inputs.values().contains(_req2));
}
return getResults(context, target);
}
@Override
public Set<ValueSpecification> getResults(FunctionCompilationContext context, ComputationTarget target) {
return Collections.singleton(new ValueSpecification("OUT", target.toSpecification(), ValueProperties.all()));
}
@Override
public boolean canHandleMissingRequirements() {
return true;
}
}
public void optionalInputsPresent() {
TestLifecycle.begin();
try {
final DepGraphTestHelper helper = new DepGraphTestHelper();
helper.addFunctionProducing1and2();
helper.getFunctionRepository().addFunction(new OptionalInputsFunction(helper, true, true));
final DependencyGraphBuilder builder = helper.createBuilder(null);
expectCompletion(builder, builder.getContext().resolveRequirement(new ValueRequirement("OUT", helper.getTarget().toSpecification()), null, null));
} finally {
TestLifecycle.end();
}
}
public void optionalInputsBothMissing() {
TestLifecycle.begin();
try {
final DepGraphTestHelper helper = new DepGraphTestHelper();
helper.getFunctionRepository().addFunction(new OptionalInputsFunction(helper, false, false));
final DependencyGraphBuilder builder = helper.createBuilder(null);
expectCompletion(builder, builder.getContext().resolveRequirement(new ValueRequirement("OUT", helper.getTarget().toSpecification()), null, null));
} finally {
TestLifecycle.end();
}
}
public void optionalInputsOneMissing() {
TestLifecycle.begin();
try {
final DepGraphTestHelper helper = new DepGraphTestHelper();
helper.addFunctionProducing2();
helper.getFunctionRepository().addFunction(new OptionalInputsFunction(helper, true, false));
final DependencyGraphBuilder builder = helper.createBuilder(null);
expectCompletion(builder, builder.getContext().resolveRequirement(new ValueRequirement("OUT", helper.getTarget().toSpecification()), null, null));
} finally {
TestLifecycle.end();
}
}
}