/** * 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.Assert.fail; import static org.testng.AssertJUnit.assertEquals; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.testng.annotations.Test; import com.opengamma.engine.function.CompiledFunctionDefinition; import com.opengamma.engine.function.FunctionDefinition; import com.opengamma.engine.function.exclusion.AbstractFunctionExclusionGroups; import com.opengamma.engine.function.exclusion.FunctionExclusionGroup; import com.opengamma.engine.function.exclusion.FunctionExclusionGroups; import com.opengamma.engine.function.resolver.FunctionPriority; import com.opengamma.util.test.TestGroup; import com.opengamma.util.test.TestLifecycle; /** * Tests the function exclusion group mechansim. */ @Test(groups = TestGroup.UNIT) public class DepGraphExclusionTest extends AbstractDependencyGraphBuilderTest { private static abstract class Group extends AbstractFunctionExclusionGroups { protected abstract String getKey(int functionId); @Override protected String getKey(final FunctionDefinition function) { return getKey(Integer.parseInt(function.getUniqueId())); } } private DependencyGraph test(final FunctionExclusionGroups exclusions) { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); final Map<CompiledFunctionDefinition, Integer> priority = new HashMap<CompiledFunctionDefinition, Integer>(); priority.put(helper.addFunctionRequiringProducing(helper.getRequirement1Bar(), helper.getValue1Foo()), 5); // 0 priority.put(helper.addFunctionRequiringProducing(helper.getRequirement2Bar(), helper.getValue1Bar()), 5); // 1 priority.put(helper.addFunctionRequiringProducing(helper.getRequirement2Foo(), helper.getValue2Bar()), 5); // 2 priority.put(helper.addFunctionProducing(helper.getValue1Foo()), 1); // 3 priority.put(helper.addFunctionProducing(helper.getValue1Bar()), 1); // 4 priority.put(helper.addFunctionProducing(helper.getValue2Bar()), 1); // 5 priority.put(helper.addFunctionProducing(helper.getValue2Foo()), 1); // 6 final DependencyGraphBuilder builder = helper.createBuilder(new FunctionPriority() { @Override public int getPriority(final CompiledFunctionDefinition function) { return priority.get(function); } }); builder.setFunctionExclusionGroups(exclusions); builder.addTarget(helper.getRequirement1Foo()); return builder.getDependencyGraph(); } finally { TestLifecycle.end(); } } public void noGroups() { final DependencyGraph graph = test(new FunctionExclusionGroups() { @Override public FunctionExclusionGroup getExclusionGroup(final FunctionDefinition function) { return null; } @Override public boolean isExcluded(final FunctionExclusionGroup current, final Collection<FunctionExclusionGroup> existing) { return false; } @Override public Collection<FunctionExclusionGroup> withExclusion(final Collection<FunctionExclusionGroup> existing, final FunctionExclusionGroup newGroup) { // Should never be called fail(); throw new UnsupportedOperationException(); } }); assertEquals(4, graph.getSize()); // 6 -> 2 -> 1 -> 0 } public void singleGroups() { final DependencyGraph graph = test(new Group() { @Override protected String getKey(final int function) { return Integer.toString(function); } }); assertEquals(4, graph.getSize()); // 6 -> 2 -> 1 -> 0 } public void group01group2() { final DependencyGraph graph = test(new Group() { @Override protected String getKey(final int function) { switch (function) { case 0: case 1: return "A"; case 2: return "B"; default: return null; } } }); assertEquals(2, graph.getSize()); // 4 -> 0 } public void group0group26() { final DependencyGraph graph = test(new Group() { @Override protected String getKey(final int function) { switch (function) { case 0: return "A"; case 2: case 6: return "B"; default: return null; } } }); assertEquals(3, graph.getSize()); // 5 -> 1 -> 0 } public void group02() { final DependencyGraph graph = test(new Group() { @Override protected String getKey(final int function) { switch (function) { case 0: case 2: return "A"; default: return null; } } }); assertEquals(4, graph.getSize()); // 6 -> 2 -> 1 -> 0 } public void group014() { final DependencyGraph graph = test(new Group() { @Override protected String getKey(final int function) { switch (function) { case 0: case 1: case 4: return "A"; default: return null; } } }); assertEquals(1, graph.getSize()); // 3 } }