/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.solutions.remote;
import com.google.common.base.Objects;
import com.opengamma.core.link.ConfigLink;
import com.opengamma.core.marketdatasnapshot.MarketDataSnapshotSource;
import com.opengamma.core.marketdatasnapshot.impl.ManageableMarketDataSnapshot;
import com.opengamma.engine.marketdata.spec.MarketDataSpecification;
import com.opengamma.engine.marketdata.spec.UserMarketDataSpecification;
import com.opengamma.financial.analytics.curve.exposure.ExposureFunctions;
import com.opengamma.financial.currency.CurrencyMatrix;
import com.opengamma.id.VersionCorrection;
import com.opengamma.integration.server.RemoteServer;
import com.opengamma.sesame.OutputNames;
import com.opengamma.sesame.config.ViewConfig;
import com.opengamma.sesame.engine.CalculationArguments;
import com.opengamma.sesame.engine.RemoteViewRunner;
import com.opengamma.sesame.engine.ResultRow;
import com.opengamma.sesame.engine.Results;
import com.opengamma.sesame.engine.ViewRunner;
import com.opengamma.sesame.marketdata.MarketDataEnvironment;
import com.opengamma.sesame.marketdata.MarketDataEnvironmentBuilder;
import com.opengamma.solutions.util.SwapViewUtils;
import com.opengamma.util.money.Currency;
import com.opengamma.util.money.MultipleCurrencyAmount;
import com.opengamma.util.result.Result;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.URI;
import static com.opengamma.sesame.config.ConfigBuilder.configureView;
import static com.opengamma.util.result.ResultTestUtils.assertSuccess;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.closeTo;
/**
* Integration tests run against a remote server
* Input: Various flavours of Interest Rate Swaps, Snapshot Market Data
* Output: Present Value / Bucketed PV01 / Cash flows
*/
@Test(groups = TestGroup.INTEGRATION)
public class RemoteSwapTest {
private static final double STD_TOLERANCE_PV = 1.0E-3;
private ConfigLink<ExposureFunctions> _exposureConfig;
private ConfigLink<CurrencyMatrix> _currencyMatrixLink;
private Results _vanillaResults;
private Results _spreadResults;
private Results _fixingResults;
private Results _compoundingResults;
private Results _stubResults;
private Results _xccyResults;
private Results _feesResults;
private Results _singleLegResults;
private Results _zeroCouponResults;
private Results _iborCompoundingResults;
private Results _notionalExchangeResults;
@BeforeClass
public void setUp() {
String url = Objects.firstNonNull(System.getProperty("server.url"), RemoteTestUtils.LOCALHOST);
RemoteServer server = RemoteServer.create(url);
MarketDataSnapshotSource snapshotSource = server.getMarketDataSnapshotSource();
ManageableMarketDataSnapshot snapshot = snapshotSource.getSingle(ManageableMarketDataSnapshot.class,
RemoteTestUtils.USD_GBP_SNAPSHOT,
VersionCorrection.LATEST);
ViewRunner viewRunner = new RemoteViewRunner(URI.create(url));
MarketDataSpecification marketDataSpec = UserMarketDataSpecification.of(snapshot.getUniqueId());
CalculationArguments args =
CalculationArguments.builder()
.marketDataSpecification(marketDataSpec)
.valuationTime(DateUtils.getUTCDate(2014, 1, 22))
.build();
_exposureConfig = ConfigLink.resolvable(RemoteTestUtils.USD_GBP_FF_EXPOSURE, ExposureFunctions.class);
_currencyMatrixLink = ConfigLink.resolvable(RemoteTestUtils.CURRENCY_MATRIX, CurrencyMatrix.class);
ViewConfig viewConfig = createViewConfig();
// don't want to provide any data, let the server source it
MarketDataEnvironment env = MarketDataEnvironmentBuilder.empty();
_vanillaResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.VANILLA_INPUTS);
_spreadResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.SPREAD_INPUTS);
_fixingResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.FIXING_INPUTS);
_compoundingResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.COMPOUNDING_INPUTS);
_stubResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.STUB_INPUTS);
_xccyResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.XCCY_INPUTS);
_feesResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.FEES_INPUT);
_singleLegResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.SINGLE_LEG_INPUT);
_zeroCouponResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.ZERO_COUPON_COMPOUNDING_INPUT);
_iborCompoundingResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.IBOR_COMPOUNDING_INPUT);
_notionalExchangeResults = viewRunner.runView(viewConfig, args, env, SwapViewUtils.NOTIONAL_EXCHANGE_INPUT);
}
private ViewConfig createViewConfig() {
return
configureView(
"IRS Remote view",
SwapViewUtils.createInterestRateSwapViewColumn(OutputNames.PRESENT_VALUE,
_exposureConfig,
_currencyMatrixLink),
SwapViewUtils.createInterestRateSwapViewColumn(OutputNames.BUCKETED_PV01,
_exposureConfig,
_currencyMatrixLink),
SwapViewUtils.createInterestRateSwapViewColumn(OutputNames.PAY_LEG_CASH_FLOWS,
_exposureConfig,
_currencyMatrixLink),
SwapViewUtils.createInterestRateSwapViewColumn(OutputNames.RECEIVE_LEG_CASH_FLOWS,
_exposureConfig,
_currencyMatrixLink));
}
/* Single Leg - start */
@Test(enabled = true)
public void testSingleLegSwapPV() {
Result fixedResult = _singleLegResults.get(0, 0).getResult();
assertSuccess(fixedResult);
assertThat(fixedResult.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount fixedMca = (MultipleCurrencyAmount) fixedResult.getValue();
Result floatResult = _singleLegResults.get(1, 0).getResult();
assertSuccess(floatResult);
assertThat(floatResult.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount floatMca = (MultipleCurrencyAmount) floatResult.getValue();
// assert that the two single leg swaps parts equal the whole
Double combined = fixedMca.getCurrencyAmount(Currency.USD).getAmount() +
floatMca.getCurrencyAmount(Currency.USD).getAmount();
assertThat(combined, is(closeTo(6072234.4631, STD_TOLERANCE_PV)));
}
/* Single Leg - end */
/* Zero Coupon - start */
@Test(enabled = true)
public void testZeroCouponSwapPV() {
Result fixedResult = _zeroCouponResults.get(0, 0).getResult();
assertSuccess(fixedResult);
assertThat(fixedResult.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount amount = (MultipleCurrencyAmount) fixedResult.getValue();
assertThat(amount.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(6606079.576346258, STD_TOLERANCE_PV)));
}
/* Zero Coupon - end */
/* Ibor Compounding - start */
@Test(enabled = true)
public void testIborCompoundingSwapPV() {
Result fixedResult = _iborCompoundingResults.get(0, 0).getResult();
assertSuccess(fixedResult);
assertThat(fixedResult.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
//MultipleCurrencyAmount amount = (MultipleCurrencyAmount) fixedResult.getValue();
// TODO - this value has not been derived from an equivalent analytics test
//assertThat(amount.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(6598909.63457769, STD_TOLERANCE_PV)));
}
/* Ibor Compounding - end */
/* Fees - start */
@Test(enabled = true)
public void testFeesFixedVsLiborSwapPV() {
// Note: not tested v Analytics
Result result = _feesResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(6071234.9209, STD_TOLERANCE_PV)));
}
/* Fees - end */
/* Vanilla - start */
@Test(enabled = true)
public void testVanillaFixedVsLiborSwapPV() {
Result result = _vanillaResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(6072234.4631, STD_TOLERANCE_PV)));
}
/* Vanilla - end */
/* Compounding -start */
@Test(enabled = true)
public void testCompoundingFixedVsONSwapPV() {
Result result = _compoundingResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-5969.7908, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testCompoundingFFAAVsLiborSwapPV() {
Result result = _compoundingResults.get(1, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-1304207.7900, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testCompoundingLiborVsLiborSwapPV() {
//TODO PLAT-6743 + Check with analytics
Result result = _compoundingResults.get(2, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-828863.7088161744, STD_TOLERANCE_PV)));
}
/* Compounding -start */
/* Spread - start */
@Test(enabled = true)
public void testSpreadLiborVsLiborSwapPV() {
//TODO PLAT-6743 + check with Analytics
Result result = _spreadResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(80166.8297495842, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testSpreadFFAAVsLiborSwapPV() {
//TODO PLAT-6794
Result result = _spreadResults.get(1, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(142681.6754, STD_TOLERANCE_PV)));
}
/* Spread - end */
/* Fixing - start */
@Test(enabled = true)
public void testFixingFixedVsLiborSwapPV() {
Result result = _fixingResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(3194260.3186, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testFixingFixedVsONSwapPV() {
Result result = _fixingResults.get(1, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-5569.499485016839, STD_TOLERANCE_PV)));
}
/* Fixing - end */
/* Stubs - start */
@Test(enabled = true)
public void testFixedVsLibor3mStub3MSwapPV() {
Result result = _stubResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-181665.9361, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testFixedVsLibor3mStub1MSwapPV() {
Result result = _stubResults.get(1, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-262948.9316, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testFixedVsLibor6mStub3MSwapPV() {
Result result = _stubResults.get(2, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-318570.8721, 10*STD_TOLERANCE_PV))); // <- ???
}
@Test(enabled = true)
public void testFixedVsLibor6mStub4MSwapPV() {
Result result = _stubResults.get(3, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-406168.2802, 10*STD_TOLERANCE_PV))); // <- ???
}
@Test(enabled = true)
public void testFixedVsLibor3mLongStartStub6MSwapPV() {
//TODO PLAT-6777
Result result = _stubResults.get(4, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
}
@Test(enabled = true)
public void testFixedVsLibor6mShortEndStub2MSwapPV() {
//TODO PLAT-6777
Result result = _stubResults.get(5, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
}
/* Stubs - end */
/* XCCY - start */
@Test(enabled = true)
public void testLiborUS3mVsLiborBP3mSwapPV() {
//TODO PLAT-6782
Result result = _xccyResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(20382165.8257, STD_TOLERANCE_PV)));
assertThat(mca.getCurrencyAmount(Currency.GBP).getAmount(), is(closeTo(-8303201.9931, 50.0)));
}
@Test(enabled = true)
public void testFixedUSVsLiborBP3mSwapPV() {
//TODO PLAT-6782
Result result = _xccyResults.get(1, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-19913853.4812, STD_TOLERANCE_PV)));
assertThat(mca.getCurrencyAmount(Currency.GBP).getAmount(), is(closeTo(8303201.9931, 50.0)));
}
/* XCCY - end */
/* Notional Exchange - start */
@Test(enabled = true)
public void testInitialNotionalExchangeSwapPV() {
//TODO PLAT-6807
Result result = _notionalExchangeResults.get(0, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(80085298.7823, STD_TOLERANCE_PV)));
assertThat(mca.getCurrencyAmount(Currency.GBP).getAmount(), is(closeTo(-53295535.6962, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testFinalNotionalExchangeSwapPV() {
//TODO PLAT-6807
Result result = _notionalExchangeResults.get(1, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-107119236.1726, STD_TOLERANCE_PV)));
assertThat(mca.getCurrencyAmount(Currency.GBP).getAmount(), is(closeTo(62611433.5861, STD_TOLERANCE_PV)));
}
@Test(enabled = true)
public void testInitialFinalNotionalExchangeSwapPV() {
Result result = _notionalExchangeResults.get(2, 0).getResult();
assertSuccess(result);
assertThat(result.getValue(), is(instanceOf(MultipleCurrencyAmount.class)));
MultipleCurrencyAmount mca = (MultipleCurrencyAmount) result.getValue();
assertThat(mca.getCurrencyAmount(Currency.USD).getAmount(), is(closeTo(-7120083.9091, STD_TOLERANCE_PV)));
assertThat(mca.getCurrencyAmount(Currency.GBP).getAmount(), is(closeTo(1012655.4392, 1.0)));
}
/* Notional Exchange - end */
@Test(enabled = true)
public void testBuckedPV01() {
// TODO: test results value
for (ResultRow result : _vanillaResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _spreadResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _fixingResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _compoundingResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _xccyResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _stubResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _feesResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _singleLegResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _zeroCouponResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _iborCompoundingResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
for (ResultRow result : _notionalExchangeResults.getRows()) {
assertSuccess(result.get(1).getResult());
}
}
@Test(enabled = true)
public void testPayLegCashFlows() {
for (ResultRow result : _vanillaResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _spreadResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _fixingResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _compoundingResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _xccyResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _stubResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _feesResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _zeroCouponResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _iborCompoundingResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _notionalExchangeResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
for (ResultRow result : _singleLegResults.getRows()) {
assertSuccess(result.get(2).getResult());
}
}
@Test(enabled = true)
public void testReceiveLegCashFlows() {
for (ResultRow result : _vanillaResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _spreadResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _fixingResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _compoundingResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _xccyResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _stubResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _feesResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _zeroCouponResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _iborCompoundingResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _notionalExchangeResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
for (ResultRow result : _singleLegResults.getRows()) {
assertSuccess(result.get(3).getResult());
}
}
}