/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.portfolio;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.util.Iterator;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.opengamma.integration.tool.portfolio.xml.TradePositionResolver;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class TradePositionResolverTest {
@Test(expectedExceptions = IllegalArgumentException.class)
public void testTradeIdsCannotBeNull() {
new TradePositionResolver(null);
}
@Test(expectedExceptions = IllegalStateException.class)
public void testGetPositionsCannotBeCalledBeforeResolve() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.getPositions();
}
@Test(expectedExceptions = IllegalStateException.class)
public void testGetOrphansCannotBeCalledBeforeResolve() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.getOrphans();
}
@Test(expectedExceptions = IllegalStateException.class)
public void testGetDuplicatesCannotBeCalledBeforeResolve() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.getDuplicateTrades();
}
@Test(expectedExceptions = IllegalStateException.class)
public void testGetUnknownsCannotBeCalledBeforeResolve() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.getUnknownTrades();
}
@Test
public void testPositionsAreEmptyWhenNoneAdded() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.resolve();
assertTrue(resolver.getPositions().isEmpty());
}
@Test
public void testAllTradesAreOrphansWhenNoPositionsAdded() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1", "T2"));
resolver.resolve();
assertEquals(resolver.getOrphans(), ImmutableSet.of("T1", "T2"));
}
@Test(expectedExceptions = IllegalStateException.class)
public void testPositionsCannotBeAddedAfterResolve() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.resolve();
resolver.addToPosition("P1", "T1");
}
@Test
public void testSimplePositionAddition() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.addToPosition("P1", "T1");
resolver.resolve();
assertFalse(resolver.getOrphans().iterator().hasNext());
Multimap<String, String> positions = resolver.getPositions();
assertEquals(positions.size(), 1);
assertEquals(positions.get("P1"), ImmutableSet.of("T1"));
}
@Test
public void testDuplicatePositionTradeCombinationIsNotIgnored() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.addToPosition("P1", "T1");
resolver.addToPosition("P1", "T1");
resolver.resolve();
assertFalse(resolver.getOrphans().iterator().hasNext());
Multimap<String, String> positions = resolver.getPositions();
assertEquals(positions.size(), 2);
assertEquals(positions.get("P1"), ImmutableList.of("T1", "T1"));
}
@Test
public void testPositionAddition() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1","T2","T3","T4","T5"));
resolver.addToPosition("P1", "T1");
resolver.addToPosition("P2", "T2");
resolver.addToPosition("P1", "T3");
resolver.addToPosition("P2", "T4");
resolver.addToPosition("P1", "T5");
resolver.resolve();
assertFalse(resolver.getOrphans().iterator().hasNext());
Multimap<String, String> positions = resolver.getPositions();
assertEquals(positions.keySet().size(), 2);
assertEquals(positions.size(), 5);
assertEquals(positions.get("P1"), ImmutableSet.of("T1","T3","T5"));
assertEquals(positions.get("P2"), ImmutableSet.of("T2","T4"));
}
@Test
public void testMissingTradesAreIdentified() {
// The XMl load process should mean this can't happen in
// the actual load, but ...
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.addToPosition("P1", "T1");
resolver.addToPosition("P1", "T2");
resolver.resolve();
assertEquals(ImmutableSet.copyOf(resolver.getUnknownTrades()), ImmutableSet.of("T2"));
}
@Test
public void testDuplicatedTradesAreIdentified() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1"));
resolver.addToPosition("P1", "T1");
resolver.addToPosition("P2", "T1");
resolver.resolve();
// Multimap comparison seems somewhat awkward, therefore do comparisons with
// the more familiar java collection methods
Multimap<String, String> duplicateTrades = resolver.getDuplicateTrades();
assertEquals(duplicateTrades.keySet().size(), 1);
assertEquals(duplicateTrades.get("T1"), ImmutableSet.of("P1", "P2"));
}
@Test
public void testCombined() {
TradePositionResolver resolver = new TradePositionResolver(ImmutableSet.of("T1","T2","T3","T4","T5"));
resolver.addToPosition("P1", "T1");
resolver.addToPosition("P2", "T1");
resolver.addToPosition("P2", "T2");
resolver.addToPosition("P1", "T3");
resolver.addToPosition("P2", "T4");
resolver.addToPosition("P3", "T6");
resolver.resolve();
Iterator<String> orphans = resolver.getOrphans().iterator();
assertEquals(orphans.next(), "T5");
assertFalse(orphans.hasNext());
Multimap<String, String> positions = resolver.getPositions();
assertEquals(positions.keySet().size(), 3);
assertEquals(positions.get("P1"), ImmutableList.of("T1", "T3"));
assertEquals(positions.get("P2"), ImmutableList.of("T1", "T2", "T4"));
assertEquals(positions.get("P3"), ImmutableList.of("T6"));
assertEquals(ImmutableSet.copyOf(resolver.getUnknownTrades()), ImmutableSet.of("T6"));
Multimap<String, String> duplicateTrades = resolver.getDuplicateTrades();
assertEquals(duplicateTrades.keySet().size(), 1);
assertEquals(duplicateTrades.get("T1"), ImmutableSet.of("P1", "P2"));
}
}