# FetchContent requires cmake >=3.11 # see https://cmake.org/cmake/help/v3.11/module/FetchContent.html cmake_minimum_required(VERSION 3.11 FATAL_ERROR) include(FetchContent) option(SYSTEM_DOCTEST "Use system copy of doctest" OFF) option(FASTFLOAT_SUPPLEMENTAL_TESTS "Run supplemental tests" ON) if (NOT SYSTEM_DOCTEST) FetchContent_Declare(doctest GIT_REPOSITORY https://github.com/lemire/doctest.git) else () find_package(doctest REQUIRED) endif() if (FASTFLOAT_SUPPLEMENTAL_TESTS) FetchContent_Declare(supplemental_test_files GIT_REPOSITORY https://github.com/fastfloat/supplemental_test_files.git GIT_TAG origin/main) endif() # FetchContent_MakeAvailable() was only introduced in 3.14 # https://cmake.org/cmake/help/v3.14/release/3.14.html#modules if (NOT SYSTEM_DOCTEST) FetchContent_MakeAvailable(doctest) endif() add_library(supplemental-data INTERFACE) if (FASTFLOAT_SUPPLEMENTAL_TESTS) message(STATUS "Supplemental tests enabled. Retrieving test files.") FetchContent_MakeAvailable(supplemental_test_files) message(STATUS "Supplemental test files retrieved.") target_compile_definitions(supplemental-data INTERFACE SUPPLEMENTAL_TEST_DATA_DIR="${supplemental_test_files_BINARY_DIR}/data") endif() function(fast_float_add_cpp_test TEST_NAME) add_executable(${TEST_NAME} ${TEST_NAME}.cpp) if(CMAKE_CROSSCOMPILING) set(ccemulator ${CMAKE_CROSSCOMPILING_EMULATOR}) endif() add_test(NAME ${TEST_NAME} COMMAND ${ccemulator} $) if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") target_compile_options(${TEST_NAME} PUBLIC /EHsc) endif() if(NOT WIN32) target_compile_options(${TEST_NAME} PUBLIC -Werror -Wall -Wextra -Weffc++) target_compile_options(${TEST_NAME} PUBLIC -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self -Wconversion -Wsign-conversion) endif() target_link_libraries(${TEST_NAME} PUBLIC fast_float supplemental-data) if (NOT SYSTEM_DOCTEST) target_link_libraries(${TEST_NAME} PUBLIC doctest) else () target_link_libraries(${TEST_NAME} PUBLIC doctest::doctest) endif() endfunction(fast_float_add_cpp_test) fast_float_add_cpp_test(rcppfastfloat_test) fast_float_add_cpp_test(wide_char_test) fast_float_add_cpp_test(supported_chars_test) fast_float_add_cpp_test(example_test) fast_float_add_cpp_test(example_comma_test) fast_float_add_cpp_test(example_integer_times_pow10) fast_float_add_cpp_test(basictest) option(FASTFLOAT_CONSTEXPR_TESTS "Require constexpr tests (build will fail if the compiler won't support it)" OFF) if (FASTFLOAT_CONSTEXPR_TESTS) target_compile_features(basictest PRIVATE cxx_std_20) target_compile_definitions(basictest PRIVATE FASTFLOAT_CONSTEXPR_TESTS) else() target_compile_features(basictest PRIVATE cxx_std_17) endif() if (FASTFLOAT_SUPPLEMENTAL_TESTS) target_compile_definitions(basictest PRIVATE FASTFLOAT_SUPPLEMENTAL_TESTS) endif() fast_float_add_cpp_test(p2497) fast_float_add_cpp_test(long_test) fast_float_add_cpp_test(powersoffive_hardround) fast_float_add_cpp_test(string_test) fast_float_add_cpp_test(fast_int) target_compile_features(fast_int PRIVATE cxx_std_17) fast_float_add_cpp_test(json_fmt) fast_float_add_cpp_test(fortran) if(CMAKE_CXX_STANDARD GREATER_EQUAL 23) option(FASTFLOAT_FIXEDWIDTH_TESTS "Require fixed width test for C++23 (build will fail if the compiler won't support it)" ON) else() option(FASTFLOAT_FIXEDWIDTH_TESTS "Require fixed width test for C++23 (build will fail if the compiler won't support it)" OFF) endif() if (FASTFLOAT_FIXEDWIDTH_TESTS) fast_float_add_cpp_test(fixedwidthtest) target_compile_features(fixedwidthtest PUBLIC cxx_std_23) endif() option(FASTFLOAT_EXHAUSTIVE "Exhaustive tests" OFF) if (FASTFLOAT_EXHAUSTIVE) fast_float_add_cpp_test(short_random_string) fast_float_add_cpp_test(exhaustive32_midpoint) fast_float_add_cpp_test(random_string) fast_float_add_cpp_test(exhaustive32) fast_float_add_cpp_test(exhaustive32_64) fast_float_add_cpp_test(long_exhaustive32) fast_float_add_cpp_test(long_exhaustive32_64) fast_float_add_cpp_test(long_random64) fast_float_add_cpp_test(random64) endif(FASTFLOAT_EXHAUSTIVE) add_subdirectory(build_tests) add_subdirectory(bloat_analysis)