/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.analytics;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.google.common.collect.Lists;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.cache.MissingOutput;
import com.opengamma.engine.value.ComputedValueResult;
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.engine.view.AggregatedExecutionLog;
import com.opengamma.engine.view.execution.ViewCycleExecutionOptions;
import com.opengamma.engine.view.impl.InMemoryViewComputationResultModel;
import com.opengamma.id.UniqueId;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class ResultsCacheTest {
private static final String CALC_CONFIG = "calcConfig";
private final ComputationTargetSpecification _target1 = ComputationTargetSpecification.of(UniqueId.of("fake", "id1"));
private final ComputationTargetSpecification _target2 = ComputationTargetSpecification.of(UniqueId.of("fake", "id2"));
private final ValueRequirement _req1 = new ValueRequirement("req1", _target1);
private final ValueRequirement _req2 = new ValueRequirement("req2", _target2);
private final ValueSpecification _spec1 = new ValueSpecification(_req1.getValueName(), _target1, ValueProperties.builder().with(ValuePropertyNames.FUNCTION, "fn1").get());
private final ValueSpecification _spec2 = new ValueSpecification(_req2.getValueName(), _target2, ValueProperties.builder().with(ValuePropertyNames.FUNCTION, "fn2").get());
@Test
public void putResultsNoHistory() {
final String spec1value1 = "spec1value1";
final String spec2value1 = "spec2value1";
final InMemoryViewComputationResultModel results1 = new InMemoryViewComputationResultModel();
results1.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
results1.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, spec1value1, AggregatedExecutionLog.EMPTY));
results1.addValue(CALC_CONFIG, new ComputedValueResult(_spec2, spec2value1, AggregatedExecutionLog.EMPTY));
final ResultsCache cache = new ResultsCache();
cache.put(results1);
final ResultsCache.Result result1_1 = cache.getResult(CALC_CONFIG, _spec1, String.class);
final ResultsCache.Result result2_1 = cache.getResult(CALC_CONFIG, _spec2, String.class);
assertEquals(spec1value1, result1_1.getValue());
assertEquals(spec2value1, result2_1.getValue());
assertNull(result1_1.getHistory());
assertNull(result2_1.getHistory());
assertTrue(result1_1.isUpdated());
assertTrue(result2_1.isUpdated());
final String spec1value2 = "spec1value2";
final InMemoryViewComputationResultModel results2 = new InMemoryViewComputationResultModel();
results2.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
results2.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, spec1value2, AggregatedExecutionLog.EMPTY));
cache.put(results2);
final ResultsCache.Result result1_2 = cache.getResult(CALC_CONFIG, _spec1, String.class);
final ResultsCache.Result result2_2 = cache.getResult(CALC_CONFIG, _spec2, String.class);
assertEquals(spec1value2, result1_2.getValue());
assertEquals(spec2value1, result2_2.getValue());
assertNull(result1_2.getHistory());
assertNull(result2_2.getHistory());
assertTrue(result1_2.isUpdated());
assertFalse(result2_2.isUpdated());
}
@Test
public void putResultsWithHistory() {
final InMemoryViewComputationResultModel results1 = new InMemoryViewComputationResultModel();
results1.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
results1.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, 1d, AggregatedExecutionLog.EMPTY));
final ResultsCache cache = new ResultsCache();
cache.put(results1);
final ResultsCache.Result result1 = cache.getResult(CALC_CONFIG, _spec1, Double.class);
assertEquals(1d, result1.getValue());
assertEquals(1, result1.getHistory().size());
assertEquals(1d, result1.getHistory().iterator().next());
final InMemoryViewComputationResultModel results2 = new InMemoryViewComputationResultModel();
results2.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
results2.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, 2d, AggregatedExecutionLog.EMPTY));
cache.put(results2);
final ResultsCache.Result result2 = cache.getResult(CALC_CONFIG, _spec1, Double.class);
assertEquals(2d, result2.getValue());
assertEquals(2, result2.getHistory().size());
final List<Object> history = new ArrayList<Object>(result2.getHistory());
assertEquals(1d, history.get(0));
assertEquals(2d, history.get(1));
}
@Test
public void errorValues() {
final InMemoryViewComputationResultModel resultsModel1 = new InMemoryViewComputationResultModel();
resultsModel1.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
resultsModel1.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, MissingOutput.EVALUATION_ERROR, AggregatedExecutionLog.EMPTY));
final ResultsCache cache = new ResultsCache();
cache.put(resultsModel1);
final ResultsCache.Result result1 = cache.getResult(CALC_CONFIG, _spec1, Double.class);
assertEquals(MissingOutput.EVALUATION_ERROR, result1.getValue());
assertNull(result1.getHistory());
final InMemoryViewComputationResultModel resultsModel2 = new InMemoryViewComputationResultModel();
resultsModel2.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
resultsModel2.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, 1d, AggregatedExecutionLog.EMPTY));
cache.put(resultsModel2);
final InMemoryViewComputationResultModel resultsModel3 = new InMemoryViewComputationResultModel();
resultsModel3.setViewCycleExecutionOptions(ViewCycleExecutionOptions.builder().setValuationTime(Instant.now()).create());
resultsModel3.addValue(CALC_CONFIG, new ComputedValueResult(_spec1, MissingOutput.EVALUATION_ERROR, AggregatedExecutionLog.EMPTY));
cache.put(resultsModel3);
final ResultsCache.Result result2 = cache.getResult(CALC_CONFIG, _spec1, Double.class);
assertEquals(MissingOutput.EVALUATION_ERROR, result2.getValue());
final List<Object> history = Lists.newArrayList(result2.getHistory());
assertNotNull(history);
assertEquals(2, history.size());
assertEquals(1d, history.get(0));
assertEquals(MissingOutput.EVALUATION_ERROR, history.get(1));
}
}