libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
fix_basic.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright © 2015 by J.M.McGuiness, isimud@hussar.me.uk
3 **
4 ** This library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU Lesser General Public
6 ** License as published by the Free Software Foundation; either
7 ** version 2.1 of the License, or (at your option) any later version.
8 **
9 ** This library is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ** Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public
15 ** License along with this library; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
19 #include "stdafx.h"
20 
21 #define BOOST_TEST_MODULE isimud_tests
22 #include <boost/test/included/unit_test.hpp>
23 
24 #include <boost/mpl/list.hpp>
25 
26 #include "../exchanges/FIX/v5.0sp2/messages.hpp"
27 
28 using namespace libisimud;
29 
30 typedef boost::mpl::list<
33 
34 BOOST_AUTO_TEST_SUITE(exchange_gateways)
35 
36 BOOST_AUTO_TEST_SUITE(admin)
37 
38 BOOST_AUTO_TEST_CASE_TEMPLATE(print_details, msg, msg_types) {
39  std::stringstream ss;
40  BOOST_CHECK_NO_THROW(msg::to_stream(ss));
41  BOOST_CHECK(!ss.str().empty());
42 }
43 
44 BOOST_AUTO_TEST_CASE_TEMPLATE(logon, msg, msg_types) {
45  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
46 "8=FIX.5.0\0019=099\00135=A\00149=SENDER\00156=TARGET\00134=1\00152=20000426-12:05:06\00198=0\001108=30\001553=USER\001554=PASSWORD\001925=NEWPASSWD\00110=238\001"
47  };
48  exchanges::FIX::v5_0sp2::MsgTypes::LogonRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::LogonRequest const &>(*fix_buffer.begin());
49  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
50  BOOST_CHECK(fix_msg.is_valid());
51  auto const usr=fix_msg.find<exchanges::FIX::common::FieldsFast::Username>();
52  BOOST_CHECK_EQUAL(std::string(usr.first, usr.second), "USER");
53  auto const pass=fix_msg.find<exchanges::FIX::common::FieldsFast::Password>();
54  BOOST_CHECK_EQUAL(std::string(pass.first, pass.second), "PASSWORD");
55 }
56 
57 BOOST_AUTO_TEST_CASE_TEMPLATE(LogoutRequest, msg, msg_types) {
58  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
59  "8=FIX.5.0\0019=005\00135=5\00110=005\001"
60  };
61  exchanges::FIX::v5_0sp2::MsgTypes::LogoutRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::LogoutRequest const &>(*fix_buffer.begin());
62  BOOST_CHECK(fix_msg.is_valid());
63  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
64 }
65 
66 BOOST_AUTO_TEST_CASE_TEMPLATE(hearbeat, msg, msg_types) {
67  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
68  "8=FIX.5.0\0019=005\00135=0\00110=000\001"
69  };
70  exchanges::FIX::v5_0sp2::MsgTypes::ClientHeartbeat const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::ClientHeartbeat const &>(*fix_buffer.begin());
71  BOOST_CHECK(fix_msg.is_valid());
72  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
73 }
74 
75 BOOST_AUTO_TEST_SUITE_END()
76 
77 BOOST_AUTO_TEST_SUITE(trade)
78 
79 BOOST_AUTO_TEST_CASE_TEMPLATE(new_order, msg, msg_types) {
80  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
81  "8=FIX.5.0\0019=154\00135=D\00134=10\00143=N\00149=VENDOR\00150=CUSTOME\00156=BROKER\00160=19980930-09:25:58\0011=XQCCFUND\00111=10\00121=1\00155=EK\00148=GB00BH4HKS39\00122=4\00154=1\00138=10000\00140=2\00144=76.750000\00159=0\00110=195\001"
82  };
83  exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::NewOrderSingle const &>(*fix_buffer.begin());
84  BOOST_CHECK(fix_msg.is_valid());
85  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
86  auto const client_order_id=fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
87  BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second), "10");
88  auto const symbol=fix_msg.find<exchanges::FIX::common::FieldsFast::Symbol>();
89  BOOST_CHECK_EQUAL(std::string(symbol.first, symbol.second), "EK");
90  auto const side=fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
91  BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
92  auto const transact_time=fix_msg.find<exchanges::FIX::common::FieldsFast::TransactTime>();
93  BOOST_CHECK_EQUAL(std::string(transact_time.first, transact_time.second), "19980930-09:25:58");
94  auto const order_qty=fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>();
95  BOOST_CHECK_EQUAL(std::string(order_qty.first, order_qty.second), "10000");
96  auto const ord_type=fix_msg.find<exchanges::FIX::common::FieldsFast::OrdType>();
97  BOOST_CHECK_EQUAL(std::string(ord_type.first, ord_type.second), "2");
98  auto const sec_id_src_type=fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityIDSource>();
99  BOOST_CHECK_EQUAL(std::string(sec_id_src_type.first, sec_id_src_type.second), "4");
100  auto const sec_id_type=fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityID>();
101  BOOST_CHECK_EQUAL(std::string(sec_id_type.first, sec_id_type.second), "GB00BH4HKS39");
102 }
103 
104 BOOST_AUTO_TEST_CASE_TEMPLATE(order_cancel, msg, msg_types) {
105  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
106  "8=FIX.5.0\0019=057\00135=F\00111=10\00155=CUSTOME\00154=1\00160=19980930-09:25:58\00138=10000\00110=129\001"
107  };
108  exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelRequest const &>(*fix_buffer.begin());
109  BOOST_CHECK(fix_msg.is_valid());
110  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
111  auto const client_order_id=fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
112  BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second), "10");
113  auto const symbol=fix_msg.find<exchanges::FIX::common::FieldsFast::Symbol>();
114  BOOST_CHECK_EQUAL(std::string(symbol.first, symbol.second), "CUSTOME");
115  auto const side=fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
116  BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
117  auto const transact_time=fix_msg.find<exchanges::FIX::common::FieldsFast::TransactTime>();
118  BOOST_CHECK_EQUAL(std::string(transact_time.first, transact_time.second), "19980930-09:25:58");
119  auto const order_qty=fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>();
120  BOOST_CHECK_EQUAL(std::string(order_qty.first, order_qty.second), "10000");
121 }
122 
123 BOOST_AUTO_TEST_CASE_TEMPLATE(order_cancel_replace, msg, msg_types) {
124  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
125  "8=FIX.5.0\0019=104\00135=G\00111=10\00149=VENDOR\00156=BROKER\00134=10\00152=20000426-12:05:06\00155=EK\00154=1\00160=19980930-09:25:58\00138=10000\00140=2\00110=174\001"
126  };
127  exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderCancelReplace const &>(*fix_buffer.begin());
128  BOOST_CHECK(fix_msg.is_valid());
129  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
130  auto const senderCompID=fix_msg.find<exchanges::FIX::common::FieldsFast::SenderCompID>();
131  BOOST_CHECK_EQUAL(std::string(senderCompID.first, senderCompID.second), "VENDOR");
132  auto const targetCompID=fix_msg.find<exchanges::FIX::common::FieldsFast::TargetCompID>();
133  BOOST_CHECK_EQUAL(std::string(targetCompID.first, targetCompID.second), "BROKER");
134  auto const msgSeqNum=fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
135  BOOST_CHECK_EQUAL(std::string(msgSeqNum.first, msgSeqNum.second), "10");
136  auto const sendingTime=fix_msg.find<exchanges::FIX::common::FieldsFast::SendingTime>();
137  BOOST_CHECK_EQUAL(std::string(sendingTime.first, sendingTime.second), "20000426-12:05:06");
138  auto const client_order_id=fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
139  BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second), "10");
140  auto const symbol=fix_msg.find<exchanges::FIX::common::FieldsFast::Symbol>();
141  BOOST_CHECK_EQUAL(std::string(symbol.first, symbol.second), "EK");
142  auto const side=fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
143  BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
144  auto const transact_time=fix_msg.find<exchanges::FIX::common::FieldsFast::TransactTime>();
145  BOOST_CHECK_EQUAL(std::string(transact_time.first, transact_time.second), "19980930-09:25:58");
146  auto const order_qty=fix_msg.find<exchanges::FIX::common::FieldsFast::OrderQty>();
147  BOOST_CHECK_EQUAL(std::string(order_qty.first, order_qty.second), "10000");
148  auto const ordType=fix_msg.find<exchanges::FIX::common::FieldsFast::OrdType>();
149  BOOST_CHECK_EQUAL(std::string(ordType.first, ordType.second), "2");
150 }
151 
152 BOOST_AUTO_TEST_CASE_TEMPLATE(order_reject, msg, msg_types) {
153  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
154  "8=FIX.5.0\0019=011\00135=3\00145=10\00110=008\001"
155  };
156  exchanges::FIX::v5_0sp2::MsgTypes::OrderRejected const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::OrderRejected const &>(*fix_buffer.begin());
157  BOOST_CHECK(fix_msg.is_valid());
158  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
159  auto const ref_seq_num=fix_msg.find<exchanges::FIX::common::FieldsFast::RefSeqNum>();
160  BOOST_CHECK_EQUAL(std::string(ref_seq_num.first, ref_seq_num.second), "10");
161 }
162 
163 BOOST_AUTO_TEST_CASE_TEMPLATE(execution_report, msg, msg_types) {
164  ALIGN_TO_L1_CACHE const exchanges::FIX::common::underlying_fix_data_buffer fix_buffer={
165  "8=FIX.5.0\0019=083\00135=8\00134=2\00111=10\0019=078\00135=8\00134=2\00111=10\00122=4\00148=GB00BH4HKS39\001150=0\00144=42.000000\00154=1\00110=097\001"
166  };
167  exchanges::FIX::v5_0sp2::MsgTypes::ExecutionReport const &fix_msg=reinterpret_cast<exchanges::FIX::v5_0sp2::MsgTypes::ExecutionReport const &>(*fix_buffer.begin());
168  BOOST_CHECK(fix_msg.is_valid());
169  BOOST_CHECK_EQUAL(fix_msg.length(), std::strlen(fix_buffer.begin()));
170  auto const client_order_id=fix_msg.find<exchanges::FIX::common::FieldsFast::ClOrdID>();
171  BOOST_CHECK_EQUAL(std::string(client_order_id.first, client_order_id.second), "10");
172  auto const seqNum=fix_msg.find<exchanges::FIX::common::FieldsFast::MsgSeqNum>();
173  BOOST_CHECK_EQUAL(std::string(seqNum.first, seqNum.second), "2");
174  auto const securityIDSource=fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityIDSource>();
175  BOOST_CHECK_EQUAL(std::string(securityIDSource.first, securityIDSource.second), "4");
176  auto const securityID=fix_msg.find<exchanges::FIX::common::FieldsFast::SecurityID>();
177  BOOST_CHECK_EQUAL(std::string(securityID.first, securityID.second), "GB00BH4HKS39");
178  auto const execType=fix_msg.find<exchanges::FIX::common::FieldsFast::ExecType>();
179  BOOST_CHECK_EQUAL(static_cast<exchanges::FIX::common::ExecType>(*execType.first), exchanges::FIX::common::ExecType::New);
180  auto const price=fix_msg.find<exchanges::FIX::common::FieldsFast::Price>();
181  BOOST_CHECK_EQUAL(std::string(price.first, price.second), "42.000000");
182  auto const side=fix_msg.find<exchanges::FIX::common::FieldsFast::Side>();
183  BOOST_CHECK_EQUAL(std::string(side.first, side.second), "1");
184 }
185 
186 BOOST_AUTO_TEST_SUITE_END()
187 
188 BOOST_AUTO_TEST_SUITE_END()