1require 'quickfix_ruby'
2require 'test/unit'
3
4class MessageTestCase < Test::Unit::TestCase
5
6	def setup
7		@object = Quickfix::Message.new()
8	end
9
10	def test_isAdmin
11		assert( !@object.isAdmin() )
12		@object.getHeader().setField( Quickfix::MsgType.new("A") )
13		assert( @object.isAdmin() )
14		@object.getHeader().setField( Quickfix::MsgType.new("D") )
15		assert( !@object.isAdmin() )
16	end
17
18	def test_isApp
19		assert( !@object.isApp() )
20		@object.getHeader().setField( Quickfix::MsgType.new("A") )
21		assert( !@object.isApp() )
22		@object.getHeader().setField( Quickfix::MsgType.new("D") )
23		assert( @object.isApp() )
24	end
25
26	def test_isEmpty
27		message = Quickfix::Message.new
28		assert( message.isEmpty() )
29		message.getHeader().setField( Quickfix::BeginString.new("FIX.4.2") )
30		assert( !message.isEmpty() )
31		message.clear()
32		assert( message.isEmpty() )
33		message.setField( Quickfix::Symbol.new("MSFT") )
34		assert( !message.isEmpty() )
35		message.clear()
36		assert( message.isEmpty() )
37		message.getTrailer().setField( Quickfix::CheckSum.new(10) )
38		assert( !message.isEmpty() )
39		message.clear()
40		assert( message.isEmpty() )
41	end
42
43	def test_setString
44		strGood = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218\001"
45		strNull = "8=FIX.4.2\0019=46\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\000\00110=219\001"
46		strTrailingCharacter = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218\001 "
47		strNoChk = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\001"
48		strBadChk = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=000\001"
49		strBad = "8=FIX.4.2\0019=45\00135=0\00134=3\00149garbled=TW\00152=20000426-12:05:06\00156=ISLD\00110=000\001"
50		strBadHeaderOrder = "8=FIX.4.2\00135=0\0019=45\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218\001"
51		strBodyFields = "8=FIX.4.2\0019=60\00135=D\00111=ORDERID\00121=3\00140=2\00154=1\00155=MSFT\00160=19000101-00:00:00\00110=226\001"
52		strNoLengthAndChk = "8=FIX.4.2\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\001";
53		strJunk = "paste your FIX message here, then hit ENTER"
54		strEmpty = ""
55
56		begin
57			@object.setString( strGood )
58			@object.setString( strNull )
59			@object.setString( strNoLengthAndChk, false )
60		rescue Quickfix::InvalidMessage
61			assert( false )
62		end
63
64		begin
65			@object.setString( strTrailingCharacter )
66			assert(false)
67		rescue Quickfix::InvalidMessage
68		end
69
70		begin
71			@object.setString( strNoChk )
72			assert(false)
73		rescue Quickfix::InvalidMessage
74		end
75
76		begin
77			@object.setString( strBadChk )
78			assert(false)
79		rescue Quickfix::InvalidMessage
80		end
81
82		begin
83			@object.setString( strBad )
84			assert(false)
85		rescue Quickfix::InvalidMessage
86		end
87
88		begin
89			@object.setString( strBadHeaderOrder )
90			assert(false)
91		rescue Quickfix::InvalidMessage
92		end
93
94		begin
95			@object.setString( strNoLengthAndChk )
96			assert(false)
97		rescue Quickfix::InvalidMessage
98		end
99
100		begin
101			@object.setString( strJunk )
102			assert(false)
103		rescue Quickfix::InvalidMessage
104		end
105
106		begin
107			@object.setString( strEmpty )
108			assert(false)
109		rescue Quickfix::InvalidMessage
110		end
111
112		dataDictionary = Quickfix::DataDictionary.new
113		dataDictionary.addHeaderField( 11, false )
114		dataDictionary.addTrailerField( 60, false )
115
116		clOrdID = Quickfix::ClOrdID.new
117		transactTime = Quickfix::TransactTime.new
118		symbol = Quickfix::Symbol.new
119
120		begin
121			@object.setString( strBodyFields, true, dataDictionary )
122		rescue Quickfix::InvalidMessage
123			assert( false )
124		end
125
126		assert( @object.getHeader().isSetField( clOrdID ) );
127		assert( @object.getTrailer().isSetField( transactTime ) );
128		assert( @object.isSetField( symbol ) );
129	end
130
131	def test_setStringWithGroup
132		dataDictionary = Quickfix::DataDictionary.new( "spec/FIX43.xml" )
133		str = "8=FIX.4.3\0019=199\00135=E\00134=126\00149=BUYSIDE\00150=00303\00152=20040916-16:19:18.328\00156=SELLSIDE\00166=1095350459\00168=2\00173=2\00111=1095350459\00167=1\0011=00303\00155=fred\00154=1\00140=1\00159=3\00111=1095350460\00167=2\0011=00303\00155=fred\00154=1\00140=1\00159=3\001394=3\00110=138\001"
134
135		begin
136			@object.setString( str, true, dataDictionary )
137			assert_equal( str, @object.toString() )
138		rescue Quickfix::InvalidMessage
139			assert( false )
140		end
141	end
142
143	def test_setStringWithHeaderGroup
144		dataDictionary = Quickfix::DataDictionary.new( "spec/FIX43.xml" )
145		str = "8=FIX.4.3\0019=152\00135=A\00134=125\00149=BUYSIDE\00152=20040916-16:19:18.328\00156=SELLSIDE\001627=2\001628=HOP1\001629=20040916-16:19:18.328\001630=ID1\001628=HOP2\001629=20040916-16:19:18.328\001630=ID2\00110=079\001"
146
147		begin
148			@object.setString( str, true, dataDictionary )
149			assert_equal( str, @object.toString() )
150		rescue Quickfix::InvalidMessage
151			assert( false )
152		end
153	end
154
155	def test_noEndingDelim
156		str = "8=FIX.4.2\0019=45\00135=0\00134=3\00149=TW\00152=20000426-12:05:06\00156=ISLD\00110=218"
157
158		begin
159			@object.setString( str )
160			assert(false)
161		rescue Quickfix::InvalidMessage
162		end
163	end
164
165	def test_outOfOrder
166		str = "54=1\00120=0\00131=109.03125\00160=00000000-00:00:00\0018=FIX.4.2\0016=109.03125\0011=acct1\001151=0\001150=2\00117=2\00139=2\00138=3000\00149=MEK\00115=USD\00137=1\00148=123ABC789\00114=3000\00135=8\00156=KEM\00134=2\00155=ABCD\00111=ID1\00122=1\001"
167		expected = "8=FIX.4.2\0019=171\00135=8\00134=2\00149=MEK\00156=KEM\0011=acct1\0016=109.03125\00111=ID1\00114=3000\00115=USD\00117=2\00120=0\00122=1\00131=109.03125\00137=1\00138=3000\00139=2\00148=123ABC789\00154=1\00155=ABCD\00160=00000000-00:00:00\001150=2\001151=0\00110=225\001"
168
169		begin
170			@object.setString( str, false )
171			assert_equal( expected, @object.toString() )
172		rescue Quickfix::InvalidMessage
173			assert( false )
174		end
175	end
176
177	def test_getXML
178		Quickfix::Message::InitializeXML("spec/FIX42.xml")
179		message = Quickfix::Message.new
180		message.getHeader().setField(Quickfix::BeginString.new("FIX.4.2"))
181		message.getHeader().setField(Quickfix::SenderCompID.new("SENDER"))
182		message.getHeader().setField(Quickfix::TargetCompID.new("TARGET"))
183		message.getHeader().setField(Quickfix::MsgType.new(Quickfix::MsgType_Logon()))
184		message.setField(Quickfix::Account.new("ACCOUNT"))
185		message.setField(Quickfix::ClOrdID.new("CLORDID"))
186		message.setField(Quickfix::SecurityIDSource.new(Quickfix::SecurityIDSource_CUSIP()))
187		message.setField(Quickfix::NoMsgTypes.new(2))
188		group = Quickfix::Group.new(384, 372)
189		group.setField(Quickfix::RefMsgType.new("A"))
190		group.setField(Quickfix::MsgDirection.new('0'))
191		message.addGroup(group)
192		group.setField(Quickfix::RefMsgType.new("0"))
193		group.setField(Quickfix::MsgDirection.new('1'))
194		message.addGroup(group)
195		message.getTrailer().setField(Quickfix::CheckSum.new(132))
196	end
197
198	# skip test for now
199	def test_reverseRoute
200		return
201		header = Quickfix::FieldMap.new
202		beginString = Quickfix::BeginString.new( "FIX.4.2" )
203		senderCompID = Quickfix::SenderCompID.new( "SenderCompID" )
204		targetCompID = Quickfix::TargetCompID.new( "TargetCompID" )
205		onBehalfOfCompID = Quickfix::OnBehalfOfCompID.new( "OnBehalfOfCompID" )
206		onBehalfOfSubID = Quickfix::OnBehalfOfSubID.new( "OnBehalfOfSubID" )
207		onBehalfOfLocationID = Quickfix::OnBehalfOfLocationID.new( "OnBehalfOfLocationID" )
208		deliverToCompID = Quickfix::DeliverToCompID.new( "DeliverToCompID" )
209		deliverToSubID = Quickfix::DeliverToSubID.new( "DeliverToSubID" )
210		deliverToLocationID = Quickfix::DeliverToLocationID.new( "DeliverToLocationID" )
211
212		reversedMessage = Quickfix::Message.new
213		reversedHeader = reversedMessage.getHeader()
214
215		header.setField( beginString )
216		header.setField( senderCompID )
217		header.setField( targetCompID )
218		header.setField( onBehalfOfCompID )
219		header.setField( onBehalfOfSubID )
220		header.setField( onBehalfOfLocationID )
221		header.setField( deliverToCompID )
222		header.setField( deliverToSubID )
223		header.setField( deliverToLocationID )
224
225		reversedMessage.reverseRoute( header );
226		assert( reversedHeader.getField( beginString ).getString() == "FIX.4.2" )
227		assert( reversedHeader.getField( senderCompID ).getString() == "TargetCompID" )
228		assert( reversedHeader.getField( targetCompID ).getString() == "SenderCompID" )
229		assert( reversedHeader.getField( onBehalfOfCompID ).getString() == "DeliverToCompID" )
230		assert( reversedHeader.getField( onBehalfOfSubID ).getString() == "DeliverToSubID" )
231		assert( reversedHeader.getField( onBehalfOfLocationID ).getString() == "DeliverToLocationID" )
232		assert( reversedHeader.getField( deliverToCompID ).getString() == "OnBehalfOfCompID" )
233		assert( reversedHeader.getField( deliverToSubID ).getString() == "OnBehalfOfSubID" )
234		assert( reversedHeader.getField( deliverToLocationID ).getString() == "OnBehalfOfLocationID" )
235
236		header.setField( Quickfix::BeginString.new("FIX.4.0" ) )
237		reversedMessage.reverseRoute( header )
238		assert( !reversedHeader.isSetField( onBehalfOfLocationID ) )
239		assert( !reversedHeader.isSetField( deliverToLocationID ) )
240
241		header.setField( beginString )
242		reversedMessage.reverseRoute( header )
243
244		header.removeField( Quickfix::OnBehalfOfCompID.field )
245		reversedMessage.reverseRoute( header )
246		assert( !reversedHeader.isSetField(deliverToCompID) )
247		header.removeField( Quickfix::DeliverToCompID.field )
248		reversedMessage.reverseRoute( header )
249		assert( !reversedHeader.isSetField(onBehalfOfCompID) )
250		header.removeField( Quickfix::OnBehalfOfSubID.field )
251		reversedMessage.reverseRoute( header )
252		assert( !reversedHeader.isSetField(deliverToSubID) )
253		header.removeField( Quickfix::DeliverToSubID.field )
254		reversedMessage.reverseRoute( header )
255		assert( !reversedHeader.isSetField(onBehalfOfSubID) )
256		header.removeField( Quickfix::OnBehalfOfLocationID.field )
257		reversedMessage.reverseRoute( header )
258		assert( !reversedHeader.isSetField(deliverToLocationID) )
259		header.removeField( Quickfix::DeliverToLocationID.field )
260		reversedMessage.reverseRoute( header )
261		assert( !reversedHeader.isSetField(onBehalfOfLocationID) )
262	end
263
264	def test_addRemoveGroup
265		@object.setField( Quickfix::ListID.new( "1" ) )
266		@object.setField( Quickfix::BidType.new( 0 ) )
267		@object.setField( Quickfix::TotNoOrders.new( 3 ) )
268
269		group = Quickfix42::NewOrderList::NoOrders.new
270		group.setField( Quickfix::ClOrdID.new( "A" ) )
271		group.setField( Quickfix::ListSeqNo.new( 1 ) )
272		group.setField( Quickfix::Symbol.new( "DELL" ) )
273		group.setField( Quickfix::Side.new( '1' ) )
274		@object.addGroup( group )
275
276		group.setField( Quickfix::ClOrdID.new( "B" ) )
277		group.setField( Quickfix::ListSeqNo.new( 2 ) )
278		group.setField( Quickfix::Symbol.new( "LNUX" ) )
279		group.setField( Quickfix::Side.new( '2' ) )
280		@object.addGroup( group )
281
282		group.setField( Quickfix::ClOrdID.new( "C" ) )
283		group.setField( Quickfix::ListSeqNo.new( 3 ) )
284		group.setField( Quickfix::Symbol.new( "RHAT" ) )
285		group.setField( Quickfix::Side.new( '3' ) )
286		@object.addGroup( group )
287
288		noOrders = Quickfix::NoOrders.new
289
290		assert( @object.hasGroup(1, group) )
291		assert( @object.hasGroup(2, group) )
292		assert( @object.hasGroup(3, group) )
293		assert_equal( 3, @object.groupCount(Quickfix::NoOrders.field) )
294		@object.getField( noOrders )
295		assert_equal( 3, noOrders.getValue() )
296
297		@object.removeGroup( 2, group )
298		assert( @object.hasGroup(1, group) )
299		assert( @object.hasGroup(2, group) )
300		assert( !@object.hasGroup(3, group) )
301		assert_equal( 2, @object.groupCount(Quickfix::NoOrders.field) )
302		@object.getField( noOrders )
303		assert_equal( 2, noOrders.getValue() )
304
305		@object.removeGroup( 1, group )
306		assert( @object.hasGroup(1, group) )
307		assert( !@object.hasGroup(2, group) )
308		assert( !@object.hasGroup(3, group) )
309		assert_equal( 1, @object.groupCount(Quickfix::NoOrders.field) )
310		@object.getField( noOrders )
311		assert_equal( 1, noOrders.getValue() )
312
313		@object.removeGroup( group )
314		assert( !@object.hasGroup(1, group) )
315		assert( !@object.hasGroup(2, group) )
316		assert( !@object.hasGroup(3, group) )
317		assert_equal( 0, @object.groupCount(Quickfix::NoOrders.field) )
318		!@object.isSetField( noOrders )
319	end
320
321	def test_replaceGroup
322		@object.setField( Quickfix::ListID.new( "1" ) )
323		@object.setField( Quickfix::BidType.new( 0 ) )
324		@object.setField( Quickfix::TotNoOrders.new( 3 ) )
325
326		group = Quickfix42::NewOrderList::NoOrders.new
327		group.setField( Quickfix::ClOrdID.new( "A" ) )
328		group.setField( Quickfix::ListSeqNo.new( 1 ) )
329		group.setField( Quickfix::Symbol.new( "DELL" ) )
330		group.setField( Quickfix::Side.new( '1' ) )
331		@object.addGroup( group )
332
333		group.setField( Quickfix::ClOrdID.new( "B" ) )
334		group.setField( Quickfix::ListSeqNo.new( 2 ) )
335		group.setField( Quickfix::Symbol.new( "LNUX" ) )
336		group.setField( Quickfix::Side.new( '2' ) )
337		@object.addGroup( group );
338
339		group.setField( Quickfix::ClOrdID.new( "C" ) )
340		group.setField( Quickfix::ListSeqNo.new( 3 ) )
341		group.setField( Quickfix::Symbol.new( "RHAT" ) )
342		group.setField( Quickfix::Side.new( '3' ) )
343		@object.addGroup( group );
344
345		group.setField( Quickfix::ClOrdID.new( "D" ) )
346		group.setField( Quickfix::ListSeqNo.new( 4 ) )
347		group.setField( Quickfix::Symbol.new( "AAPL" ) )
348		group.setField( Quickfix::Side.new( '4' ) )
349		@object.replaceGroup( 2, group );
350
351		noOrders = Quickfix::NoOrders.new
352
353		assert( @object.hasGroup(1, group) )
354		assert( @object.hasGroup(2, group) )
355		assert( @object.hasGroup(3, group) )
356		assert_equal( 3, @object.groupCount(Quickfix::NoOrders.field) )
357		@object.getField( noOrders )
358		assert_equal( 3, noOrders.getValue() )
359
360		clOrdID = Quickfix::ClOrdID.new
361		@object.getGroup( 1, group )
362		assert_equal( "A", group.getField(clOrdID).getString() )
363		@object.getGroup( 2, group )
364		assert_equal( "D", group.getField(clOrdID).getString() )
365		@object.getGroup( 3, group )
366		assert_equal( "C", group.getField(clOrdID).getString() )
367	end
368end
369