/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.portfolio;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.testng.Assert.fail;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.opengamma.core.position.Portfolio;
import com.opengamma.core.position.Position;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.integration.copier.portfolio.reader.SingleSheetSimplePositionReader;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.tuple.Pair;
@Test(groups = TestGroup.UNIT)
public class PortfolioReaderTest {
private File _tempFile;
@Test
public void testListedSecurityLoad() {
// An EquityIndexFutureOption
String data = "\"currency\",\"exchange\",\"exerciseType\",\"expiry\",\"externalIdBundle\",\"underlyingId\",\"optionType\",\"position:quantity\",\"securityType\",\"trade:counterpartyExternalId\",\"trade:deal\",\"trade:premium\",\"trade:premiumCurrency\",\"trade:premiumDate\",\"trade:premiumTime\",\"trade:quantity\",\"trade:tradeDate\",\"trade:tradeTime\"\n" +
"\"USD\",\"NEW YORK STOCK EXCHANGE INC.\",\"European\",\"2050-01-01T00:00:00+00:00[Europe/London]\",\"EIFO_ID~EIFO1234\",\"UNDERLYING_ID~ul9999\",\"PUT\",\"1264\",\"EQUITY_INDEX_FUTURE_OPTION\",\"CPID~123\",,,,,,1000,\"2014-01-01\",\n";
populateFileWithData(data);
PortfolioReader portfolioReader = new PortfolioReader(new SingleSheetSimplePositionReader(_tempFile.getAbsolutePath(), "EquityIndexFutureOption"),
"EquityIndexFutureOption Portfolio"
);
Pair<Portfolio, Set<ManageableSecurity>> pair = portfolioReader.createPortfolio();
Portfolio portfolio = pair.getFirst();
assertThat(portfolio.getName(), is("EquityIndexFutureOption Portfolio"));
Set<ManageableSecurity> securities = pair.getSecond();
assertThat(securities.size(), is(1));
final ExternalIdBundle idBundle = securities.iterator().next().getExternalIdBundle();
assertThat(idBundle, is(ExternalIdBundle.of("EIFO_ID", "EIFO1234")));
List<Position> positions = portfolio.getRootNode().getPositions();
assertThat(positions.size(), is(1));
assertThat(positions.get(0).getSecurityLink().getExternalId(), is(idBundle));
// Check trade has security id on too
assertThat(positions.get(0).getTrades().iterator().next().getSecurityLink().getExternalId(), is(idBundle));
}
@Test
public void testOtcSecurityLoad() {
String data = "adjustCashSettlementDate,adjustEffectiveDate,adjustMaturityDate,businessDayConvention,buy,cashSettlementDate,coupon,couponFrequency,dayCount,debtSeniority,effectiveDate,immAdjustMaturityDate,includeAccruedPremium,maturityDate,name,notional,position:quantity,protectionBuyer,protectionSeller,protectionStart,quotedSpread,recoveryRate,referenceEntity,regionId,restructuringClause,startDate,stubType,trade:counterpartyExternalId,trade:premium,trade:premiumCurrency,trade:premiumDate,trade:premiumTime,trade:quantity,trade:tradeDate,trade:tradeTime,upfrontAmount\n" +
"FALSE,FALSE,FALSE,Following,TRUE,2013-03-24T00:00:00.0Z,100,Semi-annual,ACT/360,SNRFOR,2013-03-21T00:00:00.0Z,FALSE,TRUE,2020-03-20T00:00:00.0Z,STEM GBP 100 7Y,GBP 1000000,1,EXTERNAL_CODE~ProtBuyer_1,EXTERNAL_CODE~ProtSeller_1,TRUE,100,0.4,MARKIT_RED_CODE~5AB67W,FINANCIAL_REGION~CARIBBEAN,MR,2013-03-20T00:00:00.0Z,SHORT_START,EXTERNAL_CODE~ProtSeller_1,,,,,1,2013-03-22,,GBP 50000";
populateFileWithData(data);
PortfolioReader portfolioReader = new PortfolioReader(new SingleSheetSimplePositionReader(_tempFile.getAbsolutePath(), "StandardVanillaCDS"),
"CDS Portfolio");
Pair<Portfolio, Set<ManageableSecurity>> pair = portfolioReader.createPortfolio();
Portfolio portfolio = pair.getFirst();
assertThat(portfolio.getName(), is("CDS Portfolio"));
Set<ManageableSecurity> securities = pair.getSecond();
assertThat(securities.size(), is(1));
// We expect an external id to be generated for us
ExternalIdBundle idBundle = securities.iterator().next().getExternalIdBundle();
assertThat(idBundle.isEmpty(), is(false));
List<Position> positions = portfolio.getRootNode().getPositions();
assertThat(positions.size(), is(1));
assertThat(positions.get(0).getSecurityLink().getExternalId(), is(idBundle));
// Check trade has security id on too
assertThat(positions.get(0).getTrades().iterator().next().getSecurityLink().getExternalId(), is(idBundle));
}
@BeforeMethod
public void doSetUp() throws Exception {
_tempFile = File.createTempFile("portfolio-", ".csv");
}
@AfterMethod
public void doTearDown() {
// Clean up the file we were using - not strictly necessary as it's a temp one anyway
if (_tempFile != null && _tempFile.exists()) {
_tempFile.delete();
}
}
private void populateFileWithData(final String data) {
try(BufferedWriter writer = new BufferedWriter(new FileWriter(_tempFile))) {
writer.write(data);
writer.flush();
} catch (final IOException e) {
fail("Unable to write data to file: " + _tempFile.getAbsolutePath());
}
}
}