/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.portfolio.impl;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.DataNotFoundException;
import com.opengamma.id.ObjectIdSupplier;
import com.opengamma.id.UniqueId;
import com.opengamma.master.portfolio.ManageablePortfolio;
import com.opengamma.master.portfolio.ManageablePortfolioNode;
import com.opengamma.master.portfolio.PortfolioDocument;
import com.opengamma.util.test.TestGroup;
/**
* Tests {@link DynamicDelegatingPortfolioMaster}.
*/
@Test(groups = TestGroup.UNIT)
public class DynamicDelegatingPortfolioMasterTest {
private final String schemeA = "A";
private final String schemeB = "B";
private final ObjectIdSupplier schemeAProvider = new ObjectIdSupplier(schemeA);
private final ObjectIdSupplier schemeBProvider = new ObjectIdSupplier(schemeB);
@Test(expectedExceptions = DataNotFoundException.class)
void test_DefaultDelegateShouldNotFindAnyData() {
final UniqueId doesNotExist = UniqueId.of(schemeA,"DoesNotExist");
DynamicDelegatingPortfolioMaster sut = new DynamicDelegatingPortfolioMaster();
sut.get(doesNotExist);
}
@Test
void test_AddSomeDelegates() {
PortfolioDocument portA = generatePortfolio("PortA", schemeAProvider);
PortfolioDocument portB = generatePortfolio("PortB", schemeBProvider);
DynamicDelegatingPortfolioMaster sut = new DynamicDelegatingPortfolioMaster();
sut.register(schemeA, new InMemoryPortfolioMaster(schemeAProvider));
PortfolioDocument addedPortA = sut.add(schemeA, portA);
assertEquals(addedPortA, portA, "adding the document had unexpected side effect");
PortfolioDocument fetchedPortA = sut.get(addedPortA.getUniqueId());
assertEquals(fetchedPortA, portA, "unable to fetch same document right after adding");
sut.register(schemeB, new InMemoryPortfolioMaster(schemeBProvider));
PortfolioDocument addedPortB = sut.add(schemeB, portB);
assertEquals(addedPortB, portB, "adding the document had unexpected side effect");
PortfolioDocument fetchedPortB = sut.get(addedPortB.getUniqueId());
assertEquals(fetchedPortB, portB, "unable to fetch same document right after adding");
fetchedPortA = sut.get(addedPortA.getUniqueId());
assertEquals(fetchedPortA, portA, "unable to fetch document a second time");
fetchedPortB = sut.get(addedPortB.getUniqueId());
assertEquals(fetchedPortB, portB, "unable to fetch document a second time");
}
@Test(expectedExceptions = DataNotFoundException.class)
void test_RemovingDelegates() {
PortfolioDocument portA = generatePortfolio("PortA", schemeAProvider);
PortfolioDocument portB = generatePortfolio("PortB", schemeBProvider);
DynamicDelegatingPortfolioMaster sut = new DynamicDelegatingPortfolioMaster();
sut.register(schemeA, new InMemoryPortfolioMaster(schemeAProvider));
UniqueId addedPort = sut.add(schemeA, portA).getUniqueId();
sut.register(schemeB, new InMemoryPortfolioMaster(schemeBProvider));
sut.add(schemeB, portB);
sut.deregister(schemeA);
sut.get(addedPort); // will throw data not found exception because we deregistered scheme A
}
private PortfolioDocument generatePortfolio(String name, ObjectIdSupplier provider) {
ManageablePortfolioNode rootNode = generatePortfolioNodes(name, provider, 2, 2);
PortfolioDocument document = new PortfolioDocument(new ManageablePortfolio(name, rootNode));
return document;
}
private ManageablePortfolioNode generatePortfolioNodes(String namePrefix, ObjectIdSupplier provider, int width, int depth) {
ManageablePortfolioNode root = new ManageablePortfolioNode(namePrefix);
root.addPosition(provider.get());
if (depth > 0) {
for (int i = 0; i < width; i++) {
root.addChildNode(generatePortfolioNodes(namePrefix + "-" + depth + "-" + i, provider, width, depth - 1));
}
}
return root;
}
}