package org.marketcetera.messagehistory;
import java.math.BigDecimal;
import junit.framework.Test;
import org.marketcetera.core.ExpectedTestFailure;
import org.marketcetera.core.FIXVersionTestSuite;
import org.marketcetera.core.FIXVersionedTestCase;
import org.marketcetera.core.position.impl.ExpectedListChanges;
import org.marketcetera.quickfix.FIXVersion;
import org.marketcetera.trade.BrokerID;
import org.marketcetera.trade.Equity;
import org.marketcetera.trade.ExecutionReport;
import org.marketcetera.trade.Factory;
import org.marketcetera.trade.MessageCreationException;
import org.marketcetera.trade.Option;
import org.marketcetera.trade.OptionType;
import org.marketcetera.trade.Originator;
import quickfix.Message;
import quickfix.field.AvgPx;
import quickfix.field.CumQty;
import quickfix.field.ExecTransType;
import quickfix.field.ExecType;
import quickfix.field.LeavesQty;
import quickfix.field.MsgType;
import quickfix.field.OrdStatus;
import quickfix.field.Side;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.event.ListEvent;
/* $License$ */
/**
* Test {@link AveragePriceReportListTest}.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: AveragePriceReportListTest.java 16161 2012-07-16 20:27:32Z colin $
* @since 1.0.0
*/
public class AveragePriceReportListTest extends FIXVersionedTestCase {
public AveragePriceReportListTest(String inName, FIXVersion version) {
super(inName, version);
}
public static Test suite() {
return new FIXVersionTestSuite(AveragePriceReportListTest.class,
FIXVersionTestSuite.ALL_FIX_VERSIONS);
}
public void testInsertExecutionReport() throws Exception {
EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
Message message = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.NEW, Side.BUY, new BigDecimal(300), null,
new BigDecimal(0), new BigDecimal(0), new BigDecimal(0),
new BigDecimal(0), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(300.0));
source.add(new ReportHolder(createReport(message), "IBM"));
assertEquals(0, averagePriceList.size());
Message message2 = msgFactory.newExecutionReport("clordid1",
"clordid1", "execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY,
new BigDecimal(300), new BigDecimal(111),null, new BigDecimal(
111), new BigDecimal(110), new BigDecimal(111),
new Equity("IBM"), "account", "text");
message2.setField(new LeavesQty(190.0));
source.add(new ReportHolder(createReport(message2), "IBM"));
message2.setField(new ExecTransType(ExecTransType.NEW));
message2.setField(new ExecType(ExecType.PARTIAL_FILL));
assertEquals(0, averagePriceList.size());
Message message5 = msgFactory.newExecutionReport("clordid1",
"clordid1", "execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY,
new BigDecimal(300), new BigDecimal(111), new BigDecimal(110), null,
new BigDecimal(110), new BigDecimal(111),
new Equity("IBM"), "account", "text");
message5.setField(new LeavesQty(190.0));
source.add(new ReportHolder(createReport(message5), "IBM"));
message5.setField(new ExecTransType(ExecTransType.NEW));
message5.setField(new ExecType(ExecType.PARTIAL_FILL));
assertEquals(0, averagePriceList.size());
Message message3 = msgFactory.newExecutionReport("clordid1",
"clordid1", "execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY,
new BigDecimal(300), new BigDecimal(111), new BigDecimal(110), new BigDecimal(
111), new BigDecimal(110), new BigDecimal(111),
new Equity("IBM"), "account", "text");
message3.setField(new LeavesQty(190.0));
source.add(new ReportHolder(createReport(message3), "IBM"));
assertEquals(1, averagePriceList.size());
Message avgPriceMessage = averagePriceList.get(0).getMessage();
assertEquals(MsgType.EXECUTION_REPORT, avgPriceMessage.getHeader()
.getString(MsgType.FIELD));
assertEquals(110.0, avgPriceMessage.getDouble(CumQty.FIELD), .00001);
assertEquals(111, avgPriceMessage.getDouble(AvgPx.FIELD), .0001);
Message message4 = msgFactory.newExecutionReport("clordid1",
"clordid1", "execido1", OrdStatus.FILLED, Side.BUY,
new BigDecimal(300), new BigDecimal(55), new BigDecimal(190), new BigDecimal(55),
new BigDecimal(300), new BigDecimal(55), new Equity("IBM"),
"account", "text");
message4.setField(new ExecTransType(ExecTransType.NEW));
message4.setField(new ExecType(ExecType.FILL));
source.add(new ReportHolder(createReport(message4), "IBM"));
assertEquals(1, averagePriceList.size());
avgPriceMessage = averagePriceList.get(0).getMessage();
assertEquals(MsgType.EXECUTION_REPORT, avgPriceMessage.getHeader()
.getString(MsgType.FIELD));
assertEquals(300.0, avgPriceMessage.getDouble(CumQty.FIELD), .0001);
assertEquals(75.5333, avgPriceMessage.getDouble(AvgPx.FIELD), .0001);
}
public void testAddOrderFirst() throws Exception {
EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
Message message = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.NEW, Side.BUY, new BigDecimal(
1000), null, new BigDecimal(0), null, new BigDecimal(
100), new BigDecimal(3), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(1000));
message.setField(new ExecTransType(ExecTransType.NEW));
message.setField(new ExecType(ExecType.NEW));
source.add(new ReportHolder(createReport(message), "IBM"));
assertEquals(0, averagePriceList.size());
}
public void testRemove() throws Exception {
final EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
Message message = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY, new BigDecimal(10), new BigDecimal(5), new BigDecimal(2), new BigDecimal(5), new BigDecimal(
2), new BigDecimal(5), new Equity("IBM"), "account", "text");
Message message2 = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY, new BigDecimal(20), new BigDecimal(5), new BigDecimal(10), new BigDecimal(5), new BigDecimal(
10), new BigDecimal(5), new Equity("MSFT"), "account", "text");
source.add(new ReportHolder(createReport(message), "IBM"));
source.add(new ReportHolder(createReport(message2), "MSFT"));
assertEquals(2, averagePriceList.size());
// any remove empties the list (since TradeReportsHistory only supports clear())
source.addListEventListener(new ExpectedListChanges<ReportHolder>("avg", new int[] {
ListEvent.DELETE, 0, ListEvent.DELETE, 0 }));
source.remove(0);
assertEquals(0, averagePriceList.size());
}
public void testUpdate() throws Exception {
final EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
final Message message = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY, new BigDecimal(0), null, new BigDecimal(10), new BigDecimal(11), new BigDecimal(
10), new BigDecimal(11), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(90.0));
source.add(new ReportHolder(createReport(message), "IBM"));
assertEquals(1, averagePriceList.size());
new ExpectedTestFailure(UnsupportedOperationException.class) {
@Override
protected void execute() throws Throwable {
source.set(0, new ReportHolder(createReport(message), "IBM"));
}
}.run();
}
public void testInstrument() throws Exception {
if (fixVersion != FIXVersion.FIX40) {
EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
Option option = new Option("IBM", "200912", BigDecimal.ONE,
OptionType.Put);
Message message = msgFactory.newExecutionReport("clordid1",
"clordid1", "execido1", OrdStatus.PARTIALLY_FILLED, Side.BUY,
new BigDecimal(1000), new BigDecimal(1), new BigDecimal(100), new BigDecimal(1),
new BigDecimal(100), new BigDecimal(3), option, "account", "text");
message.setField(new LeavesQty(900));
message.setField(new ExecTransType(ExecTransType.NEW));
message.setField(new ExecType(ExecType.PARTIAL_FILL));
source.add(new ReportHolder(createReport(message), "IBM"));
assertEquals(1, averagePriceList.size());
ReportHolder holder = averagePriceList.get(0);
ExecutionReport avgPriceReport = (ExecutionReport) holder
.getReport();
assertEquals(option, avgPriceReport.getInstrument());
assertEquals("IBM", holder.getUnderlying());
}
}
public void testPendingStatusMessage() throws Exception {
final EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
Message message = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_NEW, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(0));
message.setField(new ExecTransType(ExecTransType.NEW));
message.setField(new ExecType(ExecType.NEW));
source.add(new ReportHolder(createReport(message), "IBM"));
assertEquals(0, averagePriceList.size());
Message message2 = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_REPLACE, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(0));
message.setField(new ExecTransType(ExecTransType.NEW));
message.setField(new ExecType(ExecType.NEW));
source.add(new ReportHolder(createReport(message2), "IBM"));
assertEquals(0, averagePriceList.size());
Message message3 = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_CANCEL, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(0));
message.setField(new ExecTransType(ExecTransType.NEW));
message.setField(new ExecType(ExecType.NEW));
source.add(new ReportHolder(createReport(message3), "IBM"));
assertEquals(0, averagePriceList.size());
}
public void testOriginatorMessage() throws Exception{
final EventList<ReportHolder> source = new BasicEventList<ReportHolder>();
AveragePriceReportList averagePriceList = new AveragePriceReportList(
FIXVersion.FIX_SYSTEM.getMessageFactory(), source);
final Message message = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_NEW, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message.setField(new LeavesQty(10));
source.add(new ReportHolder(Factory.getInstance().createExecutionReport(message,
new BrokerID("null"), Originator.Server, null, null), "IBM"));
assertEquals(0, averagePriceList.size());
Message message3 = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_REPLACE, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message3.setField(new LeavesQty(10));
source.add(new ReportHolder(Factory.getInstance().createExecutionReport(message,
new BrokerID("null"), Originator.Server, null, null), "IBM"));
assertEquals(0, averagePriceList.size());
Message message5 = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_CANCEL, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message5.setField(new LeavesQty(10));
source.add(new ReportHolder(Factory.getInstance().createExecutionReport(message,
new BrokerID("null"), Originator.Server, null, null), "IBM"));
assertEquals(0, averagePriceList.size());
Message message6 = msgFactory.newExecutionReport("clordid1", "clordid1",
"execido1", OrdStatus.PENDING_CANCEL, Side.BUY, new BigDecimal(
10), null, new BigDecimal(0), null, new BigDecimal(
0), new BigDecimal(0), new Equity("IBM"), "account", "text");
message6.setField(new LeavesQty(10));
source.add(new ReportHolder(Factory.getInstance().createExecutionReport(message,
new BrokerID("null"), Originator.Broker, null, null), "IBM"));
assertEquals(0, averagePriceList.size());
}
private ExecutionReport createReport(Message message)
throws MessageCreationException {
return Factory.getInstance().createExecutionReport(message,
new BrokerID("null"), Originator.Broker, null, null);
}
}