1+ #include < gtest/gtest.h>
2+ #include " ../include/core/limit_order_book.hpp"
3+
4+ using namespace raijin ;
5+
6+ class LimitOrderBookTest : public ::testing::Test
7+ {
8+ protected:
9+ BookConfig config{
10+ .order_pool_capacity = 1000 ,
11+ .price_level_count = 100000 ,
12+ .level_queue_capacity = 256 ,
13+ .max_order_id = 1000 };
14+
15+ std::unique_ptr<LimitOrderBook> book;
16+
17+ void SetUp () override
18+ {
19+ book = std::make_unique<LimitOrderBook>(config);
20+ }
21+ };
22+
23+ TEST_F (LimitOrderBookTest, AddSingleBuyOrder)
24+ {
25+ bool success = book->add_order (1 , 5000 , 100 , true );
26+ EXPECT_TRUE (success);
27+ EXPECT_EQ (book->best_bid_tick (), 5000 );
28+ EXPECT_EQ (book->bid_volume (5000 ), 100 );
29+
30+ EXPECT_EQ (book->best_ask_tick (), UINT32_MAX );
31+ }
32+
33+ TEST_F (LimitOrderBookTest, AddSingleSellOrder)
34+ {
35+ bool success = book->add_order (2 , 5010 , 50 , false );
36+ EXPECT_TRUE (success);
37+ EXPECT_EQ (book->best_ask_tick (), 5010 );
38+ EXPECT_EQ (book->ask_volume (5010 ), 50 );
39+ EXPECT_EQ (book->best_bid_tick (), UINT32_MAX );
40+ }
41+
42+ TEST_F (LimitOrderBookTest, MatchFullFill)
43+ {
44+ book->add_order (1 , 5000 , 100 , false );
45+ EXPECT_EQ (book->ask_volume (5000 ), 100 );
46+
47+ book->add_order (2 , 5000 , 100 , true );
48+ EXPECT_EQ (book->ask_volume (5000 ), 0 );
49+ EXPECT_EQ (book->bid_volume (5000 ), 0 );
50+ EXPECT_EQ (book->best_ask_tick (), UINT32_MAX );
51+ }
52+
53+ TEST_F (LimitOrderBookTest, MatchPartialFillIncomingSmaller)
54+ {
55+ book->add_order (1 , 5000 , 100 , false );
56+ book->add_order (2 , 5000 , 40 , true );
57+ EXPECT_EQ (book->ask_volume (5000 ), 60 );
58+ EXPECT_EQ (book->bid_volume (5000 ), 0 );
59+ EXPECT_EQ (book->best_ask_tick (), 5000 );
60+ }
61+
62+ TEST_F (LimitOrderBookTest, CancelOrder)
63+ {
64+ book->add_order (1 , 5000 , 100 , true );
65+ EXPECT_EQ (book->bid_volume (5000 ), 100 );
66+ bool success = book->cancel_order (1 );
67+ EXPECT_TRUE (success);
68+ EXPECT_EQ (book->bid_volume (5000 ), 0 );
69+ EXPECT_EQ (book->best_bid_tick (), UINT32_MAX );
70+ }
71+
72+ TEST_F (LimitOrderBookTest, MatchPartialFIllIncomingLarger)
73+ {
74+ book->add_order (1 , 5000 , 100 , false );
75+ book->add_order (2 , 5000 , 150 , true );
76+ EXPECT_EQ (book->ask_volume (5000 ), 0 );
77+ EXPECT_EQ (book->bid_volume (5000 ), 50 );
78+ EXPECT_EQ (book->best_ask_tick (), UINT32_MAX );
79+ }
80+
81+ // spoofing test
82+ TEST_F (LimitOrderBookTest, ToxicFlowCompaction)
83+ {
84+ for (uint64_t i = 1 ; i <= 256 ; i++)
85+ {
86+ book->add_order (i, 5000 , 10 , true );
87+ }
88+ for (uint64_t i = 1 ; i <= 100 ; i++)
89+ {
90+ book->cancel_order (i);
91+ }
92+ bool success = book->add_order (257 , 5000 , 100 , true );
93+ EXPECT_TRUE (success);
94+ EXPECT_EQ (book->bid_volume (5000 ), 1570 );
95+ }
0 commit comments