package org.marketcetera.util.quickfix;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.apache.log4j.Level;
import org.junit.Test;
import quickfix.Message;
import quickfix.field.Account;
import quickfix.field.ClOrdID;
import quickfix.field.HandlInst;
import quickfix.field.Issuer;
import quickfix.field.MDEntryPx;
import quickfix.field.MDEntrySize;
import quickfix.field.MDEntryType;
import quickfix.field.MsgSeqNum;
import quickfix.field.NoMDEntries;
import quickfix.field.OrdType;
import quickfix.field.OrderID;
import quickfix.field.QuoteEntryID;
import quickfix.field.QuoteSetID;
import quickfix.field.SenderCompID;
import quickfix.field.SendingTime;
import quickfix.field.Side;
import quickfix.field.Symbol;
import quickfix.field.TargetCompID;
import quickfix.field.TransactTime;
import quickfix.field.UnderlyingIssuer;
import quickfix.fix42.MarketDataSnapshotFullRefresh;
import quickfix.fix42.MassQuote;
import quickfix.fix42.NewOrderSingle;
import static org.junit.Assert.*;
/**
* @author tlerios@marketcetera.com
* @since 1.0.0
* @version $Id: AnalyzedMessageTest.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
public class AnalyzedMessageTest
extends AnalyzerTestBase
{
@Test
public void empty()
throws Exception
{
NewOrderSingle msg=new NewOrderSingle();
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertNoEvents();
assertEquals(3,msgA.getHeader().size());
assertEquals(0,msgA.getBody().size());
assertEquals(1,msgA.getTrailer().size());
assertEquals
(TEST_HEADER+"5"+
SystemUtils.LINE_SEPARATOR+
" MsgType [35R] = NewOrderSingle [D]"+
TEST_FOOTER+"181",msgA.toString());
}
@Test
public void valid()
throws Exception
{
NewOrderSingle msg=new NewOrderSingle();
// Required header fields.
msg.getHeader().setField(new SenderCompID("me"));
msg.getHeader().setField(new TargetCompID("you"));
msg.getHeader().setField(new MsgSeqNum(1));
msg.getHeader().setField(new SendingTime(new Date(2)));
// Required body fields.
msg.set(new ClOrdID("a"));
msg.set(new HandlInst(HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE));
msg.set(new TransactTime(new Date(3)));
msg.set(new OrdType(OrdType.LIMIT));
msg.set(new Symbol("METC"));
// A required enumeration.
msg.set(new Side(Side.BUY));
// An optional non-enumeration.
msg.set(new Account("metc"));
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertNoEvents();
assertEquals(7,msgA.getHeader().size());
assertEquals(7,msgA.getBody().size());
assertEquals(1,msgA.getTrailer().size());
assertEquals
(SystemUtils.LINE_SEPARATOR+
"Header"+
SystemUtils.LINE_SEPARATOR+
" BeginString [8R] = FIX.4.2"+
SystemUtils.LINE_SEPARATOR+
" BodyLength [9R] = 108"+
SystemUtils.LINE_SEPARATOR+
" MsgSeqNum [34R] = 1"+
SystemUtils.LINE_SEPARATOR+
" MsgType [35R] = NewOrderSingle [D]"+
SystemUtils.LINE_SEPARATOR+
" SenderCompID [49R] = me"+
SystemUtils.LINE_SEPARATOR+
" SendingTime [52R] = 19700101-00:00:00.002"+
SystemUtils.LINE_SEPARATOR+
" TargetCompID [56R] = you"+
SystemUtils.LINE_SEPARATOR+
"Body"+
SystemUtils.LINE_SEPARATOR+
" Account [1] = metc"+
SystemUtils.LINE_SEPARATOR+
" ClOrdID [11R] = a"+
SystemUtils.LINE_SEPARATOR+
" HandlInst [21R] = "+
"AUTOMATED_EXECUTION_ORDER_PRIVATE_NO_BROKER_INTERVENTION [1]"+
SystemUtils.LINE_SEPARATOR+
" OrdType [40R] = LIMIT [2]"+
SystemUtils.LINE_SEPARATOR+
" Side [54R] = BUY [1]"+
SystemUtils.LINE_SEPARATOR+
" Symbol [55R] = METC"+
SystemUtils.LINE_SEPARATOR+
" TransactTime [60R] = 19700101-00:00:00.003"+
TEST_FOOTER+"076",msgA.toString());
}
@Test
public void group()
throws Exception
{
MarketDataSnapshotFullRefresh msg=
new MarketDataSnapshotFullRefresh(new Symbol("QF"));
MarketDataSnapshotFullRefresh.NoMDEntries group=
new MarketDataSnapshotFullRefresh.NoMDEntries();
group.set(new MDEntryType(MDEntryType.BID));
group.set(new MDEntryPx(2));
group.set(new MDEntrySize(16));
group.set(new OrderID("ID1"));
msg.addGroup(group);
group=new MarketDataSnapshotFullRefresh.NoMDEntries();
group.set(new MDEntryType('?'));
group.set(new MDEntryPx(4));
group.set(new MDEntrySize(32));
group.set(new OrderID("ID2"));
msg.addGroup(group);
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertNoEvents();
assertEquals(3,msgA.getHeader().size());
assertEquals(2,msgA.getBody().size());
assertEquals(4,msgA.getBody().get(1).getGroups().
get(0).getFields().size());
assertEquals(4,msgA.getBody().get(1).getGroups().
get(1).getFields().size());
assertEquals(1,msgA.getTrailer().size());
assertEquals
(TEST_HEADER+"69"+
SystemUtils.LINE_SEPARATOR+
" MsgType [35R] = MarketDataSnapshotFullRefresh [W]"+
SystemUtils.LINE_SEPARATOR+
"Body"+
SystemUtils.LINE_SEPARATOR+
" Symbol [55R] = QF"+
SystemUtils.LINE_SEPARATOR+
" NoMDEntries [268R] = 2"+
SystemUtils.LINE_SEPARATOR+
" Group 1"+
SystemUtils.LINE_SEPARATOR+
" MDEntryType [269R] = BID [0]"+
SystemUtils.LINE_SEPARATOR+
" OrderID [37] = ID1"+
SystemUtils.LINE_SEPARATOR+
" MDEntryPx [270R] = 2"+
SystemUtils.LINE_SEPARATOR+
" MDEntrySize [271] = 16"+
SystemUtils.LINE_SEPARATOR+
" Group 2"+
SystemUtils.LINE_SEPARATOR+
" MDEntryType [269R] = ? [invalid]"+
SystemUtils.LINE_SEPARATOR+
" OrderID [37] = ID2"+
SystemUtils.LINE_SEPARATOR+
" MDEntryPx [270R] = 4"+
SystemUtils.LINE_SEPARATOR+
" MDEntrySize [271] = 32"+
TEST_FOOTER+"219",msgA.toString());
}
@Test
public void nestedGroup()
throws Exception
{
MassQuote msg=new MassQuote();
MassQuote.NoQuoteSets topGroup=new MassQuote.NoQuoteSets();
topGroup.set(new QuoteSetID("TID1"));
topGroup.set(new UnderlyingIssuer("UI1"));
MassQuote.NoQuoteSets.NoQuoteEntries nestedGroup=
new MassQuote.NoQuoteSets.NoQuoteEntries();
nestedGroup.set(new QuoteEntryID("NID1.1"));
nestedGroup.set(new Issuer("I1.1"));
topGroup.addGroup(nestedGroup);
nestedGroup=new MassQuote.NoQuoteSets.NoQuoteEntries();
nestedGroup.set(new QuoteEntryID("NID1.2"));
nestedGroup.set(new Issuer("I1.2"));
topGroup.addGroup(nestedGroup);
msg.addGroup(topGroup);
topGroup=new MassQuote.NoQuoteSets();
topGroup.set(new QuoteSetID("TID2"));
topGroup.set(new UnderlyingIssuer("UI2"));
nestedGroup=new MassQuote.NoQuoteSets.NoQuoteEntries();
nestedGroup.set(new QuoteEntryID("NID2.1"));
nestedGroup.set(new Issuer("I2.1"));
topGroup.addGroup(nestedGroup);
nestedGroup=new MassQuote.NoQuoteSets.NoQuoteEntries();
nestedGroup.set(new QuoteEntryID("NID2.2"));
nestedGroup.set(new Issuer("I2.2"));
topGroup.addGroup(nestedGroup);
msg.addGroup(topGroup);
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertNoEvents();
assertEquals(3,msgA.getHeader().size());
assertEquals(1,msgA.getBody().size());
assertEquals(3,msgA.getBody().get(0).getGroups().
get(0).getFields().size());
assertEquals(2,msgA.getBody().get(0).getGroups().
get(0).getFields().get(1).getGroups().
get(0).getFields().size());
assertEquals(2,msgA.getBody().get(0).getGroups().
get(0).getFields().get(1).getGroups().
get(1).getFields().size());
assertEquals(3,msgA.getBody().get(0).getGroups().
get(1).getFields().size());
assertEquals(2,msgA.getBody().get(0).getGroups().
get(1).getFields().get(1).getGroups().
get(0).getFields().size());
assertEquals(2,msgA.getBody().get(0).getGroups().
get(1).getFields().get(1).getGroups().
get(1).getFields().size());
assertEquals(1,msgA.getTrailer().size());
assertEquals
(TEST_HEADER+"137"+
SystemUtils.LINE_SEPARATOR+
" MsgType [35R] = MassQuote [i]"+
SystemUtils.LINE_SEPARATOR+
"Body"+
SystemUtils.LINE_SEPARATOR+
" NoQuoteSets [296R] = 2"+
SystemUtils.LINE_SEPARATOR+
" Group 1"+
SystemUtils.LINE_SEPARATOR+
" QuoteSetID [302R] = TID1"+
SystemUtils.LINE_SEPARATOR+
" NoQuoteEntries [295R] = 2"+
SystemUtils.LINE_SEPARATOR+
" Group 1"+
SystemUtils.LINE_SEPARATOR+
" QuoteEntryID [299R] = NID1.1"+
SystemUtils.LINE_SEPARATOR+
" Issuer [106] = I1.1"+
SystemUtils.LINE_SEPARATOR+
" Group 2"+
SystemUtils.LINE_SEPARATOR+
" QuoteEntryID [299R] = NID1.2"+
SystemUtils.LINE_SEPARATOR+
" Issuer [106] = I1.2"+
SystemUtils.LINE_SEPARATOR+
" UnderlyingIssuer [306] = UI1"+
SystemUtils.LINE_SEPARATOR+
" Group 2"+
SystemUtils.LINE_SEPARATOR+
" QuoteSetID [302R] = TID2"+
SystemUtils.LINE_SEPARATOR+
" NoQuoteEntries [295R] = 2"+
SystemUtils.LINE_SEPARATOR+
" Group 1"+
SystemUtils.LINE_SEPARATOR+
" QuoteEntryID [299R] = NID2.1"+
SystemUtils.LINE_SEPARATOR+
" Issuer [106] = I2.1"+
SystemUtils.LINE_SEPARATOR+
" Group 2"+
SystemUtils.LINE_SEPARATOR+
" QuoteEntryID [299R] = NID2.2"+
SystemUtils.LINE_SEPARATOR+
" Issuer [106] = I2.2"+
SystemUtils.LINE_SEPARATOR+
" UnderlyingIssuer [306] = UI2"+
TEST_FOOTER+"125",msgA.toString());
}
@Test
public void missingType()
throws Exception
{
Message msg=new Message();
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertSingleEvent
(Level.ERROR,TEST_MESSAGE_CATEGORY,
"Message type is missing from message '9=0"+SOH+"10=167"+SOH+"'",
TEST_MESSAGE_CATEGORY);
assertEquals(0,msgA.getHeader().size());
assertEquals(0,msgA.getBody().size());
assertEquals(0,msgA.getTrailer().size());
assertEquals(StringUtils.EMPTY,msgA.toString());
}
@Test
public void badEnum()
throws Exception
{
NewOrderSingle msg=new NewOrderSingle();
msg.set(new Side('?'));
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertNoEvents();
assertEquals(3,msgA.getHeader().size());
assertEquals(1,msgA.getBody().size());
assertEquals(1,msgA.getTrailer().size());
assertEquals
(TEST_HEADER+"10"+
SystemUtils.LINE_SEPARATOR+
" MsgType [35R] = NewOrderSingle [D]"+
SystemUtils.LINE_SEPARATOR+
"Body"+
SystemUtils.LINE_SEPARATOR+
" Side [54R] = ? [invalid]"+
TEST_FOOTER+"199",msgA.toString());
}
@Test
public void missingGroup()
throws Exception
{
MarketDataSnapshotFullRefresh msg=
new MarketDataSnapshotFullRefresh(new Symbol("QF"));
msg.set(new NoMDEntries(1));
msg.toString();
AnalyzedMessage msgA=new AnalyzedMessage(TEST_DICTIONARY,msg);
assertSingleEvent
(Level.ERROR,TEST_FIELD_CATEGORY,
"Group 1 is missing from message scope '8=FIX.4.2"+SOH+"9=11"+SOH+
"35=W"+SOH+"55=QF"+SOH+"10=052"+SOH+"'",
TEST_FIELD_CATEGORY);
assertEquals(3,msgA.getHeader().size());
assertEquals(2,msgA.getBody().size());
assertEquals(1,msgA.getTrailer().size());
assertEquals
(TEST_HEADER+"17"+
SystemUtils.LINE_SEPARATOR+
" MsgType [35R] = MarketDataSnapshotFullRefresh [W]"+
SystemUtils.LINE_SEPARATOR+
"Body"+
SystemUtils.LINE_SEPARATOR+
" Symbol [55R] = QF"+
SystemUtils.LINE_SEPARATOR+
" NoMDEntries [268R] = 1"+
TEST_FOOTER+"052",msgA.toString());
}
}