/** * 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.assertTrue; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.ZoneOffset; import com.opengamma.core.position.impl.SimplePortfolioNode; import com.opengamma.core.position.impl.SimplePosition; import com.opengamma.core.position.impl.SimpleTrade; import com.opengamma.core.security.impl.SimpleSecurityLink; import com.opengamma.financial.security.equity.EquitySecurity; import com.opengamma.financial.security.fx.FXForwardSecurity; import com.opengamma.id.ExternalId; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; /** * Tests that {@link AnalyticsNode.PortfolioNodeBuilder} creates nodes that match a portfolio structure. */ @Test(groups = TestGroup.UNIT) public class AnalyticsNodeBuilderTest { @Test public void emptyPortfolio() { AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(new SimplePortfolioNode()).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(0, root.getEndRow()); assertTrue(root.getChildren().isEmpty()); } @Test public void flatPortfolio() { SimplePortfolioNode portfolioRoot = new SimplePortfolioNode(""); portfolioRoot.addPosition(new SimplePosition()); portfolioRoot.addPosition(new SimplePosition()); portfolioRoot.addPosition(new SimplePosition()); portfolioRoot.addPosition(new SimplePosition()); portfolioRoot.addPosition(new SimplePosition()); AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(portfolioRoot).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(5, root.getEndRow()); // 1 node for the root and one each for the positions assertTrue(root.getChildren().isEmpty()); } @Test public void subNodesAndPositions() { /* 0 root 1 |_pos 2 |_pos 3 |_child1 4 |_pos 5 |_pos */ SimplePortfolioNode portfolioChild = new SimplePortfolioNode(); portfolioChild.addPosition(new SimplePosition()); portfolioChild.addPosition(new SimplePosition()); SimplePortfolioNode portfolioRoot = new SimplePortfolioNode(""); portfolioRoot.addChildNode(portfolioChild); portfolioRoot.addPosition(new SimplePosition()); portfolioRoot.addPosition(new SimplePosition()); AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(portfolioRoot).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(5, root.getEndRow()); assertEquals(1, root.getChildren().size()); AnalyticsNode child = root.getChildren().get(0); assertEquals(3, child.getStartRow()); assertEquals(5, child.getEndRow()); assertTrue(child.getChildren().isEmpty()); } @Test public void deeplyNested() { /* 0 root 1 |_pos 2 |_child1 3 |_pos 4 |_pos 5 |_child2 6 |_pos 7 |_pos 8 |_child3 9 |_pos 10 |_pos */ SimplePortfolioNode portfolioRoot = new SimplePortfolioNode(); portfolioRoot.addPosition(new SimplePosition()); SimplePortfolioNode portfolioChild1 = new SimplePortfolioNode(); portfolioChild1.addPosition(new SimplePosition()); portfolioChild1.addPosition(new SimplePosition()); SimplePortfolioNode portfolioChild2 = new SimplePortfolioNode(); portfolioChild2.addPosition(new SimplePosition()); portfolioChild2.addPosition(new SimplePosition()); SimplePortfolioNode portfolioChild3 = new SimplePortfolioNode(); portfolioChild3.addPosition(new SimplePosition()); portfolioChild3.addPosition(new SimplePosition()); portfolioRoot.addChildNode(portfolioChild1); portfolioChild1.addChildNode(portfolioChild2); portfolioChild2.addChildNode(portfolioChild3); AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(portfolioRoot).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(10, root.getEndRow()); assertEquals(1, root.getChildren().size()); AnalyticsNode child1 = root.getChildren().get(0); assertEquals(2, child1.getStartRow()); assertEquals(10, child1.getEndRow()); assertEquals(1, child1.getChildren().size()); AnalyticsNode child2 = child1.getChildren().get(0); assertEquals(5, child2.getStartRow()); assertEquals(10, child2.getEndRow()); assertEquals(1, child2.getChildren().size()); AnalyticsNode child3 = child2.getChildren().get(0); assertEquals(8, child3.getStartRow()); assertEquals(10, child3.getEndRow()); assertTrue(child3.getChildren().isEmpty()); } @Test public void multipleChildren() { /* 0 root 1 |_child1 2 | |_pos 3 |_child2 4 |_pos */ SimplePortfolioNode portfolioRoot = new SimplePortfolioNode(); SimplePortfolioNode portfolioChild1 = new SimplePortfolioNode(); portfolioChild1.addPosition(new SimplePosition()); SimplePortfolioNode portfolioChild2 = new SimplePortfolioNode(); portfolioChild2.addPosition(new SimplePosition()); portfolioRoot.addChildNode(portfolioChild1); portfolioRoot.addChildNode(portfolioChild2); AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(portfolioRoot).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(4, root.getEndRow()); assertEquals(2, root.getChildren().size()); AnalyticsNode child1 = root.getChildren().get(0); assertEquals(1, child1.getStartRow()); assertEquals(2, child1.getEndRow()); assertTrue(child1.getChildren().isEmpty()); AnalyticsNode child2 = root.getChildren().get(1); assertEquals(3, child2.getStartRow()); assertEquals(4, child2.getEndRow()); assertTrue(child2.getChildren().isEmpty()); } @Test public void fungibleTrades() { /* 0 root 1 |_pos1 2 | |_trade1 3 | |_trade2 4 |_pos2 5 |_trade3 */ EquitySecurity security = new EquitySecurity("exchange", "exchangeCode", "companyName", Currency.USD); SimplePortfolioNode portfolioRoot = new SimplePortfolioNode(); SimplePosition position1 = new SimplePosition(); SimpleSecurityLink securityLink = new SimpleSecurityLink(); securityLink.setTarget(security); position1.setSecurityLink(securityLink); position1.addTrade(new SimpleTrade()); position1.addTrade(new SimpleTrade()); SimplePosition position2 = new SimplePosition(); position2.setSecurityLink(securityLink); position2.addTrade(new SimpleTrade()); portfolioRoot.addPosition(position1); portfolioRoot.addPosition(position2); AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(portfolioRoot).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(5, root.getEndRow()); assertEquals(2, root.getChildren().size()); AnalyticsNode position1Node = root.getChildren().get(0); assertEquals(1, position1Node.getStartRow()); assertEquals(3, position1Node.getEndRow()); assertTrue(position1Node.getChildren().isEmpty()); AnalyticsNode position2Node = root.getChildren().get(1); assertEquals(4, position2Node.getStartRow()); assertEquals(5, position2Node.getEndRow()); assertTrue(position2Node.getChildren().isEmpty()); } @Test public void otcTrades() { /* 0 root 1 |_pos/trade1 2 |_pos/trade2 */ FXForwardSecurity security = new FXForwardSecurity(Currency.GBP, 123, Currency.USD, 321, LocalDate.of(2012, 12, 21).atTime(11, 0).atZone(ZoneOffset.UTC), ExternalId.of("Reg", "ABC")); SimplePortfolioNode portfolioRoot = new SimplePortfolioNode(); SimplePosition position1 = new SimplePosition(); SimpleSecurityLink securityLink = new SimpleSecurityLink(); securityLink.setTarget(security); position1.setSecurityLink(securityLink); position1.addTrade(new SimpleTrade()); SimplePosition position2 = new SimplePosition(); position2.setSecurityLink(securityLink); position2.addTrade(new SimpleTrade()); portfolioRoot.addPosition(position1); portfolioRoot.addPosition(position2); AnalyticsNode root = new AnalyticsNode.PortfolioNodeBuilder(portfolioRoot).getRoot(); assertEquals(0, root.getStartRow()); assertEquals(2, root.getEndRow()); assertEquals(0, root.getChildren().size()); } }