Skip to content

Commit f5e3586

Browse files
committed
tests for lob + update cmake to automatically fetch tests
1 parent 47b4a25 commit f5e3586

2 files changed

Lines changed: 112 additions & 10 deletions

File tree

CMakeLists.txt

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
cmake_minimum_required(VERSION 3.14)
2-
project(Raijin-LOB CXX)
2+
3+
project(RaijinLOB CXX)
34

45
set(CMAKE_CXX_STANDARD 20)
56
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -8,21 +9,27 @@ set(CMAKE_CXX_EXTENSIONS OFF)
89
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
910
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -DNDEBUG")
1011

11-
include_directories(include
12-
third_party/json/include)
12+
include_directories(
13+
include
14+
third_party/json/include
15+
)
1316

14-
add_library(core_objects OBJECT
15-
src/core/order_pool.cpp
17+
add_library(core_objects OBJECT
18+
src/core/config.cpp
19+
src/core/order_pool.cpp
1620
src/core/limit_order_book.cpp
17-
src/core/config.cpp)
21+
)
1822

1923
add_executable(raijin_engine src/main.cpp)
2024
target_link_libraries(raijin_engine PRIVATE core_objects)
2125

2226
add_subdirectory(third_party/googletest)
2327

24-
add_executable(test_order_pool tests/test_order_pool.cpp)
25-
target_link_libraries(test_order_pool PRIVATE core_objects GTest::gtest_main)
26-
2728
include(CTest)
28-
add_test(NAME OrderPoolTests COMMAND test_order_pool)
29+
30+
file(GLOB TEST_SOURCES CONFIGURE_DEPENDS "tests/*.cpp")
31+
add_executable(raijin_tests ${TEST_SOURCES})
32+
target_link_libraries(raijin_tests PRIVATE core_objects GTest::gtest_main)
33+
34+
include(GoogleTest)
35+
gtest_discover_tests(raijin_tests)

tests/test_limit_order_book.cpp

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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

Comments
 (0)