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