/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.report.framework.expression;
import static com.opengamma.strata.basics.index.IborIndices.GBP_LIBOR_3M;
import static com.opengamma.strata.collect.TestHelper.date;
import static com.opengamma.strata.product.common.BuySell.BUY;
import static org.assertj.core.api.Assertions.assertThat;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.List;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.opengamma.strata.basics.StandardId;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.basics.date.AdjustableDate;
import com.opengamma.strata.calc.Column;
import com.opengamma.strata.calc.Measure;
import com.opengamma.strata.calc.Results;
import com.opengamma.strata.collect.result.Result;
import com.opengamma.strata.product.Trade;
import com.opengamma.strata.product.TradeInfo;
import com.opengamma.strata.product.fra.Fra;
import com.opengamma.strata.product.fra.FraTrade;
import com.opengamma.strata.report.ReportCalculationResults;
/**
* Test {@link ValuePathEvaluator}.
*/
@Test
public class ValuePathEvaluatorTest {
public void measurePath() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> currencyResults = ValuePathEvaluator.evaluate("Measures.PresentValue.Currency", reportResults);
List<Result<?>> expectedCurrencies = ImmutableList.of(
Result.success(Currency.CAD),
Result.success(Currency.AUD),
Result.success(Currency.CHF));
assertThat(currencyResults).isEqualTo(expectedCurrencies);
// Amount returns the CurrencyAmount which is slightly unexpected
// It's required in order to be able to format the amount to the correct number of decimal places
List<Result<?>> amountResults = ValuePathEvaluator.evaluate("Measures.PresentValue.Amount", reportResults);
List<Result<?>> expectedAmounts = ImmutableList.of(
Result.success(CurrencyAmount.of(Currency.CAD, 2d)),
Result.success(CurrencyAmount.of(Currency.AUD, 3d)),
Result.success(CurrencyAmount.of(Currency.CHF, 4d)));
assertThat(amountResults).isEqualTo(expectedAmounts);
}
public void measurePath_failure_noDot() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> results = ValuePathEvaluator.evaluate("Measures", reportResults);
Result<?> result = results.get(0);
assertThat(result.isFailure()).isTrue();
assertThat(result.getFailure().getMessage()).contains("PresentValue");
assertThat(result.getFailure().getMessage()).contains("ParRate");
}
public void measurePath_failure_noMeasureName() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> results = ValuePathEvaluator.evaluate("Measures.", reportResults);
Result<?> result = results.get(0);
assertThat(result.isFailure()).isTrue();
assertThat(result.getFailure().getMessage()).contains("PresentValue");
assertThat(result.getFailure().getMessage()).contains("ParRate");
}
public void measurePath_failure_unknownMeasure() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> results = ValuePathEvaluator.evaluate("Measures.Wibble", reportResults);
Result<?> result = results.get(0);
assertThat(result.isFailure()).isTrue();
assertThat(result.getFailure().getMessage()).contains("Wibble");
assertThat(result.getFailure().getMessage()).contains("PresentValue");
assertThat(result.getFailure().getMessage()).contains("ParRate");
}
public void measurePath_failure_nonQueriedMeasure() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> results = ValuePathEvaluator.evaluate("Measures.ParSpread", reportResults);
Result<?> result = results.get(0);
assertThat(result.isFailure()).isTrue();
assertThat(result.getFailure().getMessage()).contains("PresentValue");
assertThat(result.getFailure().getMessage()).contains("ParRate");
}
public void tradePath() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> counterpartyResults = ValuePathEvaluator.evaluate("Trade.Counterparty.Value", reportResults);
List<Result<?>> expectedCounterparties = ImmutableList.of(
Result.success("cpty1"),
Result.success("cpty2"),
Result.success("cpty3"));
assertThat(counterpartyResults).isEqualTo(expectedCounterparties);
List<Result<?>> counterpartyResults2 = ValuePathEvaluator.evaluate("Target.Counterparty.Value", reportResults);
assertThat(counterpartyResults2).isEqualTo(expectedCounterparties);
}
public void productPath() {
ReportCalculationResults reportResults = reportResults();
List<Result<?>> counterpartyResults = ValuePathEvaluator.evaluate("Trade.Product.Notional", reportResults);
List<Result<?>> expectedCounterparties = ImmutableList.of(
Result.success(1_000_000d),
Result.success(10_000_000d),
Result.success(100_000_000d));
assertThat(counterpartyResults).isEqualTo(expectedCounterparties);
}
//--------------------------------------------------------------------------------------------------
private static ReportCalculationResults reportResults() {
Measure measure = Measure.of("PresentValue");
Column column = Column.of(measure);
List<Column> columns = ImmutableList.of(column);
List<? extends Result<?>> resultValues = ImmutableList.of(
Result.success(CurrencyAmount.of(Currency.CAD, 2d)),
Result.success(CurrencyAmount.of(Currency.AUD, 3d)),
Result.success(CurrencyAmount.of(Currency.CHF, 4d)));
List<Trade> trades = ImmutableList.of(
trade("cpty1", 1_000_000),
trade("cpty2", 10_000_000),
trade("cpty3", 100_000_000));
Results results = Results.of(ImmutableList.of(column.toHeader()), resultValues);
return ReportCalculationResults.of(LocalDate.now(ZoneOffset.UTC), trades, columns, results);
}
private static Trade trade(String counterparty, double notional) {
TradeInfo tradeInfo = TradeInfo.builder()
.counterparty(StandardId.of("cpty", counterparty))
.build();
Fra fra = Fra.builder()
.buySell(BUY)
.notional(notional)
.startDate(date(2015, 8, 5))
.endDate(date(2015, 11, 5))
.paymentDate(AdjustableDate.of(date(2015, 8, 7)))
.fixedRate(0.25d)
.index(GBP_LIBOR_3M)
.build();
return FraTrade.builder()
.info(tradeInfo)
.product(fra)
.build();
}
}