/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.function.config;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.AssertJUnit.assertEquals;
import java.util.HashSet;
import java.util.Set;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.opengamma.core.config.ConfigSource;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.test.TestGroup;
/**
* Test {@link FunctionConfigurationDefinitionAggregator}
*/
@Test(groups = TestGroup.UNIT)
public class FunctionConfigurationDefinitionAggregatorTest {
private static final StaticFunctionConfiguration SF1 = new StaticFunctionConfiguration("SF1");
private static final StaticFunctionConfiguration SF2 = new StaticFunctionConfiguration("SF2");
private static final StaticFunctionConfiguration SF3 = new StaticFunctionConfiguration("SF3");
private static final StaticFunctionConfiguration SF4 = new StaticFunctionConfiguration("SF4");
private static final StaticFunctionConfiguration SF5 = new StaticFunctionConfiguration("SF5");
private static final StaticFunctionConfiguration SF6 = new StaticFunctionConfiguration("SF6");
private static final StaticFunctionConfiguration SF7 = new StaticFunctionConfiguration("SF7");
private static final StaticFunctionConfiguration SF8 = new StaticFunctionConfiguration("SF8");
private static final ParameterizedFunctionConfiguration PF1 = new ParameterizedFunctionConfiguration("PF1", ImmutableList.of("P1"));
private static final ParameterizedFunctionConfiguration PF2 = new ParameterizedFunctionConfiguration("PF2", ImmutableList.of("P1", "P2"));
private static final ParameterizedFunctionConfiguration PF3 = new ParameterizedFunctionConfiguration("PF3", ImmutableList.of("P1", "P2", "P3"));
private static final ParameterizedFunctionConfiguration PF4 = new ParameterizedFunctionConfiguration("PF4", ImmutableList.of("P4"));
private static final ParameterizedFunctionConfiguration PF5 = new ParameterizedFunctionConfiguration("PF5", ImmutableList.of("P4", "P5"));
private static final ParameterizedFunctionConfiguration PF6 = new ParameterizedFunctionConfiguration("PF6", ImmutableList.of("P4", "P5", "P6"));
private static final ParameterizedFunctionConfiguration PF7 = new ParameterizedFunctionConfiguration("PF7", ImmutableList.of("P7"));
private static final ParameterizedFunctionConfiguration PF8 = new ParameterizedFunctionConfiguration("PF8", ImmutableList.of("P7", "P8"));
private static final FunctionConfigurationDefinition ROOT_DEFINITION = makeRootDefinition();
private static final FunctionConfigurationDefinition CF1 = makeDefinition1();
private static final FunctionConfigurationDefinition CF2 = makeDefinition2();
private static final FunctionConfigurationDefinition CF3 = makeDefinition3();
private ConfigSource _cfgSource;
private FunctionConfigurationDefinitionAggregator _functionConfigAggregator;
@BeforeMethod
public void setUp() {
_cfgSource = mock(ConfigSource.class);
_functionConfigAggregator = new FunctionConfigurationDefinitionAggregator(_cfgSource);
}
@Test
public void resolveFunctionDefinition() {
when(_cfgSource.getSingle(FunctionConfigurationDefinition.class, "ROOT", VersionCorrection.LATEST)).thenReturn(ROOT_DEFINITION);
when(_cfgSource.getSingle(FunctionConfigurationDefinition.class, "CF1", VersionCorrection.LATEST)).thenReturn(CF1);
when(_cfgSource.getSingle(FunctionConfigurationDefinition.class, "CF2", VersionCorrection.LATEST)).thenReturn(CF2);
when(_cfgSource.getSingle(FunctionConfigurationDefinition.class, "CF3", VersionCorrection.LATEST)).thenReturn(CF3);
final FunctionConfigurationSource configurationSource = _functionConfigAggregator.aggregate("ROOT");
assertEquals(getExpectedFunctions(), ImmutableSet.copyOf(configurationSource.getFunctionConfiguration(Instant.now()).getFunctions()));
}
@Test
public void cyclicReference() {
final FunctionConfigurationDefinition defA = new FunctionConfigurationDefinition("DFA", ImmutableList.<String>of("DFB"), ImmutableList.of(SF1, SF2), ImmutableList.of(PF1, PF2));
final FunctionConfigurationDefinition defB = new FunctionConfigurationDefinition("DFB", ImmutableList.<String>of("DFA"), ImmutableList.of(SF3, SF4), ImmutableList.of(PF3, PF4));
when(_cfgSource.getSingle(FunctionConfigurationDefinition.class, "DFA", VersionCorrection.LATEST)).thenReturn(defA);
when(_cfgSource.getSingle(FunctionConfigurationDefinition.class, "DFB", VersionCorrection.LATEST)).thenReturn(defB);
Set<FunctionConfiguration> expectedFunc = new HashSet<FunctionConfiguration>();
expectedFunc.add(SF1);
expectedFunc.add(SF2);
expectedFunc.add(SF3);
expectedFunc.add(SF4);
expectedFunc.add(PF1);
expectedFunc.add(PF2);
expectedFunc.add(PF3);
expectedFunc.add(PF4);
final FunctionConfigurationSource configurationSource = _functionConfigAggregator.aggregate("DFA");
assertEquals(expectedFunc, ImmutableSet.copyOf(configurationSource.getFunctionConfiguration(Instant.now()).getFunctions()));
}
private Set<FunctionConfiguration> getExpectedFunctions() {
Set<FunctionConfiguration> func = new HashSet<FunctionConfiguration>();
func.add(SF1);
func.add(SF2);
func.add(SF3);
func.add(SF4);
func.add(SF5);
func.add(SF6);
func.add(SF7);
func.add(SF8);
func.add(PF1);
func.add(PF2);
func.add(PF3);
func.add(PF4);
func.add(PF5);
func.add(PF6);
func.add(PF7);
func.add(PF8);
return func;
}
private static FunctionConfigurationDefinition makeRootDefinition() {
return new FunctionConfigurationDefinition("ROOT", ImmutableList.of("CF1", "CF2"), ImmutableList.of(SF8, SF7), ImmutableList.of(PF7, PF8));
}
private static FunctionConfigurationDefinition makeDefinition1() {
return new FunctionConfigurationDefinition("CF1", ImmutableList.<String>of(), ImmutableList.of(SF6, SF5), ImmutableList.of(PF6, PF5));
}
private static FunctionConfigurationDefinition makeDefinition2() {
return new FunctionConfigurationDefinition("CF2", ImmutableList.of("CF3"), ImmutableList.of(SF4, SF3), ImmutableList.of(PF4, PF3));
}
private static FunctionConfigurationDefinition makeDefinition3() {
return new FunctionConfigurationDefinition("CF3", ImmutableList.<String>of(), ImmutableList.of(SF2, SF1), ImmutableList.of(PF2, PF1));
}
}