diff --git a/CMakeLists.txt b/CMakeLists.txt index 9318bda2..d1dc3c42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,7 +46,6 @@ option(SIMDJSON_EXCEPTIONS "Enable simdjson's exception-throwing interface" ON) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake") -find_package(CTargets) find_package(Options) # @@ -63,13 +62,15 @@ set (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/jsonchecker/") set (BENCHMARK_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/jsonexamples/") add_definitions(-DSIMDJSON_TEST_DATA_DIR="${TEST_DATA_DIR}") add_definitions(-DSIMDJSON_BENCHMARK_DATA_DIR="${TEST_DATA_DIR}") +add_definitions(-DJSON_TEST_PATH="${BENCHMARK_DATA_DIR}/twitter.json") +add_definitions(-DSIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/amazon_cellphones.ndjson") + enable_testing() add_subdirectory(tools) add_subdirectory(tests) add_subdirectory(benchmark) - if (SIMDJSON_GOOGLE_BENCHMARKS) if(NOT EXISTS dependencies/benchmark/CMakeLists.txt) # message(STATUS "Unable to find dependencies/benchmark/CMakeLists.txt") diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index ce56248b..a9be1807 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -1,16 +1,14 @@ include_directories( . linux ) -add_cpp_benchmark(parse) -add_cpp_benchmark(statisticalmodel) -add_cpp_benchmark(parse_stream) -add_cpp_benchmark(get_corpus_benchmark) +link_libraries(simdjson) +add_executable(parse parse.cpp) +add_executable(statisticalmodel statisticalmodel.cpp) +add_executable(parse_stream parse_stream.cpp) +add_executable(get_corpus_benchmark get_corpus_benchmark.cpp) add_executable(perfdiff perfdiff.cpp) # Google Benchmarks if (SIMDJSON_GOOGLE_BENCHMARKS) - add_cpp_benchmark(bench_parse_call) - target_link_libraries(bench_parse_call benchmark::benchmark) - - add_cpp_benchmark(bench_dom_api) - target_link_libraries(bench_dom_api benchmark::benchmark) - target_compile_definitions(bench_dom_api PRIVATE JSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/twitter.json") + link_libraries(benchmark::benchmark) + add_executable(bench_parse_call bench_parse_call.cpp) + add_executable(bench_dom_api bench_dom_api.cpp) endif() \ No newline at end of file diff --git a/benchmark/bench_dom_api.cpp b/benchmark/bench_dom_api.cpp index f9494fc5..775d1886 100644 --- a/benchmark/bench_dom_api.cpp +++ b/benchmark/bench_dom_api.cpp @@ -6,8 +6,8 @@ using namespace simdjson; using namespace benchmark; using namespace std; -#ifndef JSON_TEST_PATH -#define JSON_TEST_PATH "jsonexamples/twitter.json" +#ifndef SIMDJSON_TWITTER_JSON_PATH +#define SIMDJSON_TWITTER_JSON_PATH "jsonexamples/twitter.json" #endif const padded_string EMPTY_ARRAY("[]", 2); @@ -17,7 +17,7 @@ const padded_string EMPTY_ARRAY("[]", 2); static void twitter_count(State& state) { // Prints the number of results in twitter.json dom::parser parser; - dom::element doc = parser.load(JSON_TEST_PATH); + dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (auto _ : state) { uint64_t result_count = doc["search_metadata"]["count"]; if (result_count != 100) { return; } @@ -29,7 +29,7 @@ SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_DEPRECATED_WARNING static void iterator_twitter_count(State& state) { // Prints the number of results in twitter.json - padded_string json = padded_string::load(JSON_TEST_PATH); + padded_string json = padded_string::load(SIMDJSON_TWITTER_JSON_PATH); ParsedJson pj = build_parsed_json(json); for (auto _ : state) { ParsedJson::Iterator iter(pj); @@ -48,7 +48,7 @@ SIMDJSON_POP_DISABLE_WARNINGS static void twitter_default_profile(State& state) { // Count unique users with a default profile. dom::parser parser; - dom::element doc = parser.load(JSON_TEST_PATH); + dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (auto _ : state) { set default_users; for (dom::object tweet : doc["statuses"].get()) { @@ -65,7 +65,7 @@ BENCHMARK(twitter_default_profile); static void twitter_image_sizes(State& state) { // Count unique image sizes dom::parser parser; - dom::element doc = parser.load(JSON_TEST_PATH); + dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (auto _ : state) { set> image_sizes; for (dom::object tweet : doc["statuses"].get()) { @@ -88,7 +88,7 @@ BENCHMARK(twitter_image_sizes); static void error_code_twitter_count(State& state) noexcept { // Prints the number of results in twitter.json dom::parser parser; - dom::element doc = parser.load(JSON_TEST_PATH); + dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (auto _ : state) { auto [value, error] = doc["search_metadata"]["count"].get(); if (error) { return; } @@ -100,7 +100,7 @@ BENCHMARK(error_code_twitter_count); static void error_code_twitter_default_profile(State& state) noexcept { // Count unique users with a default profile. dom::parser parser; - dom::element doc = parser.load(JSON_TEST_PATH); + dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (auto _ : state) { set default_users; @@ -127,7 +127,7 @@ SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_DEPRECATED_WARNING static void iterator_twitter_default_profile(State& state) { // Count unique users with a default profile. - padded_string json = padded_string::load(JSON_TEST_PATH); + padded_string json = padded_string::load(SIMDJSON_TWITTER_JSON_PATH); ParsedJson pj = build_parsed_json(json); for (auto _ : state) { set default_users; @@ -167,7 +167,7 @@ BENCHMARK(iterator_twitter_default_profile); static void error_code_twitter_image_sizes(State& state) noexcept { // Count unique image sizes dom::parser parser; - dom::element doc = parser.load(JSON_TEST_PATH); + dom::element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (auto _ : state) { set> image_sizes; auto [statuses, error] = doc["statuses"].get(); @@ -196,7 +196,7 @@ SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_DEPRECATED_WARNING static void iterator_twitter_image_sizes(State& state) { // Count unique image sizes - padded_string json = padded_string::load(JSON_TEST_PATH); + padded_string json = padded_string::load(SIMDJSON_TWITTER_JSON_PATH); ParsedJson pj = build_parsed_json(json); for (auto _ : state) { set> image_sizes; @@ -254,7 +254,7 @@ BENCHMARK(iterator_twitter_image_sizes); static void print_json(State& state) noexcept { // Prints the number of results in twitter.json - padded_string json = get_corpus(JSON_TEST_PATH); + padded_string json = get_corpus(SIMDJSON_TWITTER_JSON_PATH); dom::parser parser; if (int error = json_parse(json, parser); error != SUCCESS) { cerr << error_message(error) << endl; return; } for (auto _ : state) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b5352ed8..14653628 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,33 +1,21 @@ -if(MSVC) - target_include_directories(simdjson - INTERFACE $ - ) -endif() +# Helper so we don't have to repeat ourselves so much +function(add_cpp_test TEST_NAME) + add_executable(${TEST_NAME} ${TEST_NAME}.cpp) + add_test(${TEST_NAME} ${TEST_NAME}) +endfunction(add_cpp_test) + + +link_libraries(simdjson) add_cpp_test(basictests) add_cpp_test(errortests) - -## Next bit should not be needed! -#if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) -# next line is a workaround for an odr-violation in basictests regarding the globals 0x432a40 and 0x52045c under clang -#set_tests_properties(basictests PROPERTIES -# ENVIRONMENT ASAN_OPTIONS="detect_odr_violation=0") -#endif() - add_cpp_test(jsoncheck) add_cpp_test(parse_many_test) add_cpp_test(pointercheck) add_cpp_test(integer_tests) -target_compile_definitions(basictests PRIVATE JSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/twitter.json" NDJSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/amazon_cellphones.ndjson") -target_compile_definitions(errortests PRIVATE JSON_TEST_PATH="${PROJECT_SOURCE_DIR}/jsonexamples/twitter.json") - -## This causes problems -# add_executable(singleheader ./singleheadertest.cpp ${PROJECT_SOURCE_DIR}/singleheader/simdjson.cpp) -# target_link_libraries(singleheader simdjson) -# add_test(singleheader singleheader) - if(MSVC) + include_directories($) add_custom_command(TARGET basictests POST_BUILD # Adds a post-build event COMMAND ${CMAKE_COMMAND} -E echo "$" COMMAND ${CMAKE_COMMAND} -E echo "$" @@ -36,3 +24,14 @@ if(MSVC) "$") # <--this is out-file path endif() +## Next bit should not be needed! +#if(CMAKE_INTERPROCEDURAL_OPTIMIZATION) +# next line is a workaround for an odr-violation in basictests regarding the globals 0x432a40 and 0x52045c under clang +#set_tests_properties(basictests PROPERTIES +# ENVIRONMENT ASAN_OPTIONS="detect_odr_violation=0") +#endif() + +## This causes problems +# add_executable(singleheader ./singleheadertest.cpp ${PROJECT_SOURCE_DIR}/singleheader/simdjson.cpp) +# target_link_libraries(singleheader simdjson) +# add_test(singleheader singleheader) diff --git a/tests/basictests.cpp b/tests/basictests.cpp index a8f21893..f2a68c0f 100644 --- a/tests/basictests.cpp +++ b/tests/basictests.cpp @@ -17,11 +17,11 @@ #include "simdjson.h" -#ifndef JSON_TEST_PATH -#define JSON_TEST_PATH "jsonexamples/twitter.json" +#ifndef SIMDJSON_TWITTER_JSON_PATH +#define SIMDJSON_TWITTER_JSON_PATH "jsonexamples/twitter.json" #endif -#ifndef NDJSON_TEST_PATH -#define NDJSON_TEST_PATH "jsonexamples/amazon_cellphones.ndjson" +#ifndef SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH +#define SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH "jsonexamples/amazon_cellphones.ndjson" #endif #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 { bool parser_load() { std::cout << "Running " << __func__ << std::endl; dom::parser parser; - auto [doc, error] = parser.load(JSON_TEST_PATH); + auto [doc, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH); if (error) { cerr << error << endl; return false; } if (!doc.is()) { cerr << "Document did not parse as an object" << endl; return false; } return true; @@ -504,7 +504,7 @@ namespace parse_api_tests { std::cout << "Running " << __func__ << std::endl; dom::parser parser; int count = 0; - for (auto [doc, error] : parser.load_many(NDJSON_TEST_PATH)) { + for (auto [doc, error] : parser.load_many(SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH)) { if (error) { cerr << error << endl; return false; } if (!doc.is()) { cerr << "Document did not parse as an array" << endl; return false; } count++; @@ -537,7 +537,7 @@ namespace parse_api_tests { bool parser_load_exception() { std::cout << "Running " << __func__ << std::endl; dom::parser parser; - const element doc = parser.load(JSON_TEST_PATH); + const element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); if (!doc.is()) { cerr << "Document did not parse as an object" << endl; return false; } return true; } @@ -545,7 +545,7 @@ namespace parse_api_tests { std::cout << "Running " << __func__ << std::endl; dom::parser parser; int count = 0; - for (const element doc : parser.load_many(NDJSON_TEST_PATH)) { + for (const element doc : parser.load_many(SIMDJSON_AMAZON_CELLPHONES_NDJSON_PATH)) { if (!doc.is()) { cerr << "Document did not parse as an array" << endl; return false; } count++; } @@ -869,7 +869,7 @@ namespace dom_api_tests { std::cout << "Running " << __func__ << std::endl; // Prints the number of results in twitter.json dom::parser parser; - auto [result_count, error] = parser.load(JSON_TEST_PATH)["search_metadata"]["count"].get(); + auto [result_count, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH)["search_metadata"]["count"].get(); if (error) { cerr << "Error: " << error << endl; return false; } if (result_count != 100) { cerr << "Expected twitter.json[metadata_count][count] = 100, got " << result_count << endl; return false; } return true; @@ -880,7 +880,7 @@ namespace dom_api_tests { // Print users with a default profile. set default_users; dom::parser parser; - auto [tweets, error] = parser.load(JSON_TEST_PATH)["statuses"].get(); + auto [tweets, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH)["statuses"].get(); if (error) { cerr << "Error: " << error << endl; return false; } for (auto tweet : tweets) { object user; @@ -905,7 +905,7 @@ namespace dom_api_tests { // Print image names and sizes set> image_sizes; dom::parser parser; - auto [tweets, error] = parser.load(JSON_TEST_PATH)["statuses"].get(); + auto [tweets, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH)["statuses"].get(); if (error) { cerr << "Error: " << error << endl; return false; } for (auto tweet : tweets) { auto [media, not_found] = tweet["entities"]["media"].get(); @@ -1043,7 +1043,7 @@ namespace dom_api_tests { std::cout << "Running " << __func__ << std::endl; // Prints the number of results in twitter.json dom::parser parser; - element doc = parser.load(JSON_TEST_PATH); + element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); uint64_t result_count = doc["search_metadata"]["count"]; if (result_count != 100) { cerr << "Expected twitter.json[metadata_count][count] = 100, got " << result_count << endl; return false; } return true; @@ -1054,7 +1054,7 @@ namespace dom_api_tests { // Print users with a default profile. set default_users; dom::parser parser; - element doc = parser.load(JSON_TEST_PATH); + element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (object tweet : doc["statuses"].get()) { object user = tweet["user"]; if (user["default_profile"]) { @@ -1070,7 +1070,7 @@ namespace dom_api_tests { // Print image names and sizes set> image_sizes; dom::parser parser; - element doc = parser.load(JSON_TEST_PATH); + element doc = parser.load(SIMDJSON_TWITTER_JSON_PATH); for (object tweet : doc["statuses"].get()) { auto [media, not_found] = tweet["entities"]["media"]; if (!not_found) { diff --git a/tests/errortests.cpp b/tests/errortests.cpp index 74788b2b..48da3347 100644 --- a/tests/errortests.cpp +++ b/tests/errortests.cpp @@ -14,8 +14,8 @@ using namespace simdjson; using namespace std; -#ifndef JSON_TEST_PATH -#define JSON_TEST_PATH "jsonexamples/twitter.json" +#ifndef SIMDJSON_TWITTER_JSON_PATH +#define SIMDJSON_TWITTER_JSON_PATH "jsonexamples/twitter.json" #endif #define TEST_START() { cout << "Running " << __func__ << " ..." << endl; } @@ -27,14 +27,14 @@ namespace parser_load { bool parser_load_capacity() { TEST_START(); dom::parser parser(1); // 1 byte max capacity - auto [doc, error] = parser.load(JSON_TEST_PATH); + auto [doc, error] = parser.load(SIMDJSON_TWITTER_JSON_PATH); ASSERT_ERROR(error, CAPACITY); TEST_SUCCEED(); } bool parser_load_many_capacity() { TEST_START(); dom::parser parser(1); // 1 byte max capacity - for (auto [doc, error] : parser.load_many(JSON_TEST_PATH)) { + for (auto [doc, error] : parser.load_many(SIMDJSON_TWITTER_JSON_PATH)) { ASSERT_ERROR(error, CAPACITY); TEST_SUCCEED(); } diff --git a/tests/singleheadertest.cpp b/tests/singleheadertest.cpp index 07ee12fc..baf2b520 100644 --- a/tests/singleheadertest.cpp +++ b/tests/singleheadertest.cpp @@ -5,7 +5,7 @@ using namespace simdjson; int main() { - const char *filename = JSON_TEST_PATH; + const char *filename = SIMDJSON_TWITTER_JSON_PATH; padded_string p = get_corpus(filename); dom::parser parser; auto [doc, error] = parser.parse(p); diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index f6eb247e..942a9883 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,3 +1,4 @@ -add_cpp_tool(json2json) -add_cpp_tool(jsonstats) -add_cpp_tool(minify) +link_libraries(simdjson) +add_executable(json2json json2json.cpp) +add_executable(jsonstats jsonstats.cpp) +add_executable(minify minify.cpp) diff --git a/tools/cmake/FindCTargets.cmake b/tools/cmake/FindCTargets.cmake deleted file mode 100644 index 3d7f569e..00000000 --- a/tools/cmake/FindCTargets.cmake +++ /dev/null @@ -1,15 +0,0 @@ -function(add_cpp_test TEST_NAME) - add_executable(${TEST_NAME} ${TEST_NAME}.cpp) - target_link_libraries(${TEST_NAME} ${SIMDJSON_LIB_NAME}) - add_test(${TEST_NAME} ${TEST_NAME}) -endfunction(add_cpp_test) - -function(add_cpp_benchmark BENCH_NAME) - add_executable(${BENCH_NAME} ${BENCH_NAME}.cpp) - target_link_libraries(${BENCH_NAME} ${SIMDJSON_LIB_NAME}) -endfunction(add_cpp_benchmark) - -function(add_cpp_tool TOOL_NAME) - add_executable(${TOOL_NAME} ${TOOL_NAME}.cpp) - target_link_libraries(${TOOL_NAME} ${SIMDJSON_LIB_NAME}) -endfunction(add_cpp_tool)