package org.marketcetera.quickfix;
import junit.framework.Test;
import org.marketcetera.core.FIXVersionTestSuite;
import org.marketcetera.core.FIXVersionedTestCase;
import org.marketcetera.trade.Equity;
import quickfix.FieldNotFound;
import quickfix.Message;
import quickfix.field.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashSet;
public class FIXMessageFactoryTest extends FIXVersionedTestCase {
public FIXMessageFactoryTest(String inName, FIXVersion version) {
super(inName, version);
}
public static Test suite() {
return new FIXVersionTestSuite(FIXMessageFactoryTest.class, FIXVersion.values(),
new HashSet<String>(Arrays.asList("testNewBusinessMessageReject")), FIXVersionTestSuite.FIX42_PLUS_VERSIONS); //$NON-NLS-1$
}
public void testNewLimitOrder() throws FieldNotFound {
String clOrderID = "1"; //$NON-NLS-1$
char side = Side.BUY;
BigDecimal quantity = BigDecimal.TEN;
Equity equity = new Equity("MRKT"); //$NON-NLS-1$
BigDecimal price = BigDecimal.ONE;
char timeInForce = TimeInForce.GOOD_TILL_CROSSING;
String account = "ASDF"; //$NON-NLS-1$
Message limitOrder = this.msgFactory.newLimitOrder(clOrderID, side, quantity, equity, price, timeInForce, account);
assertEquals(clOrderID, limitOrder.getString(ClOrdID.FIELD));
assertEquals(side, limitOrder.getChar(Side.FIELD));
assertEquals(quantity, limitOrder.getDecimal(OrderQty.FIELD));
assertEquals(equity.getSymbol(), limitOrder.getString(Symbol.FIELD));
if(FIXVersion.FIX40.equals(fixVersion)) {
assertFalse(limitOrder.isSetField(SecurityType.FIELD));
} else {
assertEquals(equity.getSecurityType().getFIXValue(), limitOrder.getString(SecurityType.FIELD));
}
assertEquals(OrdType.LIMIT, limitOrder.getChar(OrdType.FIELD));
assertEquals(price, limitOrder.getDecimal(Price.FIELD));
assertEquals(timeInForce, limitOrder.getChar(TimeInForce.FIELD));
assertEquals(account, limitOrder.getString(Account.FIELD));
}
public void testNewMarketOrder() throws FieldNotFound {
String clOrderID = "1"; //$NON-NLS-1$
char side = Side.BUY;
BigDecimal quantity = BigDecimal.TEN;
Equity equity = new Equity("MRKT"); //$NON-NLS-1$
char timeInForce = TimeInForce.GOOD_TILL_CROSSING;
String account = "ASDF"; //$NON-NLS-1$
Message marketOrder = this.msgFactory.newMarketOrder(clOrderID, side, quantity, equity, timeInForce, account);
assertEquals(clOrderID, marketOrder.getString(ClOrdID.FIELD));
assertEquals(side, marketOrder.getChar(Side.FIELD));
assertEquals(quantity, marketOrder.getDecimal(OrderQty.FIELD));
assertEquals(equity.getSymbol(), marketOrder.getString(Symbol.FIELD));
if(FIXVersion.FIX40.equals(fixVersion)) {
assertFalse(marketOrder.isSetField(SecurityType.FIELD));
} else {
assertEquals(equity.getSecurityType().getFIXValue(), marketOrder.getString(SecurityType.FIELD));
}
assertEquals(OrdType.MARKET, marketOrder.getChar(OrdType.FIELD));
assertEquals(timeInForce, marketOrder.getChar(TimeInForce.FIELD));
assertEquals(account, marketOrder.getString(Account.FIELD));
}
public void testNewBasicOrder() throws FieldNotFound {
Message basicOrder = msgFactory.newBasicOrder();
assertEquals(MsgType.ORDER_SINGLE, basicOrder.getHeader().getString(MsgType.FIELD));
if (this.fixDD.getDictionary().isRequiredField(MsgType.ORDER_SINGLE,
TransactTime.FIELD) && FIXVersion.FIX_SYSTEM != fixVersion){
// just make sure it's there:
basicOrder.getString(TransactTime.FIELD);
}
}
/** Verify that if we include a "failing" order as a Text reason in a reject,
* the SOH fields get appropriately escaped
*/
public void testNewOrderCancelReject_escapesSOH() throws Exception {
Message basicOrder = msgFactory.newBasicOrder();
Message reject = msgFactory.newOrderCancelReject(new OrderID("35"), new ClOrdID("36"), new OrigClOrdID("37"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
basicOrder.toString(), new CxlRejReason(CxlRejReason.UNKNOWN_ORDER));
assertTrue("reject doesn't contain |:" +reject.toString(), reject.toString().indexOf(FIXMessageFactory.SOH_REPLACE_CHAR) != -1); //$NON-NLS-1$
assertNotNull(new Message(reject.toString()));
}
public void testNewOrderCancelReject() throws Exception {
Message basicOrder = msgFactory.newBasicOrder();
Message reject = msgFactory.newOrderCancelReject(new OrderID("bob"), new ClOrdID("36"), new OrigClOrdID("37"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
basicOrder.toString(), new CxlRejReason(CxlRejReason.UNKNOWN_ORDER));
assertTrue(reject.isSetField(CxlRejReason.FIELD));
assertNotNull(new Message(reject.toString()));
}
public void testNewResendRequest() throws Exception {
Message rr;
rr = msgFactory.newResendRequest(null, null);
assertEquals(MsgType.RESEND_REQUEST, rr.getHeader().getString(MsgType.FIELD));
assertEquals(0, rr.getInt(BeginSeqNo.FIELD));
assertEquals(0, rr.getInt(EndSeqNo.FIELD));
rr = msgFactory.newResendRequest(null, BigInteger.TEN);
assertEquals(MsgType.RESEND_REQUEST, rr.getHeader().getString(MsgType.FIELD));
assertEquals(0, rr.getInt(BeginSeqNo.FIELD));
assertEquals(10, rr.getInt(EndSeqNo.FIELD));
rr = msgFactory.newResendRequest(BigInteger.TEN, null);
assertEquals(MsgType.RESEND_REQUEST, rr.getHeader().getString(MsgType.FIELD));
assertEquals(10, rr.getInt(BeginSeqNo.FIELD));
assertEquals(0, rr.getInt(EndSeqNo.FIELD));
rr = msgFactory.newResendRequest(new BigInteger("24"), new BigInteger("38")); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals(MsgType.RESEND_REQUEST, rr.getHeader().getString(MsgType.FIELD));
assertEquals(24, rr.getInt(BeginSeqNo.FIELD));
assertEquals(38, rr.getInt(EndSeqNo.FIELD));
}
public void testNewBusinessMessageReject() throws Exception {
Message msg = msgFactory.newBusinessMessageReject(MsgType.BID_REQUEST, BusinessRejectReason.UNSUPPORTED_MESSAGE_TYPE, "bob"); //$NON-NLS-1$
assertEquals(MsgType.BUSINESS_MESSAGE_REJECT, msg.getHeader().getString(MsgType.FIELD));
assertEquals(BusinessRejectReason.UNSUPPORTED_MESSAGE_TYPE, msg.getInt(BusinessRejectReason.FIELD));
assertEquals("bob", msg.getString(Text.FIELD)); //$NON-NLS-1$
}
// Verify that LOC is preserved to the Cancel/Replace from buy order
public void testNewCancelReplaceFromMessage_withLOC() throws Exception {
Message buy = FIXMessageUtilTest.createNOS("IBM", new BigDecimal("85.84"), new BigDecimal("100"), Side.BUY, msgFactory); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// make it "On close" order - and the augmentor will translate it appropriately
buy.setField(new TimeInForce(TimeInForce.AT_THE_CLOSE));
buy = fixVersion.getMessageFactory().getMsgAugmentor().newOrderSingleAugment(buy);
char oldOrdType = buy.getChar(OrdType.FIELD);
char oldTIF = buy.getChar(TimeInForce.FIELD);
Message replace = msgFactory.newCancelReplaceFromMessage(buy);
assertEquals("ord types different", oldOrdType, replace.getChar(OrdType.FIELD)); //$NON-NLS-1$
assertEquals("TIF different", oldTIF, replace.getChar(TimeInForce.FIELD)); //$NON-NLS-1$
}
}