package org.marketcetera.core.position.impl;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import java.math.BigDecimal;
import org.junit.Test;
import org.marketcetera.core.position.Grouping;
import org.marketcetera.core.position.PositionRow;
import org.marketcetera.module.ExpectedFailure;
import org.marketcetera.trade.Equity;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
/* $License$ */
/**
* Test {@link SummaryRowUpdaterTest}.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: SummaryRowUpdaterTest.java 16154 2012-07-14 16:34:05Z colin $
* @since 1.5.0
*/
public class SummaryRowUpdaterTest {
@Test
public void constructor() throws Exception {
EventList<PositionRow> list = new BasicEventList<PositionRow>();
createAndAssert(list, "0", "0", "0", "0", "0", "0", "0");
list.add(new PositionRowImpl(null, null, null, null, BigDecimal.ZERO));
createAndAssert(list, "0", "0", null, null, null, null, null);
list = new BasicEventList<PositionRow>();
list.add(new PositionRowImpl(new Equity("ABC"), "ABC", "SYZ", "123", PositionMetricsImplTest.createMetrics(
"0", "5", "4", "3", "2", "1", "7")));
createAndAssert(list, "0", "5", "4", "3", "2", "1", "7");
list = new BasicEventList<PositionRow>();
list.add(new PositionRowImpl(new Equity("ABC"), "ABC", "SYZ", "123", PositionMetricsImplTest.createMetrics(
"0", "5", "4", "3", "2", "1", "7")));
list.add(new PositionRowImpl(null, null, null, null, PositionMetricsImplTest.createMetrics("1",
"4.5", "14", null, "-52", "18", "97")));
createAndAssert(list, "1", "9.5", "18", null, "-50", "19", "104");
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new SummaryRowUpdater(null);
}
};
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new SummaryRowUpdater(new PositionRowImpl(null, null, null, null, BigDecimal.ZERO));
}
};
}
@Test
public void testListChanged() throws Exception {
EventList<PositionRow> list = new BasicEventList<PositionRow>();
PositionRowImpl summary = createTestSummary(list);
SummaryRowUpdater fixture = new SummaryRowUpdater(summary);
assertSummary(fixture, summary, "0", "0", "0", "0", "0", "0", "0");
// add a position
PositionRowImpl microsoft = new PositionRowImpl(new Equity("MSFT"), "MSFT", "Account", "Yoram", BigDecimal.ZERO);
list.add(microsoft);
assertSummary(fixture, summary, "0", "0", null, null, null, null, null);
// start over with a position already in the list
fixture.dispose();
fixture = new SummaryRowUpdater(summary);
assertSummary(fixture, summary, "0", "0", null, null, null, null, null);
// update position
microsoft.setPositionMetrics(PositionMetricsImplTest.createMetrics("0", "5", "-4", "3",
"2", "1", "7"));
list.set(0, microsoft);
assertSummary(fixture, summary, "0", "5", "-4", "3", "2", "1", "7");
// update again
microsoft.setPositionMetrics(PositionMetricsImplTest.createMetrics("1", "3", "2.2", "77",
"11", "10000.3", "123"));
list.set(0, microsoft);
assertSummary(fixture, summary, "1", "3", "2.2", "77", "11", "10000.3", "123");
// add a new position
PositionRowImpl ibm = new PositionRowImpl(new Equity("IBM"), "IBM", "Account",
"Yoram", PositionMetricsImplTest.createMetrics("4", "7", "8", "3", "9", ".7", "7"));
list.add(ibm);
assertSummary(fixture, summary, "5", "10", "10.2", "80", "20", "10001", "130");
// remove a position
list.remove(0);
assertSummary(fixture, summary, "4", "7", "8", "3", "9", ".7", "7");
// remove the other position
list.remove(0);
assertSummary(fixture, summary, "0", "0", "0", "0", "0", "0", "0");
// add a row back
list.add(microsoft);
assertSummary(fixture, summary, "1", "3", "2.2", "77", "11", "10000.3", "123");
// dispose and make sure successive addition is not processed
fixture.dispose();
list.add(ibm);
assertSummary(fixture, summary, "1", "3", "2.2", "77", "11", "10000.3", "123");
}
private void createAndAssert(EventList<PositionRow> list, String incomingPosition,
String position, String positional, String trading, String realized, String unrealized,
String total) {
// the symbol, account, trader, and grouping values don't matter to a SummaryRowUpdater
PositionRowImpl summary = createTestSummary(list);
SummaryRowUpdater fixture = new SummaryRowUpdater(summary);
assertSummary(fixture, summary, incomingPosition, position, positional, trading, realized,
unrealized, total);
}
private PositionRowImpl createTestSummary(EventList<PositionRow> list) {
return new PositionRowImpl(new Equity("ABC"), "ABC", "XYZ", "123", new Grouping[] { Grouping.Account }, list);
}
private void assertSummary(SummaryRowUpdater fixture, PositionRow summary,
String incomingPosition, String position, String positional, String trading,
String realized, String unrealized, String total) {
assertThat(fixture.getSummary(), sameInstance(summary));
PositionMetricsImplTest.assertPositionMetrics(summary.getPositionMetrics(), incomingPosition, position,
positional, trading, realized, unrealized, total);
}
}