Skip to content

Commit 10b7556

Browse files
committed
Specify cmake tests, benchmarks and tools idiomatically
1 parent 54b7291 commit 10b7556

9 files changed

+66
-82
lines changed

CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ option(SIMDJSON_EXCEPTIONS "Enable simdjson's exception-throwing interface" ON)
4646

4747
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake")
4848

49-
find_package(CTargets)
5049
find_package(Options)
5150

5251
#
@@ -63,13 +62,15 @@ set (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/jsonchecker/")
6362
set (BENCHMARK_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/jsonexamples/")
6463
add_definitions(-DSIMDJSON_TEST_DATA_DIR="${TEST_DATA_DIR}")
6564
add_definitions(-DSIMDJSON_BENCHMARK_DATA_DIR="${TEST_DATA_DIR}")
65+
add_definitions(-DJSON_TEST_PATH="${BENCHMARK_DATA_DIR}/twitter.json")
66+
add_definitions(-DSIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/amazon_cellphones.ndjson")
67+
6668
enable_testing()
6769

6870
add_subdirectory(tools)
6971
add_subdirectory(tests)
7072
add_subdirectory(benchmark)
7173

72-
7374
if (SIMDJSON_GOOGLE_BENCHMARKS)
7475
if(NOT EXISTS dependencies/benchmark/CMakeLists.txt)
7576
# message(STATUS "Unable to find dependencies/benchmark/CMakeLists.txt")

benchmark/CMakeLists.txt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
include_directories( . linux )
2-
add_cpp_benchmark(parse)
3-
add_cpp_benchmark(statisticalmodel)
4-
add_cpp_benchmark(parse_stream)
5-
add_cpp_benchmark(get_corpus_benchmark)
2+
link_libraries(simdjson)
3+
add_executable(parse parse.cpp)
4+
add_executable(statisticalmodel statisticalmodel.cpp)
5+
add_executable(parse_stream parse_stream.cpp)
6+
add_executable(get_corpus_benchmark get_corpus_benchmark.cpp)
67
add_executable(perfdiff perfdiff.cpp)
78

89
# Google Benchmarks
910
if (SIMDJSON_GOOGLE_BENCHMARKS)
10-
add_cpp_benchmark(bench_parse_call)
11-
target_link_libraries(bench_parse_call benchmark::benchmark)
12-
13-
add_cpp_benchmark(bench_dom_api)
14-
target_link_libraries(bench_dom_api benchmark::benchmark)
15-
target_compile_definitions(bench_dom_api PRIVATE JSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/twitter.json")
11+
link_libraries(benchmark::benchmark)
12+
add_executable(bench_parse_call bench_parse_call.cpp)
13+
add_executable(bench_dom_api bench_dom_api.cpp)
1614
endif()

benchmark/bench_dom_api.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ using namespace simdjson;
66
using namespace benchmark;
77
using namespace std;
88

9-
#ifndef JSON_TEST_PATH
10-
#define JSON_TEST_PATH "jsonexamples/twitter.json"
9+
#ifndef SIMDJSON_TWITTER_JSON_PATH
10+
#define SIMDJSON_TWITTER_JSON_PATH "jsonexamples/twitter.json"
1111
#endif
1212

1313
const padded_string EMPTY_ARRAY("[]", 2);
@@ -17,7 +17,7 @@ const padded_string EMPTY_ARRAY("[]", 2);
1717
static void twitter_count(State& state) {
1818
// Prints the number of results in twitter.json
1919
dom::parser parser;
20-
dom::element doc = parser.load(JSON_TEST_PATH);
20+
dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
2121
for (auto _ : state) {
2222
uint64_t result_count = doc["search_metadata"]["count"];
2323
if (result_count != 100) { return; }
@@ -29,7 +29,7 @@ SIMDJSON_PUSH_DISABLE_WARNINGS
2929
SIMDJSON_DISABLE_DEPRECATED_WARNING
3030
static void iterator_twitter_count(State& state) {
3131
// Prints the number of results in twitter.json
32-
padded_string json = padded_string::load(JSON_TEST_PATH);
32+
padded_string json = padded_string::load(SIMDJSON_TWITTER_JSON_PATH);
3333
ParsedJson pj = build_parsed_json(json);
3434
for (auto _ : state) {
3535
ParsedJson::Iterator iter(pj);
@@ -48,7 +48,7 @@ SIMDJSON_POP_DISABLE_WARNINGS
4848
static void twitter_default_profile(State& state) {
4949
// Count unique users with a default profile.
5050
dom::parser parser;
51-
dom::element doc = parser.load(JSON_TEST_PATH);
51+
dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
5252
for (auto _ : state) {
5353
set<string_view> default_users;
5454
for (dom::object tweet : doc["statuses"].get<dom::array>()) {
@@ -65,7 +65,7 @@ BENCHMARK(twitter_default_profile);
6565
static void twitter_image_sizes(State& state) {
6666
// Count unique image sizes
6767
dom::parser parser;
68-
dom::element doc = parser.load(JSON_TEST_PATH);
68+
dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
6969
for (auto _ : state) {
7070
set<tuple<uint64_t, uint64_t>> image_sizes;
7171
for (dom::object tweet : doc["statuses"].get<dom::array>()) {
@@ -88,7 +88,7 @@ BENCHMARK(twitter_image_sizes);
8888
static void error_code_twitter_count(State& state) noexcept {
8989
// Prints the number of results in twitter.json
9090
dom::parser parser;
91-
dom::element doc = parser.load(JSON_TEST_PATH);
91+
dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
9292
for (auto _ : state) {
9393
auto [value, error] = doc["search_metadata"]["count"].get<uint64_t>();
9494
if (error) { return; }
@@ -100,7 +100,7 @@ BENCHMARK(error_code_twitter_count);
100100
static void error_code_twitter_default_profile(State& state) noexcept {
101101
// Count unique users with a default profile.
102102
dom::parser parser;
103-
dom::element doc = parser.load(JSON_TEST_PATH);
103+
dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
104104
for (auto _ : state) {
105105
set<string_view> default_users;
106106

@@ -127,7 +127,7 @@ SIMDJSON_PUSH_DISABLE_WARNINGS
127127
SIMDJSON_DISABLE_DEPRECATED_WARNING
128128
static void iterator_twitter_default_profile(State& state) {
129129
// Count unique users with a default profile.
130-
padded_string json = padded_string::load(JSON_TEST_PATH);
130+
padded_string json = padded_string::load(SIMDJSON_TWITTER_JSON_PATH);
131131
ParsedJson pj = build_parsed_json(json);
132132
for (auto _ : state) {
133133
set<string_view> default_users;
@@ -167,7 +167,7 @@ BENCHMARK(iterator_twitter_default_profile);
167167
static void error_code_twitter_image_sizes(State& state) noexcept {
168168
// Count unique image sizes
169169
dom::parser parser;
170-
dom::element doc = parser.load(JSON_TEST_PATH);
170+
dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
171171
for (auto _ : state) {
172172
set<tuple<uint64_t, uint64_t>> image_sizes;
173173
auto [statuses, error] = doc["statuses"].get<dom::array>();
@@ -196,7 +196,7 @@ SIMDJSON_PUSH_DISABLE_WARNINGS
196196
SIMDJSON_DISABLE_DEPRECATED_WARNING
197197
static void iterator_twitter_image_sizes(State& state) {
198198
// Count unique image sizes
199-
padded_string json = padded_string::load(JSON_TEST_PATH);
199+
padded_string json = padded_string::load(SIMDJSON_TWITTER_JSON_PATH);
200200
ParsedJson pj = build_parsed_json(json);
201201
for (auto _ : state) {
202202
set<tuple<uint64_t, uint64_t>> image_sizes;
@@ -254,7 +254,7 @@ BENCHMARK(iterator_twitter_image_sizes);
254254

255255
static void print_json(State& state) noexcept {
256256
// Prints the number of results in twitter.json
257-
padded_string json = get_corpus(JSON_TEST_PATH);
257+
padded_string json = get_corpus(SIMDJSON_TWITTER_JSON_PATH);
258258
dom::parser parser;
259259
if (int error = json_parse(json, parser); error != SUCCESS) { cerr << error_message(error) << endl; return; }
260260
for (auto _ : state) {

tests/CMakeLists.txt

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,21 @@
1-
if(MSVC)
2-
target_include_directories(simdjson
3-
INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/windows>
4-
)
5-
endif()
1+
# Helper so we don't have to repeat ourselves so much
2+
function(add_cpp_test TEST_NAME)
3+
add_executable(${TEST_NAME} ${TEST_NAME}.cpp)
4+
add_test(${TEST_NAME} ${TEST_NAME})
5+
endfunction(add_cpp_test)
66

7-
add_cpp_test(basictests)
8-
add_cpp_test(errortests)
97

10-
## Next bit should not be needed!
11-
#if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
12-
# next line is a workaround for an odr-violation in basictests regarding the globals 0x432a40 and 0x52045c under clang
13-
#set_tests_properties(basictests PROPERTIES
14-
# ENVIRONMENT ASAN_OPTIONS="detect_odr_violation=0")
15-
#endif()
8+
link_libraries(simdjson)
169

10+
add_cpp_test(basictests)
11+
add_cpp_test(errortests)
1712
add_cpp_test(jsoncheck)
1813
add_cpp_test(parse_many_test)
1914
add_cpp_test(pointercheck)
2015
add_cpp_test(integer_tests)
2116

22-
target_compile_definitions(basictests PRIVATE JSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/twitter.json" NDJSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/amazon_cellphones.ndjson")
23-
target_compile_definitions(errortests PRIVATE JSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/twitter.json")
24-
25-
## This causes problems
26-
# add_executable(singleheader ./singleheadertest.cpp ${PROJECT_SOURCE_DIR}/singleheader/simdjson.cpp)
27-
# target_link_libraries(singleheader simdjson)
28-
# add_test(singleheader singleheader)
29-
3017
if(MSVC)
18+
include_directories($<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/windows>)
3119
add_custom_command(TARGET basictests POST_BUILD # Adds a post-build event
3220
COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:simdjson>"
3321
COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE_DIR:basictests>"
@@ -36,3 +24,14 @@ if(MSVC)
3624
"$<TARGET_FILE_DIR:basictests>") # <--this is out-file path
3725
endif()
3826

27+
## Next bit should not be needed!
28+
#if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
29+
# next line is a workaround for an odr-violation in basictests regarding the globals 0x432a40 and 0x52045c under clang
30+
#set_tests_properties(basictests PROPERTIES
31+
# ENVIRONMENT ASAN_OPTIONS="detect_odr_violation=0")
32+
#endif()
33+
34+
## This causes problems
35+
# add_executable(singleheader ./singleheadertest.cpp ${PROJECT_SOURCE_DIR}/singleheader/simdjson.cpp)
36+
# target_link_libraries(singleheader simdjson)
37+
# add_test(singleheader singleheader)

tests/basictests.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717

1818
#include "simdjson.h"
1919

20-
#ifndef JSON_TEST_PATH
21-
#define JSON_TEST_PATH "jsonexamples/twitter.json"
20+
#ifndef SIMDJSON_TWITTER_JSON_PATH
21+
#define SIMDJSON_TWITTER_JSON_PATH "jsonexamples/twitter.json"
2222
#endif
23-
#ifndef NDJSON_TEST_PATH
24-
#define NDJSON_TEST_PATH "jsonexamples/amazon_cellphones.ndjson"
23+
#ifndef SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH
24+
#define SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH "jsonexamples/amazon_cellphones.ndjson"
2525
#endif
2626

2727
#define ASSERT_EQUAL(ACTUAL, EXPECTED) if ((ACTUAL) != (EXPECTED)) { std::cerr << "Expected " << #ACTUAL << " to be " << (EXPECTED) << ", got " << (ACTUAL) << " instead!" << std::endl; return false; }
@@ -495,7 +495,7 @@ namespace parse_api_tests {
495495
bool parser_load() {
496496
std::cout << "Running " << __func__ << std::endl;
497497
dom::parser parser;
498-
auto [doc, error] = parser.load(JSON_TEST_PATH);
498+
auto [doc, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH);
499499
if (error) { cerr << error << endl; return false; }
500500
if (!doc.is<dom::object>()) { cerr << "Document did not parse as an object" << endl; return false; }
501501
return true;
@@ -504,7 +504,7 @@ namespace parse_api_tests {
504504
std::cout << "Running " << __func__ << std::endl;
505505
dom::parser parser;
506506
int count = 0;
507-
for (auto [doc, error] : parser.load_many(NDJSON_TEST_PATH)) {
507+
for (auto [doc, error] : parser.load_many(SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH)) {
508508
if (error) { cerr << error << endl; return false; }
509509
if (!doc.is<dom::array>()) { cerr << "Document did not parse as an array" << endl; return false; }
510510
count++;
@@ -537,15 +537,15 @@ namespace parse_api_tests {
537537
bool parser_load_exception() {
538538
std::cout << "Running " << __func__ << std::endl;
539539
dom::parser parser;
540-
const element doc = parser.load(JSON_TEST_PATH);
540+
const element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
541541
if (!doc.is<dom::object>()) { cerr << "Document did not parse as an object" << endl; return false; }
542542
return true;
543543
}
544544
bool parser_load_many_exception() {
545545
std::cout << "Running " << __func__ << std::endl;
546546
dom::parser parser;
547547
int count = 0;
548-
for (const element doc : parser.load_many(NDJSON_TEST_PATH)) {
548+
for (const element doc : parser.load_many(SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH)) {
549549
if (!doc.is<dom::array>()) { cerr << "Document did not parse as an array" << endl; return false; }
550550
count++;
551551
}
@@ -869,7 +869,7 @@ namespace dom_api_tests {
869869
std::cout << "Running " << __func__ << std::endl;
870870
// Prints the number of results in twitter.json
871871
dom::parser parser;
872-
auto [result_count, error] = parser.load(JSON_TEST_PATH)["search_metadata"]["count"].get<uint64_t>();
872+
auto [result_count, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH)["search_metadata"]["count"].get<uint64_t>();
873873
if (error) { cerr << "Error: " << error << endl; return false; }
874874
if (result_count != 100) { cerr << "Expected twitter.json[metadata_count][count] = 100, got " << result_count << endl; return false; }
875875
return true;
@@ -880,7 +880,7 @@ namespace dom_api_tests {
880880
// Print users with a default profile.
881881
set<string_view> default_users;
882882
dom::parser parser;
883-
auto [tweets, error] = parser.load(JSON_TEST_PATH)["statuses"].get<dom::array>();
883+
auto [tweets, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH)["statuses"].get<dom::array>();
884884
if (error) { cerr << "Error: " << error << endl; return false; }
885885
for (auto tweet : tweets) {
886886
object user;
@@ -905,7 +905,7 @@ namespace dom_api_tests {
905905
// Print image names and sizes
906906
set<pair<uint64_t, uint64_t>> image_sizes;
907907
dom::parser parser;
908-
auto [tweets, error] = parser.load(JSON_TEST_PATH)["statuses"].get<dom::array>();
908+
auto [tweets, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH)["statuses"].get<dom::array>();
909909
if (error) { cerr << "Error: " << error << endl; return false; }
910910
for (auto tweet : tweets) {
911911
auto [media, not_found] = tweet["entities"]["media"].get<dom::array>();
@@ -1043,7 +1043,7 @@ namespace dom_api_tests {
10431043
std::cout << "Running " << __func__ << std::endl;
10441044
// Prints the number of results in twitter.json
10451045
dom::parser parser;
1046-
element doc = parser.load(JSON_TEST_PATH);
1046+
element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
10471047
uint64_t result_count = doc["search_metadata"]["count"];
10481048
if (result_count != 100) { cerr << "Expected twitter.json[metadata_count][count] = 100, got " << result_count << endl; return false; }
10491049
return true;
@@ -1054,7 +1054,7 @@ namespace dom_api_tests {
10541054
// Print users with a default profile.
10551055
set<string_view> default_users;
10561056
dom::parser parser;
1057-
element doc = parser.load(JSON_TEST_PATH);
1057+
element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
10581058
for (object tweet : doc["statuses"].get<dom::array>()) {
10591059
object user = tweet["user"];
10601060
if (user["default_profile"]) {
@@ -1070,7 +1070,7 @@ namespace dom_api_tests {
10701070
// Print image names and sizes
10711071
set<pair<uint64_t, uint64_t>> image_sizes;
10721072
dom::parser parser;
1073-
element doc = parser.load(JSON_TEST_PATH);
1073+
element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH);
10741074
for (object tweet : doc["statuses"].get<dom::array>()) {
10751075
auto [media, not_found] = tweet["entities"]["media"];
10761076
if (!not_found) {

tests/errortests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
using namespace simdjson;
1515
using namespace std;
1616

17-
#ifndef JSON_TEST_PATH
18-
#define JSON_TEST_PATH "jsonexamples/twitter.json"
17+
#ifndef SIMDJSON_TWITTER_JSON_PATH
18+
#define SIMDJSON_TWITTER_JSON_PATH "jsonexamples/twitter.json"
1919
#endif
2020

2121
#define TEST_START() { cout << "Running " << __func__ << " ..." << endl; }
@@ -27,14 +27,14 @@ namespace parser_load {
2727
bool parser_load_capacity() {
2828
TEST_START();
2929
dom::parser parser(1); // 1 byte max capacity
30-
auto [doc, error] = parser.load(JSON_TEST_PATH);
30+
auto [doc, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH);
3131
ASSERT_ERROR(error, CAPACITY);
3232
TEST_SUCCEED();
3333
}
3434
bool parser_load_many_capacity() {
3535
TEST_START();
3636
dom::parser parser(1); // 1 byte max capacity
37-
for (auto [doc, error] : parser.load_many(JSON_TEST_PATH)) {
37+
for (auto [doc, error] : parser.load_many(SIMDJSON_TWITTER_JSON_PATH)) {
3838
ASSERT_ERROR(error, CAPACITY);
3939
TEST_SUCCEED();
4040
}

tests/singleheadertest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using namespace simdjson;
66

77
int main() {
8-
const char *filename = JSON_TEST_PATH;
8+
const char *filename = SIMDJSON_TWITTER_JSON_PATH;
99
padded_string p = get_corpus(filename);
1010
dom::parser parser;
1111
auto [doc, error] = parser.parse(p);

tools/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
add_cpp_tool(json2json)
2-
add_cpp_tool(jsonstats)
3-
add_cpp_tool(minify)
1+
link_libraries(simdjson)
2+
add_executable(json2json json2json.cpp)
3+
add_executable(jsonstats jsonstats.cpp)
4+
add_executable(minify minify.cpp)

tools/cmake/FindCTargets.cmake

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)