/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.aggregation;
import org.testng.annotations.Test;
import com.opengamma.util.test.TestGroup;
/**
* Test aggregation.
*/
@Test(groups = TestGroup.UNIT)
public class AggregationTest {
// private static final Logger s_logger = LoggerFactory.getLogger(AggregationTest.class);
// private List<Position> _equities;
// private List<Position> _americanOptions;
// private List<Position> _europeanOptions;
// private List<Position> _allOptions;
// private ArrayList<Position> _usd;
// private ArrayList<Position> _gbp;
// private List<Position> _gbpEquities;
// private ArrayList<Position> _usdEquities;
// TODO kirk 2009-11-03 -- Bring this up to date with the new security identity keys.
/*
public Portfolio makeTestPortfolio() {
Expiry expiry = new Expiry(ZonedDateTime.fromInstant(Clock.systemUTC().instant(), ZoneOffset.UTC));
EquitySecurity aaplSec = new EquitySecurity("AAPL US", "BLOOMBERG");
aaplSec.setCurrency(Currency.getInstance("USD"));
AmericanVanillaEquityOptionSecurity aaplOption1 = new AmericanVanillaEquityOptionSecurity(OptionType.CALL, 190, expiry, aaplSec.getIdentityKey(), Currency.getInstance("USD"));
AmericanVanillaEquityOptionSecurity aaplOption2 = new AmericanVanillaEquityOptionSecurity(OptionType.PUT, 195, expiry, aaplSec.getIdentityKey(), Currency.getInstance("USD"));
AmericanVanillaEquityOptionSecurity aaplOption3 = new AmericanVanillaEquityOptionSecurity(OptionType.CALL, 200, expiry, aaplSec.getIdentityKey(), Currency.getInstance("USD"));
AmericanVanillaEquityOptionSecurity aaplOption4 = new AmericanVanillaEquityOptionSecurity(OptionType.PUT, 205, expiry, aaplSec.getIdentityKey(), Currency.getInstance("USD"));
AmericanVanillaEquityOptionSecurity aaplOption5 = new AmericanVanillaEquityOptionSecurity(OptionType.CALL, 210, expiry, aaplSec.getIdentityKey(), Currency.getInstance("USD"));
EquitySecurity vodafSec = new EquitySecurity("VODAF", "BLOOMBERG");
vodafSec.setCurrency(Currency.getInstance("GBP"));
EuropeanVanillaEquityOptionSecurity vodafOption1 = new EuropeanVanillaEquityOptionSecurity(OptionType.PUT, 105, expiry, vodafSec.getIdentityKey(), Currency.getInstance("GBP"));
EuropeanVanillaEquityOptionSecurity vodafOption2 = new EuropeanVanillaEquityOptionSecurity(OptionType.CALL, 110, expiry, vodafSec.getIdentityKey(), Currency.getInstance("GBP"));
EuropeanVanillaEquityOptionSecurity vodafOption3 = new EuropeanVanillaEquityOptionSecurity(OptionType.PUT, 115, expiry, vodafSec.getIdentityKey(), Currency.getInstance("GBP"));
EuropeanVanillaEquityOptionSecurity vodafOption4 = new EuropeanVanillaEquityOptionSecurity(OptionType.CALL, 120, expiry, vodafSec.getIdentityKey(), Currency.getInstance("GBP"));
EquitySecurity ibmSec = new EquitySecurity("IBM US", "BLOOMBERG");
ibmSec.setCurrency(Currency.getInstance("USD"));
Position aaplPos = new PositionBean(new BigDecimal(2000), aaplSec.getIdentityKey(), aaplSec);
Position aaplOption1Pos = new PositionBean(new BigDecimal(5000), aaplOption1.getIdentityKey(), aaplOption1);
Position aaplOption2Pos = new PositionBean(new BigDecimal(5000), aaplOption2.getIdentityKey(), aaplOption2);
Position aaplOption3Pos = new PositionBean(new BigDecimal(5000), aaplOption3.getIdentityKey(), aaplOption3);
Position aaplOption4Pos = new PositionBean(new BigDecimal(5000), aaplOption4.getIdentityKey(), aaplOption4);
Position aaplOption5Pos = new PositionBean(new BigDecimal(5000), aaplOption5.getIdentityKey(), aaplOption5);
Position vodafPos = new PositionBean(new BigDecimal(-1000), vodafSec.getIdentityKey(), vodafSec);
Position vodafOption1Pos = new PositionBean(new BigDecimal(5000), vodafOption1.getIdentityKey(), vodafOption1);
Position vodafOption2Pos = new PositionBean(new BigDecimal(5000), vodafOption2.getIdentityKey(), vodafOption2);
Position vodafOption3Pos = new PositionBean(new BigDecimal(5000), vodafOption3.getIdentityKey(), vodafOption3);
Position vodafOption4Pos = new PositionBean(new BigDecimal(5000), vodafOption4.getIdentityKey(), vodafOption4);
Position ibmPos = new PositionBean(new BigDecimal(4000), ibmSec.getIdentityKey(), ibmSec);
PortfolioImpl fullyPopulatedPortfolio = new PortfolioImpl("Test Portfolio");
PortfolioNodeImpl callNode = new PortfolioNodeImpl("calls");
PortfolioNodeImpl putNode = new PortfolioNodeImpl("puts");
PortfolioNodeImpl ukCallNode = new PortfolioNodeImpl("uk calls");
PortfolioNodeImpl usCallNode = new PortfolioNodeImpl("us calls");
fullyPopulatedPortfolio.addPosition(ibmPos);
fullyPopulatedPortfolio.addSubNode(putNode);
fullyPopulatedPortfolio.addSubNode(callNode);
callNode.addSubNode(ukCallNode);
callNode.addSubNode(usCallNode);
Position[] putList = new Position[] { aaplOption2Pos, aaplOption4Pos, vodafOption1Pos, vodafOption3Pos };
Position[] ukCallList = new Position[] { vodafOption2Pos, vodafOption4Pos };
Position[] usCallList = new Position[] { aaplOption1Pos, aaplOption3Pos, aaplOption5Pos };
_equities = Arrays.asList(new Position[] { aaplPos, vodafPos, ibmPos });
_americanOptions = Arrays.asList(new Position[] { aaplOption1Pos, aaplOption2Pos, aaplOption3Pos, aaplOption4Pos, aaplOption5Pos });
_europeanOptions = Arrays.asList(new Position[] { vodafOption1Pos, vodafOption2Pos, vodafOption3Pos, vodafOption4Pos });
_allOptions = new ArrayList<Position>(_americanOptions);
_allOptions.addAll(_europeanOptions);
_usd = new ArrayList<Position>(_americanOptions);
_usd.add(ibmPos);
_usd.add(aaplPos);
_gbp = new ArrayList<Position>(_europeanOptions);
_gbp.add(vodafPos);
_gbpEquities = Collections.singletonList(vodafPos);
_usdEquities = new ArrayList<Position>();
_usdEquities.add(aaplPos);
_usdEquities.add(ibmPos);
for (Position position : putList) {
putNode.addPosition(position);
}
putNode.addPosition(aaplPos);
for (Position position : ukCallList) {
ukCallNode.addPosition(position);
}
ukCallNode.addPosition(vodafPos);
for (Position position : usCallList) {
usCallNode.addPosition(position);
}
return fullyPopulatedPortfolio;
}
@Test
public void testDetailedAssetClassAggregation() {
Portfolio testPortfolio = makeTestPortfolio();
PortfolioAggregator aggregator = new PortfolioAggregator(new DetailedAssetClassAggregationFunction());
PortfolioNode aggregatedPortfolio = aggregator.aggregate(testPortfolio);
Assert.assertEquals(0, aggregatedPortfolio.getPositions().size());
Assert.assertEquals(3, aggregatedPortfolio.getSubNodes().size());
for (PortfolioNode node : aggregatedPortfolio.getSubNodes()) {
Assert.assertEquals(0, node.getSubNodes().size());
if (node.getName().endsWith(DetailedAssetClassAggregationFunction.EQUITIES)) {
Assert.assertTrue(_equities.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_equities));
} else if (node.getName().endsWith(DetailedAssetClassAggregationFunction.AMERICAN_VANILLA_EQUITY_OPTIONS)) {
Assert.assertTrue(_americanOptions.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_americanOptions));
} else if (node.getName().endsWith(DetailedAssetClassAggregationFunction.EUROPEAN_VANILLA_EQUITY_OPTIONS)) {
Assert.assertTrue(_europeanOptions.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_europeanOptions));
} else {
Assert.fail();
}
}
}
@Test
public void testAssetClassAggregation() {
Portfolio testPortfolio = makeTestPortfolio();
PortfolioAggregator aggregator = new PortfolioAggregator(new AssetClassAggregationFunction());
PortfolioNode aggregatedPortfolio = aggregator.aggregate(testPortfolio);
Assert.assertEquals(0, aggregatedPortfolio.getPositions().size());
Assert.assertEquals(2, aggregatedPortfolio.getSubNodes().size());
int total = 0; // this makes sure both branches are visited only once.
for (PortfolioNode node : aggregatedPortfolio.getSubNodes()) {
Assert.assertEquals(0, node.getSubNodes().size());
if (node.getName().endsWith(AssetClassAggregationFunction.EQUITIES)) {
Assert.assertTrue(_equities.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_equities));
total += 10;
} else if (node.getName().endsWith(AssetClassAggregationFunction.EQUITY_OPTIONS)) {
Assert.assertTrue(_allOptions.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_allOptions));
total += 1;
} else {
Assert.fail();
}
}
Assert.assertEquals(11, total);
}
@Test
public void testCurrencyAggregation() {
Portfolio testPortfolio = makeTestPortfolio();
PortfolioAggregator aggregator = new PortfolioAggregator(new CurrencyAggregationFunction());
PortfolioNode aggregatedPortfolio = aggregator.aggregate(testPortfolio);
Assert.assertEquals(0, aggregatedPortfolio.getPositions().size());
Assert.assertEquals(2, aggregatedPortfolio.getSubNodes().size());
int total = 0; // this makes sure both branches are visited only once.
for (PortfolioNode node : aggregatedPortfolio.getSubNodes()) {
Assert.assertEquals(0, node.getSubNodes().size());
if (node.getName().contains("GBP")) {
Assert.assertTrue(_gbp.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_gbp));
total += 10;
} else if (node.getName().contains("USD")) {
Assert.assertTrue(_usd.containsAll(node.getPositions()));
Assert.assertTrue(node.getPositions().containsAll(_usd));
total += 1;
} else {
Assert.fail();
}
}
Assert.assertEquals(11, total);
}
@Test
public void testMultiLevelAggregation() {
s_logger.info("Starting testMultiLevelAggregation()");
Portfolio testPortfolio = makeTestPortfolio();
PortfolioAggregator aggregator = new PortfolioAggregator(new AssetClassAggregationFunction(), new CurrencyAggregationFunction());
PortfolioNode aggregatedPortfolio = aggregator.aggregate(testPortfolio);
Assert.assertEquals(0, aggregatedPortfolio.getPositions().size());
Assert.assertEquals(2, aggregatedPortfolio.getSubNodes().size());
int total = 0; // make sure both branches are visited only once.
for (PortfolioNode node : aggregatedPortfolio.getSubNodes()) {
Assert.assertEquals(0, node.getPositions().size());
if (node.getName().endsWith(AssetClassAggregationFunction.EQUITIES)) {
int subTotal = 0; // this makes sure both branches are visited only once.
for (PortfolioNode subNode : node.getSubNodes()) {
Assert.assertEquals(0, subNode.getSubNodes().size());
if (subNode.getName().contains("GBP")) {
System.err.println(node.getPositions());
Assert.assertTrue(_gbpEquities.containsAll(subNode.getPositions()));
Assert.assertTrue(subNode.getPositions().containsAll(_gbpEquities));
subTotal += 10;
} else if (subNode.getName().contains("USD")) {
Assert.assertTrue(_usdEquities.containsAll(subNode.getPositions()));
Assert.assertTrue(subNode.getPositions().containsAll(_usdEquities));
subTotal += 1;
} else {
Assert.fail();
}
}
Assert.assertEquals(11, subTotal);
total += 10;
} else if (node.getName().endsWith(AssetClassAggregationFunction.EQUITY_OPTIONS)) {
int subTotal = 0; // this makes sure both branches are visited only once.
for (PortfolioNode subNode : node.getSubNodes()) {
Assert.assertEquals(0, subNode.getSubNodes().size());
if (subNode.getName().contains("GBP")) {
Assert.assertTrue(_europeanOptions.containsAll(subNode.getPositions()));
Assert.assertTrue(subNode.getPositions().containsAll(_europeanOptions));
subTotal += 10;
} else if (subNode.getName().contains("USD")) {
Assert.assertTrue(_americanOptions.containsAll(subNode.getPositions()));
Assert.assertTrue(subNode.getPositions().containsAll(_americanOptions));
subTotal += 1;
} else {
Assert.fail();
}
}
Assert.assertEquals(11, subTotal);
total += 1;
} else {
Assert.fail();
}
}
Assert.assertEquals(11, total);
}
*/
@Test
public void testNothing() {
// Just here to stop the failure temporarily.
}
}