/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.sesame.graph;
import static org.mockito.Mockito.mock;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import java.util.Collections;
import java.util.Map;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.google.common.collect.ImmutableMap;
import com.opengamma.financial.security.fx.FXForwardSecurity;
import com.opengamma.sesame.SimpleEnvironment;
import com.opengamma.sesame.config.EngineUtils;
import com.opengamma.sesame.config.FunctionArguments;
import com.opengamma.sesame.engine.ComponentMap;
import com.opengamma.sesame.function.ConfigurationErrorFunction;
import com.opengamma.sesame.function.FunctionMetadata;
import com.opengamma.sesame.function.InvokableFunction;
import com.opengamma.sesame.function.Output;
import com.opengamma.sesame.marketdata.MarketDataBundle;
import com.opengamma.util.result.FailureStatus;
import com.opengamma.util.result.Result;
import com.opengamma.util.test.TestGroup;
@Test(groups = TestGroup.UNIT)
public class GraphModelTest {
/** Tests that an invalid portfolio function build a placeholder with an error message. */
@Test
public void invalidPortfolioFunction() {
FunctionMetadata metadata = EngineUtils.createMetadata(PortfolioFn.class, "foo");
FunctionModel functionModel = FunctionModel.forFunction(metadata);
Map<Class<?>, FunctionModel> fnMap = ImmutableMap.<Class<?>, FunctionModel>of(FXForwardSecurity.class, functionModel);
String columnName = "col name";
Map<String, Map<Class<?>, FunctionModel>> colMap = ImmutableMap.of(columnName, fnMap);
GraphModel graphModel = new GraphModel(colMap, Collections.<String, FunctionModel>emptyMap());
Graph graph = graphModel.build(ComponentMap.EMPTY, new FunctionBuilder());
Map<Class<?>, InvokableFunction> functionsForColumn = graph.getFunctionsForColumn(columnName);
InvokableFunction invokableFunction = functionsForColumn.get(FXForwardSecurity.class);
assertNotNull(invokableFunction);
SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class));
//SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), new ResettableLiveMarketDataSource(MarketData.live(), mock(LDClient.class)));
Result<?> result = (Result<?>) invokableFunction.invoke(env, null, FunctionArguments.EMPTY);
assertFalse(result.isSuccess());
assertEquals(FailureStatus.ERROR, result.getStatus());
assertEquals(ConfigurationErrorFunction.CONFIG_ERROR, result.getFailureMessage());
}
/** Tests that an invalid non-portfolio function build a placeholder with an error message. */
@Test
public void invalidNonPortfolioFunction() {
FunctionMetadata metadata = EngineUtils.createMetadata(NonPortfolioFn.class, "foo");
FunctionModel functionModel = FunctionModel.forFunction(metadata);
Map<String, Map<Class<?>, FunctionModel>> portfolioFunctionModels = Collections.emptyMap();
String outputName = "output name";
GraphModel graphModel = new GraphModel(portfolioFunctionModels, ImmutableMap.of(outputName, functionModel));
Graph graph = graphModel.build(ComponentMap.EMPTY, new FunctionBuilder());
InvokableFunction invokableFunction = graph.getNonPortfolioFunction(outputName);
assertNotNull(invokableFunction);
SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), mock(MarketDataBundle.class));
//SimpleEnvironment env = new SimpleEnvironment(ZonedDateTime.now(), new ResettableLiveMarketDataSource(MarketData.live(), mock(LDClient.class)));
Result<?> result = (Result<?>) invokableFunction.invoke(env, null, FunctionArguments.EMPTY);
assertFalse(result.isSuccess());
assertEquals(FailureStatus.ERROR, result.getStatus());
assertEquals(ConfigurationErrorFunction.CONFIG_ERROR, result.getFailureMessage());
}
public static interface PortfolioFn {
@Output("Foo")
String foo(FXForwardSecurity security);
}
public static interface NonPortfolioFn {
@Output("Foo")
String foo();
}
}