/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.position; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import java.math.BigDecimal; import java.util.List; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.opengamma.core.position.impl.SimplePortfolioNode; import com.opengamma.core.position.impl.SimplePosition; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdSupplier; import com.opengamma.util.test.AbstractFudgeBuilderTestCase; import com.opengamma.util.test.TestGroup; /** * Test {@link PortfolioNodeFudgeBuilder} and {@link PositionFudgeBuilder}. */ @Test(groups = TestGroup.UNIT) public class PortfolioNodeAndPositionFudgeEncodingTest extends AbstractFudgeBuilderTestCase { private static final Logger s_logger = LoggerFactory.getLogger(PortfolioNodeAndPositionFudgeEncodingTest.class); private UniqueIdSupplier _uniqueIdSupplier; @BeforeMethod public void init() { _uniqueIdSupplier = new UniqueIdSupplier("PortfolioNodeBuilderTest"); } private UniqueId nextUniqueId() { return _uniqueIdSupplier.get(); } private void linkNodes(final SimplePortfolioNode parent, final SimplePortfolioNode child) { child.setParentNodeId(parent.getUniqueId()); parent.addChildNode(child); } private SimplePortfolioNode[] createPortfolioNodes() { final SimplePortfolioNode nodes[] = new SimplePortfolioNode[7]; for (int i = 0; i < nodes.length; i++) { nodes[i] = new SimplePortfolioNode(nextUniqueId(), "node " + i); } linkNodes(nodes[0], nodes[1]); linkNodes(nodes[0], nodes[2]); linkNodes(nodes[1], nodes[3]); linkNodes(nodes[1], nodes[4]); linkNodes(nodes[2], nodes[5]); linkNodes(nodes[2], nodes[6]); return nodes; } private void addPositions(final SimplePortfolioNode node, final int num) { for (int i = 0; i < num; i++) { node.addPosition(new SimplePosition(nextUniqueId(), new BigDecimal(10), ExternalId.of("Security", "Foo"))); } } private SimplePortfolioNode createPortfolioWithPositions() { final SimplePortfolioNode[] nodes = createPortfolioNodes(); addPositions(nodes[1], 1); addPositions(nodes[3], 2); addPositions(nodes[5], 1); addPositions(nodes[6], 2); return nodes[0]; } private void assertPortfolioNodeEquals(final PortfolioNode expected, final PortfolioNode actual) { assertNotNull(expected); assertNotNull(actual); s_logger.debug("testing portfolio node {}", expected.getUniqueId()); assertEquals(expected.getUniqueId(), actual.getUniqueId()); assertEquals(expected.getName(), actual.getName()); assertEquals(expected.size(), actual.size()); assertEquals(expected.getParentNodeId(), actual.getParentNodeId()); final List<PortfolioNode> expectedChildren = expected.getChildNodes(); final List<PortfolioNode> actualChildren = actual.getChildNodes(); assertNotNull(expectedChildren); assertNotNull(actualChildren); assertEquals(expectedChildren.size(), actualChildren.size()); for (int i = 0; i < expectedChildren.size(); i++) { s_logger.debug("testing child {} of {}", i, actual.getUniqueId()); assertPortfolioNodeEquals(expectedChildren.get(i), actualChildren.get(i)); } final List<Position> expectedPositions = expected.getPositions(); final List<Position> actualPositions = actual.getPositions(); assertNotNull(expectedPositions); assertNotNull(actualPositions); assertEquals(expectedPositions.size(), actualPositions.size()); for (int i = 0; i < expectedPositions.size(); i++) { s_logger.debug("testing position {} of {}", i, actual.getUniqueId()); assertPositionEquals(expectedPositions.get(i), actualPositions.get(i)); } } private void assertPositionEquals(final Position expected, final Position actual) { assertNotNull(expected); assertNotNull(actual); s_logger.debug("testing position {}", expected.getUniqueId()); assertEquals(expected.getUniqueId(), actual.getUniqueId()); assertEquals(expected.getQuantity(), actual.getQuantity()); assertEquals(expected.getSecurityLink(), actual.getSecurityLink()); } private FudgeMsg runPortfolioNodeTest(final PortfolioNode original) { final FudgeMsg message = getFudgeSerializer().objectToFudgeMsg(original); s_logger.debug("Message = {}", message); final PortfolioNode portfolio = getFudgeDeserializer().fudgeMsgToObject(PortfolioNode.class, message); assertPortfolioNodeEquals(original, portfolio); return message; } private int countParents(final FudgeMsg message) { int count = 0; for (FudgeField field : message) { if (PortfolioNodeFudgeBuilder.PARENT_FIELD_NAME.equals(field.getName())) { s_logger.debug("Found parent ref {}", field.getValue()); count++; } else if (field.getValue() instanceof FudgeMsg) { count += countParents((FudgeMsg) field.getValue()); } } return count; } public void testPortfolio() { final FudgeMsg message = runPortfolioNodeTest(createPortfolioNodes()[0]); assertEquals(0, countParents(message)); } public void testPortfolioWithPositions() { final FudgeMsg message = runPortfolioNodeTest(createPortfolioWithPositions()); assertEquals(0, countParents(message)); } public void testPortfolioWithParent() { final SimplePortfolioNode root = createPortfolioNodes()[0]; root.setParentNodeId(nextUniqueId()); final FudgeMsg message = runPortfolioNodeTest(root); assertEquals(1, countParents(message)); } private FudgeMsg runPositionTest(final Position original) { final FudgeMsg message = getFudgeSerializer().objectToFudgeMsg(original); s_logger.debug("Message = {}", message); final Position position = getFudgeDeserializer().fudgeMsgToObject(Position.class, message); assertPositionEquals(original, position); return message; } public void testPosition() { final FudgeMsg message = runPositionTest(new SimplePosition(nextUniqueId(), new BigDecimal(100), ExternalIdBundle.of(ExternalId.of("Scheme 1", "Id 1"), ExternalId .of("Scheme 2", "Id 2")))); assertEquals(0, countParents(message)); } }