package org.marketcetera.trade; import org.marketcetera.util.misc.ClassVersion; import org.marketcetera.quickfix.FIXMessageFactory; import org.marketcetera.quickfix.FIXDataDictionary; import org.marketcetera.module.ExpectedFailure; import org.junit.Test; import static org.junit.Assert.*; import java.util.Map; import java.util.HashMap; import java.util.Date; import java.math.BigDecimal; import quickfix.Message; import quickfix.FieldNotFound; import quickfix.fix44.NewOrderSingle; import quickfix.field.*; import quickfix.field.converter.UtcTimestampConverter; import quickfix.field.converter.BooleanConverter; /* $License$ */ /** * Tests {@link OrderSingle} * * @author anshul@marketcetera.com * @version $Id: OrderSingleTest.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.0.0 */ @ClassVersion("$Id: OrderSingleTest.java 16154 2012-07-14 16:34:05Z colin $") //$NON-NLS-1$ public class OrderSingleTest extends TypesTestBase { /** * Verifies default attributes of objects returned via * {@link org.marketcetera.trade.Factory#createOrderSingle()} */ @Test public void pojoDefaults() { OrderSingle order = sFactory.createOrderSingle(); assertOrderSingle(order, NOT_NULL, null, null, null, null, null, null, null, null, null, null, null, null, null); assertNotSame(order, sFactory.createOrderSingle()); //Verify toString() doesn't fail order.toString(); } /** * Verifies setters of objects returned via * {@link org.marketcetera.trade.Factory#createOrderSingle()} */ @Test public void pojoSetters() { OrderSingle order = sFactory.createOrderSingle(); check(order); } /** * Verifies conversion of System FIX message to OrderSingle via * {@link Factory#createOrderSingle(quickfix.Message, BrokerID)} * * @throws Exception if there were errors. */ @Test public void systemFIXWrap() throws Exception { FIXMessageFactory factory = getSystemMessageFactory(); //an order with no fields set Message msg = factory.newBasicOrder(); OrderSingle order = sFactory.createOrderSingle(msg, null); assertOrderValues(order, null, null); OrderID expectedOrderID = NOT_NULL; assertOrderBaseValues(order, expectedOrderID, null, null, null, null, null, null); assertNROrderValues(order, null, null, null, null, null); //Verify toString() doesn't fail order.toString(); check(order); //A limit order with all the fields set. BrokerID brokerID = new BrokerID("meh"); OrderID orderID = new OrderID("testOrderID"); BigDecimal qty = new BigDecimal("23434.56989"); BigDecimal price = new BigDecimal("98923.2345"); SecurityType securityType = SecurityType.CommonStock; Instrument instrument = new Equity("IBM"); String account = "walloween"; msg = factory.newLimitOrder(orderID.getValue(), Side.Buy.getFIXValue(), qty, instrument, price, TimeInForce.AtTheClose.getFIXValue(), account); msg.setField(new quickfix.field.OrderCapacity(quickfix.field.OrderCapacity.INDIVIDUAL)); msg.setField(new quickfix.field.PositionEffect(quickfix.field.PositionEffect.CLOSE)); msg.setField(new quickfix.field.Text("text")); order = sFactory.createOrderSingle(msg, brokerID); assertOrderValues(order, brokerID, securityType); assertOrderBaseValues(order, expectedOrderID, account, "text", null, qty, Side.Buy, instrument); OrderCapacity orderCapacity = OrderCapacity.Individual; PositionEffect positionEffect = PositionEffect.Close; assertNROrderValues(order, OrderType.Limit, price, TimeInForce.AtTheClose, orderCapacity, positionEffect); //Verify toString() doesn't fail order.toString(); order = check(order); //verify the clone assertOrderSingle(order, expectedOrderID, Side.Buy, qty, price, TimeInForce.AtTheClose, OrderType.Limit, instrument, securityType, account, "text", orderCapacity, positionEffect, brokerID, null); //A market order with all fields set. Side side = Side.Sell; OrderType orderType = OrderType.Market; TimeInForce tif = TimeInForce.FillOrKill; msg = factory.newMarketOrder(orderID.getValue(), side.getFIXValue(), qty, instrument, tif.getFIXValue(), account); msg.setField(new quickfix.field.OrderCapacity(quickfix.field.OrderCapacity.INDIVIDUAL)); msg.setField(new quickfix.field.PositionEffect(quickfix.field.PositionEffect.CLOSE)); order = sFactory.createOrderSingle(msg, null); assertOrderSingle(order, expectedOrderID, side, qty, null, tif, orderType, instrument, securityType, account, null, orderCapacity, positionEffect, null, null); //Verify toString() doesn't fail order.toString(); order = check(order); //Verify the clone assertOrderSingle(order, expectedOrderID, side, qty, null, tif, orderType, instrument, securityType, account, null, orderCapacity, positionEffect, null, null); //Check custom fields //Set fields of every type. Map<String,String> expectedMap = new HashMap<String, String>(); Date date = new Date(); BigDecimal bigDecimal = new BigDecimal("35234.35989"); char charValue = '0'; int intValue = 1; boolean boolValue = false; msg.setField(new ExpireTime(date)); expectedMap.put(String.valueOf(ExpireTime.FIELD), UtcTimestampConverter.convert(date, true)); msg.setField(new AllocQty(bigDecimal)); expectedMap.put(String.valueOf(AllocQty.FIELD), bigDecimal.toString()); msg.setField(new SettlType(String.valueOf(charValue))); expectedMap.put(String.valueOf(SettlType.FIELD), String.valueOf(charValue)); msg.setField(new Product(intValue)); expectedMap.put(String.valueOf(Product.FIELD), String.valueOf(intValue)); msg.setField(new SolicitedFlag(boolValue)); expectedMap.put(String.valueOf(SolicitedFlag.FIELD), BooleanConverter.convert(boolValue)); order = sFactory.createOrderSingle(msg, brokerID); BigDecimal expectedPrice = null; assertOrderSingle(order, expectedOrderID, side, qty, expectedPrice, tif, orderType, instrument, securityType, account, null, orderCapacity, positionEffect, brokerID, expectedMap); //Verify toString() doesn't fail order.toString(); order = check(order); //Verify the clone assertOrderSingle(order, expectedOrderID, side, qty, expectedPrice, tif, orderType, instrument, securityType, account, null, orderCapacity, positionEffect, brokerID, expectedMap); assertNotSame(order, sFactory.createOrderSingle(msg, brokerID)); } /** * Verifies failures when wrapping a FIX message in an order. * * @throws Exception if there were errors. */ @Test public void systemFIXWrapFailures() throws Exception { final BrokerID brokerID = new BrokerID("meh"); //Null check for message parameter new ExpectedFailure<NullPointerException>() { protected void run() throws Exception { sFactory.createOrderSingle(null, brokerID); } }; //Non System FIX Versions. FIXMessageFactory factory = getSystemMessageFactory(); final Message msg = factory.newBasicOrder(); for (String string: new String[]{ FIXDataDictionary.FIX_4_0_BEGIN_STRING, FIXDataDictionary.FIX_4_1_BEGIN_STRING, FIXDataDictionary.FIX_4_2_BEGIN_STRING, FIXDataDictionary.FIX_4_3_BEGIN_STRING, FIXDataDictionary.FIX_4_4_BEGIN_STRING}) { msg.getHeader().setField(new BeginString(string)); new ExpectedFailure<MessageCreationException>( Messages.NON_SYSTEM_FIX_MESSAGE, string){ @Override protected void run() throws Exception { sFactory.createOrderSingle(msg,null); } }; } //No version field msg.getHeader().removeField(BeginString.FIELD); MessageCreationException exception = new ExpectedFailure<MessageCreationException>( Messages.SYSTEM_FIX_MESSAGE_NO_BEGIN_STRING, msg.toString()) { @Override protected void run() throws Exception { sFactory.createOrderSingle(msg, null); } }.getException(); assertNotNull(exception.getCause()); assertTrue(exception.getCause() instanceof FieldNotFound); //Has groups msg.getHeader().setField(new BeginString( FIXDataDictionary.FIX_SYSTEM_BEGIN_STRING)); NewOrderSingle.NoAllocs group = new NewOrderSingle.NoAllocs(); group.setField(new AllocAccount("blah")); msg.addGroup(group); new ExpectedFailure<MessageCreationException>( Messages.MESSAGE_HAS_GROUPS, group.getFieldTag(), msg.toString()){ @Override protected void run() throws Exception { sFactory.createOrderSingle(msg,null); } }; //Incorrect message type final Message incorrectType = factory.newCancelReplacePrice( "i1", "i2", new BigDecimal("52.14")); new ExpectedFailure<MessageCreationException>( Messages.NOT_SINGLE_ORDER, incorrectType.toString()){ @Override protected void run() throws Exception { sFactory.createOrderSingle(incorrectType, null); } }; } static OrderSingle check(OrderSingle inOrder) { OrderSingle clone = inOrder.clone(); assertOrderSingleEquals(clone, inOrder); checkOrderSetters(inOrder); checkOrderBaseSetters(inOrder); checkNRSetters(inOrder); return clone; } }