libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
batsboe_us_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/BATSBOE/US/v1/messages.hpp"
27 #include "../exchanges/BATSBOE/US/v2/messages.hpp"
28 
29 #include "core/ttypes.hpp"
30 
31 using namespace libisimud;
32 
33 const exchanges::BATSBOE::common::ClientOrderID_t clientOrderID{"0000000000000000001"};
34 const exchanges::BATSBOE::common::SecurityID_t instID{"000000000000001"};
35 const exchanges::BATSBOE::common::Price_t price(1);
36 const exchanges::BATSBOE::common::SessionSubID_t sessionSubID{"001"};
37 const exchanges::BATSBOE::common::SeqNum_t sequenceNumber(1);
38 
39 typedef boost::mpl::list<
41 // TODO exchanges::BATSBOE::US::v2::MsgTypes
43 
44 BOOST_AUTO_TEST_SUITE(exchange_gateways)
45 
46 BOOST_AUTO_TEST_CASE_TEMPLATE(print_details, msg, msg_types) {
47  std::stringstream ss;
48  BOOST_CHECK_NO_THROW(msg::to_stream(ss));
49  BOOST_CHECK(!ss.str().empty());
50 }
51 
52 BOOST_AUTO_TEST_CASE_TEMPLATE(ctor, msg, msg_types)
53 {
54  typename msg::LogonRequest logon(sequenceNumber, sessionSubID, exchanges::BATSBOE::common::UserName_t{"use"}, exchanges::BATSBOE::common::Password_t{"fubarsnfu"}, false);
55  BOOST_CHECK_EQUAL(logon.start_of_message, exchanges::BATSBOE::common::msg_start_code);
56  BOOST_CHECK_EQUAL(logon.type(), exchanges::BATSBOE::US::MsgType::LogonRequest);
57  BOOST_CHECK_EQUAL(logon.matchingUnit, 0);
58  BOOST_CHECK_EQUAL(logon.sequenceNumber, 1);
59  BOOST_CHECK_GE(logon.length(), msg::header_t_size);
60  BOOST_CHECK_LE(logon.length(), sizeof(typename msg::LogonRequest));
61  typename msg::LogoutRequest logoutRequest(sequenceNumber);
62  BOOST_CHECK_EQUAL(logoutRequest.start_of_message, exchanges::BATSBOE::common::msg_start_code);
63  BOOST_CHECK_EQUAL(logoutRequest.type(), exchanges::BATSBOE::common::MsgType::LogoutRequest);
64  BOOST_CHECK_EQUAL(logoutRequest.matchingUnit, 0);
65  BOOST_CHECK_EQUAL(logoutRequest.sequenceNumber, 1);
66  BOOST_CHECK_GE(logoutRequest.length(), msg::header_t_size);
67  BOOST_CHECK_LE(logoutRequest.length(), sizeof(typename msg::LogoutRequest));
68  typename msg::ClientHeartbeat clientHeartbeat(sequenceNumber);
69  BOOST_CHECK_EQUAL(clientHeartbeat.start_of_message, exchanges::BATSBOE::common::msg_start_code);
70  BOOST_CHECK_EQUAL(clientHeartbeat.type(), exchanges::BATSBOE::common::MsgType::ClientHeartbeat);
71  BOOST_CHECK_EQUAL(clientHeartbeat.matchingUnit, 0);
72  BOOST_CHECK_EQUAL(clientHeartbeat.sequenceNumber, 1);
73  BOOST_CHECK_GE(clientHeartbeat.length(), msg::header_t_size);
74  BOOST_CHECK_LE(clientHeartbeat.length(), sizeof(typename msg::ClientHeartbeat));
75  typename msg::LogonReply logonReply(sequenceNumber);
76  BOOST_CHECK_EQUAL(logonReply.start_of_message, exchanges::BATSBOE::common::msg_start_code);
77  BOOST_CHECK_EQUAL(logonReply.type(), exchanges::BATSBOE::US::MsgType::LogonReply);
78  BOOST_CHECK_EQUAL(logonReply.matchingUnit, 0);
79  BOOST_CHECK_EQUAL(logonReply.sequenceNumber, 1);
80  BOOST_CHECK_GE(logonReply.length(), msg::header_t_size);
81  BOOST_CHECK_LE(logonReply.length(), sizeof(typename msg::LogonReply));
82  typename msg::Logout logout(sequenceNumber, exchanges::BATSBOE::common::LogoutReason::UserRequested);
83  BOOST_CHECK_EQUAL(logout.start_of_message, exchanges::BATSBOE::common::msg_start_code);
84  BOOST_CHECK_EQUAL(logout.type(), exchanges::BATSBOE::common::MsgType::Logout);
85  BOOST_CHECK_EQUAL(logout.matchingUnit, 0);
86  BOOST_CHECK_EQUAL(logout.sequenceNumber, 1);
87  BOOST_CHECK_EQUAL(logout.numberOfUnits, 0);
88  BOOST_CHECK_GE(logout.length(), msg::header_t_size);
89  BOOST_CHECK_LE(logout.length(), sizeof(typename msg::Logout));
90  typename msg::ServerHeartbeat serverHeartbeat(sequenceNumber);
91  BOOST_CHECK_EQUAL(serverHeartbeat.start_of_message, exchanges::BATSBOE::common::msg_start_code);
92  BOOST_CHECK_EQUAL(serverHeartbeat.type(), exchanges::BATSBOE::common::MsgType::ServerHeartbeat);
93  BOOST_CHECK_EQUAL(serverHeartbeat.matchingUnit, 0);
94  BOOST_CHECK_EQUAL(serverHeartbeat.sequenceNumber, 1);
95  BOOST_CHECK_GE(serverHeartbeat.length(), msg::header_t_size);
96  BOOST_CHECK_LE(serverHeartbeat.length(), sizeof(typename msg::ServerHeartbeat));
97  typename msg::ReplayComplete replayComplete(sequenceNumber);
98  BOOST_CHECK_EQUAL(replayComplete.start_of_message, exchanges::BATSBOE::common::msg_start_code);
99  BOOST_CHECK_EQUAL(replayComplete.type(), exchanges::BATSBOE::common::MsgType::ReplayComplete);
100  BOOST_CHECK_EQUAL(replayComplete.matchingUnit, 0);
101  BOOST_CHECK_EQUAL(replayComplete.sequenceNumber, 1);
102  BOOST_CHECK_GE(replayComplete.length(), msg::header_t_size);
103  BOOST_CHECK_LE(replayComplete.length(), sizeof(typename msg::ReplayComplete));
104  typename msg::NewOrder_t newOrder(sequenceNumber, clientOrderID, exchanges::BATSBOE::common::OrdType::Market, exchanges::BATSBOE::common::TIF::Day, exchanges::BATSBOE::common::Side::Buy, instID, 0, price);
105  BOOST_CHECK_EQUAL(newOrder.start_of_message, exchanges::BATSBOE::common::msg_start_code);
106  BOOST_CHECK_EQUAL(newOrder.type(), exchanges::BATSBOE::common::MsgType::NewOrder);
107  BOOST_CHECK_EQUAL(newOrder.matchingUnit, 0);
108  BOOST_CHECK_EQUAL(newOrder.sequenceNumber, 1);
109  BOOST_CHECK_GE(newOrder.length(), msg::header_t_size);
110  BOOST_CHECK_LE(newOrder.length(), sizeof(typename msg::NewOrder_t));
111  typename msg::CancelOrder cancelOrder(sequenceNumber, clientOrderID);
112  BOOST_CHECK_EQUAL(cancelOrder.start_of_message, exchanges::BATSBOE::common::msg_start_code);
113  BOOST_CHECK_EQUAL(cancelOrder.type(), exchanges::BATSBOE::common::MsgType::CancelOrder);
114  BOOST_CHECK_EQUAL(cancelOrder.matchingUnit, 0);
115  BOOST_CHECK_EQUAL(cancelOrder.sequenceNumber, 1);
116  BOOST_CHECK_GE(cancelOrder.length(), msg::header_t_size);
117  BOOST_CHECK_LE(cancelOrder.length(), sizeof(typename msg::CancelOrder));
118  typename msg::ModifyOrder modifyOrder(sequenceNumber, clientOrderID, 0, price, exchanges::BATSBOE::common::Side::Buy);
119  BOOST_CHECK_EQUAL(modifyOrder.start_of_message, exchanges::BATSBOE::common::msg_start_code);
120  BOOST_CHECK_EQUAL(modifyOrder.type(), exchanges::BATSBOE::common::MsgType::ModifyOrder);
121  BOOST_CHECK_EQUAL(modifyOrder.matchingUnit, 0);
122  BOOST_CHECK_EQUAL(modifyOrder.sequenceNumber, 1);
123  BOOST_CHECK_GE(modifyOrder.length(), msg::header_t_size);
124  BOOST_CHECK_LE(modifyOrder.length(), sizeof(typename msg::ModifyOrder));
125  typename msg::OrderAcknowledgement orderAcknowledgement(sequenceNumber, clientOrderID);
126  BOOST_CHECK_EQUAL(orderAcknowledgement.start_of_message, exchanges::BATSBOE::common::msg_start_code);
127  BOOST_CHECK_EQUAL(orderAcknowledgement.type(), exchanges::BATSBOE::common::MsgType::OrderAcknowledgement);
128  BOOST_CHECK_EQUAL(orderAcknowledgement.matchingUnit, 0);
129  BOOST_CHECK_EQUAL(orderAcknowledgement.sequenceNumber, 1);
130  BOOST_CHECK_GE(orderAcknowledgement.length(), msg::header_t_size);
131  BOOST_CHECK_LE(orderAcknowledgement.length(), sizeof(typename msg::OrderAcknowledgement));
132  typename msg::OrderRejected orderRejected(sequenceNumber, clientOrderID, exchanges::BATSBOE::common::OrderRejectReason::Admin);
133  BOOST_CHECK_EQUAL(orderRejected.start_of_message, exchanges::BATSBOE::common::msg_start_code);
134  BOOST_CHECK_EQUAL(orderRejected.type(), exchanges::BATSBOE::common::MsgType::OrderRejected);
135  BOOST_CHECK_EQUAL(orderRejected.matchingUnit, 0);
136  BOOST_CHECK_EQUAL(orderRejected.sequenceNumber, 1);
137  BOOST_CHECK_GE(orderRejected.length(), msg::header_t_size);
138  BOOST_CHECK_LE(orderRejected.length(), sizeof(typename msg::OrderRejected));
139  typename msg::OrderModified orderModified(sequenceNumber, clientOrderID, price, exchanges::BATSBOE::common::Side::Buy, 0);
140  BOOST_CHECK_EQUAL(orderModified.start_of_message, exchanges::BATSBOE::common::msg_start_code);
141  BOOST_CHECK_EQUAL(orderModified.type(), exchanges::BATSBOE::common::MsgType::OrderModified);
142  BOOST_CHECK_EQUAL(orderModified.matchingUnit, 0);
143  BOOST_CHECK_EQUAL(orderModified.sequenceNumber, 1);
144  BOOST_CHECK_GE(orderModified.length(), msg::header_t_size);
145  BOOST_CHECK_LE(orderModified.length(), sizeof(typename msg::OrderModified));
146  typename msg::OrderRestated orderRestated(sequenceNumber, clientOrderID);
147  BOOST_CHECK_EQUAL(orderRestated.start_of_message, exchanges::BATSBOE::common::msg_start_code);
148  BOOST_CHECK_EQUAL(orderRestated.type(), exchanges::BATSBOE::common::MsgType::OrderRestated);
149  BOOST_CHECK_EQUAL(orderRestated.matchingUnit, 0);
150  BOOST_CHECK_EQUAL(orderRestated.sequenceNumber, 1);
151  BOOST_CHECK_GE(orderRestated.length(), msg::header_t_size);
152  BOOST_CHECK_LE(orderRestated.length(), sizeof(typename msg::OrderRestated));
153  typename msg::UserModifyRejected userModifyRejected(sequenceNumber, clientOrderID, exchanges::BATSBOE::common::OrderRejectReason::Admin);
154  BOOST_CHECK_EQUAL(userModifyRejected.start_of_message, exchanges::BATSBOE::common::msg_start_code);
155  BOOST_CHECK_EQUAL(userModifyRejected.type(), exchanges::BATSBOE::common::MsgType::UserModifyRejected);
156  BOOST_CHECK_EQUAL(userModifyRejected.matchingUnit, 0);
157  BOOST_CHECK_EQUAL(userModifyRejected.sequenceNumber, 1);
158  BOOST_CHECK_GE(userModifyRejected.length(), msg::header_t_size);
159  BOOST_CHECK_LE(userModifyRejected.length(), sizeof(typename msg::UserModifyRejected));
160  typename msg::OrderCancelled orderCancelled(sequenceNumber, clientOrderID, exchanges::BATSBOE::common::OrderRejectReason::Admin, price, exchanges::BATSBOE::common::Side::Buy, 0, 0);
161  BOOST_CHECK_EQUAL(orderCancelled.start_of_message, exchanges::BATSBOE::common::msg_start_code);
162  BOOST_CHECK_EQUAL(orderCancelled.type(), exchanges::BATSBOE::common::MsgType::OrderCancelled);
163  BOOST_CHECK_EQUAL(orderCancelled.matchingUnit, 0);
164  BOOST_CHECK_EQUAL(orderCancelled.sequenceNumber, 1);
165  BOOST_CHECK_GE(orderCancelled.length(), msg::header_t_size);
166  BOOST_CHECK_LE(orderCancelled.length(), sizeof(typename msg::OrderCancelled));
167  typename msg::CancelRejected cancelRejected(sequenceNumber, clientOrderID, exchanges::BATSBOE::common::OrderRejectReason::Admin);
168  BOOST_CHECK_EQUAL(cancelRejected.start_of_message, exchanges::BATSBOE::common::msg_start_code);
169  BOOST_CHECK_EQUAL(cancelRejected.type(), exchanges::BATSBOE::common::MsgType::CancelRejected);
170  BOOST_CHECK_EQUAL(cancelRejected.matchingUnit, 0);
171  BOOST_CHECK_EQUAL(cancelRejected.sequenceNumber, 1);
172  BOOST_CHECK_GE(cancelRejected.length(), msg::header_t_size);
173  BOOST_CHECK_LE(cancelRejected.length(), sizeof(typename msg::CancelRejected));
174  typename msg::OrderExecution orderExecution(sequenceNumber, clientOrderID, price, instID, exchanges::BATSBOE::common::Side::Buy);
175  BOOST_CHECK_EQUAL(orderExecution.start_of_message, exchanges::BATSBOE::common::msg_start_code);
176  BOOST_CHECK_EQUAL(orderExecution.type(), exchanges::BATSBOE::common::MsgType::OrderExecution);
177  BOOST_CHECK_EQUAL(orderExecution.matchingUnit, 0);
178  BOOST_CHECK_EQUAL(orderExecution.sequenceNumber, 1);
179  BOOST_CHECK_GE(orderExecution.length(), msg::header_t_size);
180  BOOST_CHECK_LE(orderExecution.length(), sizeof(typename msg::OrderExecution));
181  typename msg::TradeCancelOrCorrect tradeCancelOrCorrect(sequenceNumber, clientOrderID);
182  BOOST_CHECK_EQUAL(tradeCancelOrCorrect.start_of_message, exchanges::BATSBOE::common::msg_start_code);
183  BOOST_CHECK_EQUAL(tradeCancelOrCorrect.type(), exchanges::BATSBOE::common::MsgType::TradeCancelOrCorrect);
184  BOOST_CHECK_EQUAL(tradeCancelOrCorrect.matchingUnit, 0);
185  BOOST_CHECK_EQUAL(tradeCancelOrCorrect.sequenceNumber, 1);
186  BOOST_CHECK_GE(tradeCancelOrCorrect.length(), msg::header_t_size);
187  BOOST_CHECK_LE(tradeCancelOrCorrect.length(), sizeof(typename msg::TradeCancelOrCorrect));
188 }
189 
190 BOOST_AUTO_TEST_CASE_TEMPLATE(find_value, msg, msg_types)
191 {
192  typename msg::NewOrder_t newOrder(sequenceNumber, clientOrderID, exchanges::BATSBOE::common::OrdType::Market, exchanges::BATSBOE::common::TIF::Day, exchanges::BATSBOE::common::Side::Buy, instID, 0, price);
193  BOOST_CHECK_EQUAL(newOrder.clientOrderID(), clientOrderID);
194  BOOST_CHECK_EQUAL(newOrder.orderQty(), 0);
195  BOOST_CHECK_EQUAL(newOrder.orderType(), exchanges::BATSBOE::common::OrdType::Market);
196  BOOST_CHECK_EQUAL(newOrder.side(), exchanges::BATSBOE::common::Side::Buy);
197  BOOST_CHECK_EQUAL(newOrder.instrumentID(), instID);
198  BOOST_CHECK_EQUAL(newOrder.limitPrice(), price);
199 }
200 
201 BOOST_AUTO_TEST_SUITE_END()