diff --git a/CMake/Catch2Config.cmake.in b/CMake/Catch2Config.cmake.in index c485219c..9268138a 100644 --- a/CMake/Catch2Config.cmake.in +++ b/CMake/Catch2Config.cmake.in @@ -1,10 +1,9 @@ @PACKAGE_INIT@ - # Avoid repeatedly including the targets if(NOT TARGET Catch2::Catch2) - # Provide path for scripts - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") + # Provide path for scripts + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") - include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/Catch2Targets.cmake) endif() diff --git a/CMake/CatchConfigOptions.cmake b/CMake/CatchConfigOptions.cmake index a2f2870b..f61a9657 100644 --- a/CMake/CatchConfigOptions.cmake +++ b/CMake/CatchConfigOptions.cmake @@ -14,7 +14,6 @@ # # For detailed docs look into docs/configuration.md - macro(AddOverridableConfigOption OptionBaseName) option(CATCH_CONFIG_${OptionBaseName} "Read docs/configuration.md for details" OFF) option(CATCH_CONFIG_NO_${OptionBaseName} "Read docs/configuration.md for details" OFF) @@ -74,9 +73,9 @@ foreach(OptionName ${_OtherConfigOptions}) AddConfigOption(${OptionName}) endforeach() if(DEFINED BUILD_SHARED_LIBS) - set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS}) + set(CATCH_CONFIG_SHARED_LIBRARY ${BUILD_SHARED_LIBS}) else() - set(CATCH_CONFIG_SHARED_LIBRARY "") + set(CATCH_CONFIG_SHARED_LIBRARY "") endif() set(CATCH_CONFIG_DEFAULT_REPORTER "console" CACHE STRING "Read docs/configuration.md for details. The name of the reporter should be without quotes.") diff --git a/CMake/CatchMiscFunctions.cmake b/CMake/CatchMiscFunctions.cmake index 05bc83c0..d1cf5fc2 100644 --- a/CMake/CatchMiscFunctions.cmake +++ b/CMake/CatchMiscFunctions.cmake @@ -8,108 +8,107 @@ include(CheckCXXCompilerFlag) function(add_cxx_flag_if_supported_to_targets flagname targets) - string(MAKE_C_IDENTIFIER ${flagname} flag_identifier ) - check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier}) + string(MAKE_C_IDENTIFIER ${flagname} flag_identifier) + check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier}) - if (HAVE_FLAG_${flag_identifier}) - foreach(target ${targets}) - target_compile_options(${target} PRIVATE ${flagname}) - endforeach() - endif() + if(HAVE_FLAG_${flag_identifier}) + foreach(target ${targets}) + target_compile_options(${target} PRIVATE ${flagname}) + endforeach() + endif() endfunction() # Assumes that it is only called for development builds, where warnings # and Werror is desired, so it also enables Werror. function(add_warnings_to_targets targets) - LIST(LENGTH targets TARGETS_LEN) - # For now we just assume 2 possibilities: msvc and msvc-like compilers, - # and other. - if (MSVC) - foreach(target ${targets}) - # Force MSVC to consider everything as encoded in utf-8 - target_compile_options( ${target} PRIVATE /utf-8 ) - # Enable Werror equivalent - if (CATCH_ENABLE_WERROR) - target_compile_options( ${target} PRIVATE /WX ) - endif() + LIST(LENGTH targets TARGETS_LEN) + # For now we just assume 2 possibilities: msvc and msvc-like compilers, + # and other. + if(MSVC) + foreach(target ${targets}) + # Force MSVC to consider everything as encoded in utf-8 + target_compile_options(${target} PRIVATE /utf-8) + # Enable Werror equivalent + if(CATCH_ENABLE_WERROR) + target_compile_options(${target} PRIVATE /WX) + endif() - # MSVC is currently handled specially - if ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" ) - STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level - target_compile_options( ${target} PRIVATE /w44265 /w44061 /w44062 /w45038 ) - endif() - endforeach() + # MSVC is currently handled specially + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level + target_compile_options(${target} PRIVATE /w44265 /w44061 /w44062 /w45038) + endif() + endforeach() + endif() + if(NOT MSVC) + set(CHECKED_WARNING_FLAGS + "-Wabsolute-value" + "-Wall" + "-Wcall-to-pure-virtual-from-ctor-dtor" + "-Wcast-align" + "-Wcatch-value" + "-Wdangling" + "-Wdeprecated" + "-Wdeprecated-register" + "-Wexceptions" + "-Wexit-time-destructors" + "-Wextra" + "-Wextra-semi" + "-Wfloat-equal" + "-Wglobal-constructors" + "-Winit-self" + "-Wmisleading-indentation" + "-Wmismatched-new-delete" + "-Wmismatched-return-types" + "-Wmismatched-tags" + "-Wmissing-braces" + "-Wmissing-declarations" + "-Wmissing-noreturn" + "-Wmissing-prototypes" + "-Wmissing-variable-declarations" + "-Wnon-virtual-dtor" + "-Wnull-dereference" + "-Wold-style-cast" + "-Woverloaded-virtual" + "-Wparentheses" + "-Wpedantic" + "-Wredundant-decls" + "-Wreorder" + "-Wreturn-std-move" + "-Wshadow" + "-Wstrict-aliasing" + "-Wsubobject-linkage" + "-Wsuggest-destructor-override" + "-Wsuggest-override" + "-Wundef" + "-Wuninitialized" + "-Wunneeded-internal-declaration" + "-Wunreachable-code-aggressive" + "-Wunused" + "-Wunused-function" + "-Wunused-parameter" + "-Wvla" + "-Wweak-vtables" + + # This is a useful warning, but our tests sometimes rely on + # functions being present, but not picked (e.g. various checks + # for stringification implementation ordering). + # Ergo, we should use it every now and then, but we cannot + # enable it by default. + # "-Wunused-member-function" + ) + foreach(warning ${CHECKED_WARNING_FLAGS}) + add_cxx_flag_if_supported_to_targets(${warning} "${targets}") + endforeach() + + if(CATCH_ENABLE_WERROR) + foreach(target ${targets}) + # Enable Werror equivalent + target_compile_options(${target} PRIVATE -Werror) + endforeach() endif() - - if (NOT MSVC) - set(CHECKED_WARNING_FLAGS - "-Wabsolute-value" - "-Wall" - "-Wcall-to-pure-virtual-from-ctor-dtor" - "-Wcast-align" - "-Wcatch-value" - "-Wdangling" - "-Wdeprecated" - "-Wdeprecated-register" - "-Wexceptions" - "-Wexit-time-destructors" - "-Wextra" - "-Wextra-semi" - "-Wfloat-equal" - "-Wglobal-constructors" - "-Winit-self" - "-Wmisleading-indentation" - "-Wmismatched-new-delete" - "-Wmismatched-return-types" - "-Wmismatched-tags" - "-Wmissing-braces" - "-Wmissing-declarations" - "-Wmissing-noreturn" - "-Wmissing-prototypes" - "-Wmissing-variable-declarations" - "-Wnon-virtual-dtor" - "-Wnull-dereference" - "-Wold-style-cast" - "-Woverloaded-virtual" - "-Wparentheses" - "-Wpedantic" - "-Wredundant-decls" - "-Wreorder" - "-Wreturn-std-move" - "-Wshadow" - "-Wstrict-aliasing" - "-Wsubobject-linkage" - "-Wsuggest-destructor-override" - "-Wsuggest-override" - "-Wundef" - "-Wuninitialized" - "-Wunneeded-internal-declaration" - "-Wunreachable-code-aggressive" - "-Wunused" - "-Wunused-function" - "-Wunused-parameter" - "-Wvla" - "-Wweak-vtables" - - # This is a useful warning, but our tests sometimes rely on - # functions being present, but not picked (e.g. various checks - # for stringification implementation ordering). - # Ergo, we should use it every now and then, but we cannot - # enable it by default. - # "-Wunused-member-function" - ) - foreach(warning ${CHECKED_WARNING_FLAGS}) - add_cxx_flag_if_supported_to_targets(${warning} "${targets}") - endforeach() - - if (CATCH_ENABLE_WERROR) - foreach(target ${targets}) - # Enable Werror equivalent - target_compile_options( ${target} PRIVATE -Werror ) - endforeach() - endif() - endif() + endif() endfunction() # Adds flags required for reproducible build to the target diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d8226b9..e6199081 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,12 +26,11 @@ cmake_dependent_option(CATCH_BUILD_SURROGATES "Enable generating and building su cmake_dependent_option(CATCH_ENABLE_CONFIGURE_TESTS "Enable CMake configuration tests. WARNING: VERY EXPENSIVE" OFF "CATCH_DEVELOPMENT_BUILD" OFF) cmake_dependent_option(CATCH_ENABLE_CMAKE_HELPER_TESTS "Enable CMake helper tests. WARNING: VERY EXPENSIVE" OFF "CATCH_DEVELOPMENT_BUILD" OFF) - # Catch2's build breaks if done in-tree. You probably should not build # things in tree anyway, but we can allow projects that include Catch2 # as a subproject to build in-tree as long as it is not in our tree. -if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) - message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt") +if(CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt") endif() project(Catch2 @@ -46,7 +45,7 @@ project(Catch2 # Then we also add path that we use to configure the project, but is of # no use to top level projects. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/extras") -if (NOT NOT_SUBPROJECT) +if(NOT NOT_SUBPROJECT) set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake") @@ -67,10 +66,9 @@ set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2") # are built during these tests, so this is required here, before # the subdirectories are added. if(CATCH_TEST_USE_WMAIN) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup") endif() - # Basic paths set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(SOURCES_DIR ${CATCH_DIR}/src/catch2) @@ -80,119 +78,117 @@ set(SELF_TEST_DIR ${CATCH_DIR}/tests/SelfTest) add_subdirectory(src) # Build tests only if requested -if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT) - find_package(PythonInterp 3 REQUIRED) - if (NOT PYTHONINTERP_FOUND) - message(FATAL_ERROR "Python not found, but required for tests") - endif() - set(CMAKE_FOLDER "tests") - add_subdirectory(tests) +if(BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT) + find_package(PythonInterp 3 REQUIRED) + if(NOT PYTHONINTERP_FOUND) + message(FATAL_ERROR "Python not found, but required for tests") + endif() + set(CMAKE_FOLDER "tests") + add_subdirectory(tests) endif() if(CATCH_BUILD_EXAMPLES) - set(CMAKE_FOLDER "Examples") - add_subdirectory(examples) + set(CMAKE_FOLDER "Examples") + add_subdirectory(examples) endif() if(CATCH_BUILD_EXTRA_TESTS) - set(CMAKE_FOLDER "tests/ExtraTests") - add_subdirectory(tests/ExtraTests) + set(CMAKE_FOLDER "tests/ExtraTests") + add_subdirectory(tests/ExtraTests) endif() if(CATCH_BUILD_FUZZERS) - set(CMAKE_FOLDER "fuzzing") - add_subdirectory(fuzzing) + set(CMAKE_FOLDER "fuzzing") + add_subdirectory(fuzzing) endif() -if (CATCH_DEVELOPMENT_BUILD) - add_warnings_to_targets("${CATCH_WARNING_TARGETS}") +if(CATCH_DEVELOPMENT_BUILD) + add_warnings_to_targets("${CATCH_WARNING_TARGETS}") endif() # Only perform the installation steps when Catch is not being used as # a subproject via `add_subdirectory`, or the destinations will break, # see https://github.com/catchorg/Catch2/issues/1373 -if (NOT_SUBPROJECT) - configure_package_config_file( - ${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake - INSTALL_DESTINATION - ${CATCH_CMAKE_CONFIG_DESTINATION} - ) +if(NOT_SUBPROJECT) + configure_package_config_file( + ${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake + INSTALL_DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) - write_basic_package_version_file( + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake" + COMPATIBILITY + SameMajorVersion + ) + + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake" - COMPATIBILITY - SameMajorVersion - ) + DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + # Install documentation + if(CATCH_INSTALL_DOCS) + install( + DIRECTORY + docs/ + DESTINATION + "${CMAKE_INSTALL_DOCDIR}" + PATTERN "doxygen" EXCLUDE + ) + endif() + + if(CATCH_INSTALL_EXTRAS) + # Install CMake scripts install( FILES - "${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake" + "extras/ParseAndAddCatchTests.cmake" + "extras/Catch.cmake" + "extras/CatchAddTests.cmake" + "extras/CatchShardTests.cmake" + "extras/CatchShardTestsImpl.cmake" DESTINATION ${CATCH_CMAKE_CONFIG_DESTINATION} ) - # Install documentation - if(CATCH_INSTALL_DOCS) - install( - DIRECTORY - docs/ - DESTINATION - "${CMAKE_INSTALL_DOCDIR}" - PATTERN "doxygen" EXCLUDE - ) - endif() - - if(CATCH_INSTALL_EXTRAS) - # Install CMake scripts - install( - FILES - "extras/ParseAndAddCatchTests.cmake" - "extras/Catch.cmake" - "extras/CatchAddTests.cmake" - "extras/CatchShardTests.cmake" - "extras/CatchShardTestsImpl.cmake" - DESTINATION - ${CATCH_CMAKE_CONFIG_DESTINATION} - ) - - # Install debugger helpers - install( - FILES - "extras/gdbinit" - "extras/lldbinit" - DESTINATION - ${CMAKE_INSTALL_DATAROOTDIR}/Catch2 - ) - endif() - - ## Provide some pkg-config integration - set(PKGCONFIG_INSTALL_DIR - "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig" - CACHE PATH "Path where catch2.pc is installed" - ) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/catch2.pc - @ONLY - ) - configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc - @ONLY - ) + # Install debugger helpers install( FILES - "${CMAKE_CURRENT_BINARY_DIR}/catch2.pc" - "${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc" + "extras/gdbinit" + "extras/lldbinit" DESTINATION - ${PKGCONFIG_INSTALL_DIR} + ${CMAKE_INSTALL_DATAROOTDIR}/Catch2 ) + endif() - set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/") + ## Provide some pkg-config integration + set(PKGCONFIG_INSTALL_DIR + "${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig" + CACHE PATH "Path where catch2.pc is installed" + ) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/catch2.pc + @ONLY + ) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc + @ONLY + ) + install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/catch2.pc" + "${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc" + DESTINATION + ${PKGCONFIG_INSTALL_DIR} + ) + set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/") - include( CPack ) - + include(CPack) endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d45ddfcb..4035a025 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,50 +1,47 @@ -cmake_minimum_required( VERSION 3.16 ) - -project( Catch2Examples LANGUAGES CXX ) - -message( STATUS "Examples included" ) +cmake_minimum_required(VERSION 3.16) +project(Catch2Examples LANGUAGES CXX) +message(STATUS "Examples included") # Some one-offs first: # 1) Tests and main in one file -add_executable( 010-TestCase +add_executable(010-TestCase 010-TestCase.cpp ) # 2) Tests and main across two files -add_executable( 020-MultiFile +add_executable(020-MultiFile 020-TestCase-1.cpp 020-TestCase-2.cpp ) add_executable(231-Cfg_OutputStreams - 231-Cfg-OutputStreams.cpp + 231-Cfg-OutputStreams.cpp ) target_link_libraries(231-Cfg_OutputStreams Catch2_buildall_interface) target_compile_definitions(231-Cfg_OutputStreams PUBLIC CATCH_CONFIG_NOSTDOUT) # These examples use the standard separate compilation -set( SOURCES_IDIOMATIC_EXAMPLES - 030-Asn-Require-Check.cpp - 100-Fix-Section.cpp - 110-Fix-ClassFixture.cpp - 111-Fix-PersistentFixture.cpp - 120-Bdd-ScenarioGivenWhenThen.cpp - 210-Evt-EventListeners.cpp - 232-Cfg-CustomMain.cpp - 300-Gen-OwnGenerator.cpp - 301-Gen-MapTypeConversion.cpp - 302-Gen-Table.cpp - 310-Gen-VariablesInGenerators.cpp - 311-Gen-CustomCapture.cpp +set(SOURCES_IDIOMATIC_EXAMPLES + 030-Asn-Require-Check.cpp + 100-Fix-Section.cpp + 110-Fix-ClassFixture.cpp + 111-Fix-PersistentFixture.cpp + 120-Bdd-ScenarioGivenWhenThen.cpp + 210-Evt-EventListeners.cpp + 232-Cfg-CustomMain.cpp + 300-Gen-OwnGenerator.cpp + 301-Gen-MapTypeConversion.cpp + 302-Gen-Table.cpp + 310-Gen-VariablesInGenerators.cpp + 311-Gen-CustomCapture.cpp ) -string( REPLACE ".cpp" "" BASENAMES_IDIOMATIC_EXAMPLES "${SOURCES_IDIOMATIC_EXAMPLES}" ) -set( TARGETS_IDIOMATIC_EXAMPLES ${BASENAMES_IDIOMATIC_EXAMPLES} ) +string(REPLACE ".cpp" "" BASENAMES_IDIOMATIC_EXAMPLES "${SOURCES_IDIOMATIC_EXAMPLES}") +set(TARGETS_IDIOMATIC_EXAMPLES ${BASENAMES_IDIOMATIC_EXAMPLES}) - -foreach( name ${TARGETS_IDIOMATIC_EXAMPLES} ) - add_executable( ${name} ${name}.cpp ) +foreach(name ${TARGETS_IDIOMATIC_EXAMPLES}) + add_executable(${name} ${name}.cpp) endforeach() set(ALL_EXAMPLE_TARGETS @@ -53,10 +50,9 @@ set(ALL_EXAMPLE_TARGETS 020-MultiFile ) -foreach( name ${ALL_EXAMPLE_TARGETS} ) - target_link_libraries( ${name} Catch2WithMain ) +foreach(name ${ALL_EXAMPLE_TARGETS}) + target_link_libraries(${name} Catch2WithMain) endforeach() - list(APPEND CATCH_WARNING_TARGETS ${ALL_EXAMPLE_TARGETS}) set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE) diff --git a/extras/Catch.cmake b/extras/Catch.cmake index 3d93fe20..fcdebd60 100644 --- a/extras/Catch.cmake +++ b/extras/Catch.cmake @@ -165,7 +165,7 @@ function(catch_discover_tests TARGET) ${ARGN} ) - if (${CMAKE_VERSION} VERSION_LESS "3.19") + if(${CMAKE_VERSION} VERSION_LESS "3.19") message(FATAL_ERROR "This script requires JSON support from CMake version 3.19 or greater.") endif() @@ -187,7 +187,7 @@ function(catch_discover_tests TARGET) endif() set(_DISCOVERY_MODE ${CMAKE_CATCH_DISCOVER_TESTS_DISCOVERY_MODE}) endif() - if (NOT _DISCOVERY_MODE MATCHES "^(POST_BUILD|PRE_TEST)$") + if(NOT _DISCOVERY_MODE MATCHES "^(POST_BUILD|PRE_TEST)$") message(FATAL_ERROR "Unknown DISCOVERY_MODE: ${_DISCOVERY_MODE}") endif() @@ -204,7 +204,7 @@ function(catch_discover_tests TARGET) TARGET ${TARGET} PROPERTY CROSSCOMPILING_EMULATOR ) - if (NOT _SKIP_IS_FAILURE) + if(NOT _SKIP_IS_FAILURE) set(_PROPERTIES ${_PROPERTIES} SKIP_RETURN_CODE 4) endif() diff --git a/extras/CatchAddTests.cmake b/extras/CatchAddTests.cmake index 25342139..90fbd5e3 100644 --- a/extras/CatchAddTests.cmake +++ b/extras/CatchAddTests.cmake @@ -136,7 +136,7 @@ function(catch_discover_tests_impl) # Parse JSON output for list of tests/class names/tags string(JSON version GET "${listing_output}" "version") - if (NOT version STREQUAL "1") + if(NOT version STREQUAL "1") message(FATAL_ERROR "Unsupported catch output version: '${version}'") endif() @@ -186,11 +186,11 @@ function(catch_discover_tests_impl) ${properties} ) - if (add_tags) + if(add_tags) string(JSON num_tags LENGTH "${test_tags}") math(EXPR num_tags "${num_tags} - 1") set(tag_list "") - if (num_tags GREATER_EQUAL "0") + if(num_tags GREATER_EQUAL "0") foreach(tag_idx RANGE ${num_tags}) string(JSON a_tag GET "${test_tags}" "${tag_idx}") # Catch2's tags can contain semicolons, which are list element separators diff --git a/extras/CatchShardTests.cmake b/extras/CatchShardTests.cmake index 68228f5a..89666d66 100644 --- a/extras/CatchShardTests.cmake +++ b/extras/CatchShardTests.cmake @@ -11,7 +11,7 @@ # * REPORTER - reporter spec to use for tests # * TEST_SPEC - test spec used for filtering tests function(catch_add_sharded_tests TARGET) - if (${CMAKE_VERSION} VERSION_LESS "3.10.0") + if(${CMAKE_VERSION} VERSION_LESS "3.10.0") message(FATAL_ERROR "add_sharded_catch_tests only supports CMake versions 3.10.0 and up") endif() @@ -23,7 +23,7 @@ function(catch_add_sharded_tests TARGET) ${ARGN} ) - if (NOT DEFINED _SHARD_COUNT) + if(NOT DEFINED _SHARD_COUNT) set(_SHARD_COUNT 2) endif() @@ -61,8 +61,6 @@ function(catch_add_sharded_tests TARGET) -P "${shard_impl_script_file}" VERBATIM ) - - endfunction() diff --git a/extras/CatchShardTestsImpl.cmake b/extras/CatchShardTestsImpl.cmake index bb2fc3ef..83fac688 100644 --- a/extras/CatchShardTestsImpl.cmake +++ b/extras/CatchShardTestsImpl.cmake @@ -25,10 +25,10 @@ if(NOT EXISTS "${TEST_BINARY}") endif() set(other_args "") -if (TEST_SPEC) +if(TEST_SPEC) set(other_args "${other_args} ${TEST_SPEC}") endif() -if (REPORTER_SPEC) +if(REPORTER_SPEC) set(other_args "${other_args} --reporter ${REPORTER_SPEC}") endif() diff --git a/extras/ParseAndAddCatchTests.cmake b/extras/ParseAndAddCatchTests.cmake index 31fc193a..d7c17ace 100644 --- a/extras/ParseAndAddCatchTests.cmake +++ b/extras/ParseAndAddCatchTests.cmake @@ -56,7 +56,7 @@ # # #==================================================================================================# -if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8) +if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8) message(FATAL_ERROR "ParseAndAddCatchTests requires CMake 2.8.8 or newer") endif() @@ -67,9 +67,9 @@ option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test na option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF) function(ParseAndAddCatchTests_PrintDebugMessage) - if(PARSE_CATCH_TESTS_VERBOSE) - message(STATUS "ParseAndAddCatchTests: ${ARGV}") - endif() + if(PARSE_CATCH_TESTS_VERBOSE) + message(STATUS "ParseAndAddCatchTests: ${ARGV}") + endif() endfunction() # This removes the contents between @@ -90,163 +90,161 @@ endfunction() # Worker function function(ParseAndAddCatchTests_ParseFile SourceFile TestTarget) - # If SourceFile is an object library, do not scan it (as it is not a file). Exit without giving a warning about a missing file. - if(SourceFile MATCHES "\\\$") - ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.") - return() - endif() - # According to CMake docs EXISTS behavior is well-defined only for full paths. - get_filename_component(SourceFile ${SourceFile} ABSOLUTE) - if(NOT EXISTS ${SourceFile}) - message(WARNING "Cannot find source file: ${SourceFile}") - return() - endif() - ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}") - file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME) + # If SourceFile is an object library, do not scan it (as it is not a file). Exit without giving a warning about a missing file. + if(SourceFile MATCHES "\\\$") + ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.") + return() + endif() + # According to CMake docs EXISTS behavior is well-defined only for full paths. + get_filename_component(SourceFile ${SourceFile} ABSOLUTE) + if(NOT EXISTS ${SourceFile}) + message(WARNING "Cannot find source file: ${SourceFile}") + return() + endif() + ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}") + file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME) - # Remove block and fullline comments - ParseAndAddCatchTests_RemoveComments(Contents) + # Remove block and fullline comments + ParseAndAddCatchTests_RemoveComments(Contents) - # Find definition of test names - # https://regex101.com/r/JygOND/1 - string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([ \t\n]*\"[^\"]*\"[ \t\n]*(,[ \t\n]*\"[^\"]*\")?(,[ \t\n]*[^\,\)]*)*\\)[ \t\n]*\{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}") + # Find definition of test names + # https://regex101.com/r/JygOND/1 + string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([ \t\n]*\"[^\"]*\"[ \t\n]*(,[ \t\n]*\"[^\"]*\")?(,[ \t\n]*[^\,\)]*)*\\)[ \t\n]*\{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}") - if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests) - ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property") - set_property( - DIRECTORY - APPEND - PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile} - ) + if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests) + ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property") + set_property( + DIRECTORY + APPEND + PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile} + ) + endif() + + # check CMP0110 policy for new add_test() behavior + if(POLICY CMP0110) + cmake_policy(GET CMP0110 _cmp0110_value) # new add_test() behavior + else() + # just to be thorough explicitly set the variable + set(_cmp0110_value) + endif() + + foreach(TestName ${Tests}) + # Strip newlines + string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}") + + # Get test type and fixture if applicable + string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}") + string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}") + string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}") + + # Get string parts of test definition + string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}") + + # Strip wrapping quotation marks + string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}") + string(REPLACE "\";\"" ";" TestStrings "${TestStrings}") + + # Validate that a test name and tags have been provided + list(LENGTH TestStrings TestStringsLength) + if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1) + message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}") endif() - # check CMP0110 policy for new add_test() behavior - if(POLICY CMP0110) - cmake_policy(GET CMP0110 _cmp0110_value) # new add_test() behavior + # Assign name and tags + list(GET TestStrings 0 Name) + if("${TestType}" STREQUAL "SCENARIO") + set(Name "Scenario: ${Name}") + endif() + if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND "${TestType}" MATCHES "(CATCH_)?TEST_CASE_METHOD" AND TestFixture) + set(CTestName "${TestFixture}:${Name}") else() - # just to be thorough explicitly set the variable - set(_cmp0110_value) + set(CTestName "${Name}") + endif() + if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME) + set(CTestName "${TestTarget}:${CTestName}") + endif() + # add target to labels to enable running all tests added from this target + set(Labels ${TestTarget}) + if(TestStringsLength EQUAL 2) + list(GET TestStrings 1 Tags) + string(TOLOWER "${Tags}" Tags) + # remove target from labels if the test is hidden + if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*") + list(REMOVE_ITEM Labels ${TestTarget}) + endif() + string(REPLACE "]" ";" Tags "${Tags}") + string(REPLACE "[" "" Tags "${Tags}") + else() + # unset tags variable from previous loop + unset(Tags) endif() - foreach(TestName ${Tests}) - # Strip newlines - string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}") + list(APPEND Labels ${Tags}) - # Get test type and fixture if applicable - string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}") - string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}") - string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}") + set(HiddenTagFound OFF) + foreach(label ${Labels}) + string(REGEX MATCH "^!hide|^\\." result ${label}) + if(result) + set(HiddenTagFound ON) + break() + endif() + endforeach(label) + if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9") + ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label") + else() + ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"") + if(Labels) + ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}") + endif() - # Get string parts of test definition - string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}") + # Escape commas in the test spec + string(REPLACE "," "\\," Name ${Name}) - # Strip wrapping quotation marks - string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}") - string(REPLACE "\";\"" ";" TestStrings "${TestStrings}") + # Work around CMake 3.18.0 change in `add_test()`, before the escaped quotes were necessary, + # only with CMake 3.18.0 the escaped double quotes confuse the call. This change is reverted in 3.18.1 + # And properly introduced in 3.19 with the CMP0110 policy + if(_cmp0110_value STREQUAL "NEW" OR ${CMAKE_VERSION} VERSION_EQUAL "3.18") + ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to NEW, no need for add_test(\"\") workaround") + else() + ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to OLD adding \"\" for add_test() workaround") + set(CTestName "\"${CTestName}\"") + endif() - # Validate that a test name and tags have been provided - list(LENGTH TestStrings TestStringsLength) - if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1) - message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}") - endif() + # Handle template test cases + if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*") + set(Name "${Name} - *") + endif() - # Assign name and tags - list(GET TestStrings 0 Name) - if("${TestType}" STREQUAL "SCENARIO") - set(Name "Scenario: ${Name}") - endif() - if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND "${TestType}" MATCHES "(CATCH_)?TEST_CASE_METHOD" AND TestFixture ) - set(CTestName "${TestFixture}:${Name}") - else() - set(CTestName "${Name}") - endif() - if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME) - set(CTestName "${TestTarget}:${CTestName}") - endif() - # add target to labels to enable running all tests added from this target - set(Labels ${TestTarget}) - if(TestStringsLength EQUAL 2) - list(GET TestStrings 1 Tags) - string(TOLOWER "${Tags}" Tags) - # remove target from labels if the test is hidden - if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*") - list(REMOVE_ITEM Labels ${TestTarget}) - endif() - string(REPLACE "]" ";" Tags "${Tags}") - string(REPLACE "[" "" Tags "${Tags}") - else() - # unset tags variable from previous loop - unset(Tags) - endif() - - list(APPEND Labels ${Tags}) - - set(HiddenTagFound OFF) - foreach(label ${Labels}) - string(REGEX MATCH "^!hide|^\\." result ${label}) - if(result) - set(HiddenTagFound ON) - break() - endif() - endforeach(label) - if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9") - ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label") - else() - ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"") - if(Labels) - ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}") - endif() - - # Escape commas in the test spec - string(REPLACE "," "\\," Name ${Name}) - - # Work around CMake 3.18.0 change in `add_test()`, before the escaped quotes were necessary, - # only with CMake 3.18.0 the escaped double quotes confuse the call. This change is reverted in 3.18.1 - # And properly introduced in 3.19 with the CMP0110 policy - if(_cmp0110_value STREQUAL "NEW" OR ${CMAKE_VERSION} VERSION_EQUAL "3.18") - ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to NEW, no need for add_test(\"\") workaround") - else() - ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to OLD adding \"\" for add_test() workaround") - set(CTestName "\"${CTestName}\"") - endif() - - # Handle template test cases - if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*") - set(Name "${Name} - *") - endif() - - # Add the test and set its properties - add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $ ${Name} ${AdditionalCatchParameters}) - # Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead - if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8") - ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property") - set_tests_properties("${CTestName}" PROPERTIES DISABLED ON) - else() - set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran" - LABELS "${Labels}") - endif() - set_property( - TARGET ${TestTarget} - APPEND - PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") - set_property( - SOURCE ${SourceFile} - APPEND - PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") - endif() - - - endforeach() + # Add the test and set its properties + add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $ ${Name} ${AdditionalCatchParameters}) + # Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead + if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8") + ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property") + set_tests_properties("${CTestName}" PROPERTIES DISABLED ON) + else() + set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran" + LABELS "${Labels}") + endif() + set_property( + TARGET ${TestTarget} + APPEND + PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") + set_property( + SOURCE ${SourceFile} + APPEND + PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") + endif() + endforeach() endfunction() # entry point function(ParseAndAddCatchTests TestTarget) - message(DEPRECATION "ParseAndAddCatchTest: function deprecated because of possibility of missed test cases. Consider using 'catch_discover_tests' from 'Catch.cmake'") - ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}") - get_target_property(SourceFiles ${TestTarget} SOURCES) - ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}") - foreach(SourceFile ${SourceFiles}) - ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget}) - endforeach() - ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}") + message(DEPRECATION "ParseAndAddCatchTest: function deprecated because of possibility of missed test cases. Consider using 'catch_discover_tests' from 'Catch.cmake'") + ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}") + get_target_property(SourceFiles ${TestTarget} SOURCES) + ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}") + foreach(SourceFile ${SourceFiles}) + ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget}) + endforeach() + ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}") endfunction() diff --git a/fuzzing/CMakeLists.txt b/fuzzing/CMakeLists.txt index daba61df..8370fe39 100644 --- a/fuzzing/CMakeLists.txt +++ b/fuzzing/CMakeLists.txt @@ -15,6 +15,6 @@ target_compile_features(fuzzhelper PUBLIC cxx_std_17) target_link_options(fuzzhelper PUBLIC "-fsanitize=fuzzer") foreach(fuzzer TestSpecParser XmlWriter textflow) -add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp) -target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper) + add_executable(fuzz_${fuzzer} fuzz_${fuzzer}.cpp) + target_link_libraries(fuzz_${fuzzer} PRIVATE fuzzhelper) endforeach() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c40de040..f7f9ea84 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,7 +40,6 @@ set(BENCHMARK_SOURCES ) set(BENCHMARK_FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES}) - set(IMPL_HEADERS "${PROJECT_BINARY_DIR}/generated-includes/catch2/catch_user_config.hpp" ${SOURCES_DIR}/catch_user_config.hpp.in @@ -348,25 +347,23 @@ source_group("generated headers" ) add_library(Catch2 ${ALL_FILES}) -if (CATCH_ENABLE_REPRODUCIBLE_BUILD) - add_build_reproducibility_settings(Catch2) +if(CATCH_ENABLE_REPRODUCIBLE_BUILD) + add_build_reproducibility_settings(Catch2) endif() add_library(Catch2::Catch2 ALIAS Catch2) -if (ANDROID) - target_link_libraries(Catch2 PRIVATE log) +if(ANDROID) + target_link_libraries(Catch2 PRIVATE log) endif() set_target_properties(Catch2 PROPERTIES - DEBUG_POSTFIX "d" - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION}) + DEBUG_POSTFIX "d" + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION} +) # require C++14 -target_compile_features(Catch2 - PUBLIC - cxx_std_14 -) +target_compile_features(Catch2 PUBLIC cxx_std_14) configure_file( "${SOURCES_DIR}/catch_user_config.hpp.in" @@ -382,105 +379,97 @@ target_include_directories(Catch2 add_library(Catch2WithMain - ${SOURCES_DIR}/internal/catch_main.cpp + ${SOURCES_DIR}/internal/catch_main.cpp ) -if (CATCH_ENABLE_REPRODUCIBLE_BUILD) - add_build_reproducibility_settings(Catch2WithMain) +if(CATCH_ENABLE_REPRODUCIBLE_BUILD) + add_build_reproducibility_settings(Catch2WithMain) endif() add_library(Catch2::Catch2WithMain ALIAS Catch2WithMain) target_link_libraries(Catch2WithMain PUBLIC Catch2) set_target_properties(Catch2WithMain PROPERTIES OUTPUT_NAME "Catch2Main" - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION} + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION} ) set_target_properties(Catch2WithMain PROPERTIES DEBUG_POSTFIX "d") -if (NOT_SUBPROJECT) - # create and install an export set for catch target as Catch2::Catch - install( - TARGETS - Catch2 - Catch2WithMain - EXPORT - Catch2Targets - LIBRARY DESTINATION - ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION - ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION - ${CMAKE_INSTALL_BINDIR} - ) +if(NOT_SUBPROJECT) + # create and install an export set for catch target as Catch2::Catch + install( + TARGETS + Catch2 + Catch2WithMain + EXPORT + Catch2Targets + LIBRARY DESTINATION + ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION + ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION + ${CMAKE_INSTALL_BINDIR} + ) - - install( - EXPORT - Catch2Targets - NAMESPACE - Catch2:: - DESTINATION - ${CATCH_CMAKE_CONFIG_DESTINATION} - ) - # Install the headers - install( - DIRECTORY - "${SOURCES_DIR}" - "${PROJECT_BINARY_DIR}/generated-includes/catch2" # Also install the generated header - DESTINATION - "${CMAKE_INSTALL_INCLUDEDIR}" - FILES_MATCHING - PATTERN "*.hpp" - ) + install( + EXPORT + Catch2Targets + NAMESPACE + Catch2:: + DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + # Install the headers + install( + DIRECTORY + "${SOURCES_DIR}" + "${PROJECT_BINARY_DIR}/generated-includes/catch2" # Also install the generated header + DESTINATION + "${CMAKE_INSTALL_INCLUDEDIR}" + FILES_MATCHING + PATTERN "*.hpp" + ) endif() # Some tests require a full recompilation of Catch2 lib with different # compilation flags. They can link against this target to recompile all # the sources into the binary. -if (CATCH_BUILD_EXAMPLES OR CATCH_BUILD_EXTRA_TESTS) - add_library(Catch2_buildall_interface INTERFACE) - target_sources(Catch2_buildall_interface INTERFACE - ${ALL_FILES} - # Also include main entry point - ${SOURCES_DIR}/internal/catch_main.cpp - ) - target_include_directories(Catch2_buildall_interface - INTERFACE - $ - $ - $ - ) - target_compile_definitions(Catch2_buildall_interface - INTERFACE - CATCH_CONFIG_STATIC - ) - target_compile_features(Catch2_buildall_interface - INTERFACE - cxx_std_14 - ) +if(CATCH_BUILD_EXAMPLES OR CATCH_BUILD_EXTRA_TESTS) + add_library(Catch2_buildall_interface INTERFACE) + target_sources(Catch2_buildall_interface INTERFACE + ${ALL_FILES} + # Also include main entry point + ${SOURCES_DIR}/internal/catch_main.cpp + ) + target_include_directories(Catch2_buildall_interface + INTERFACE + $ + $ + $ + ) + target_compile_definitions(Catch2_buildall_interface INTERFACE CATCH_CONFIG_STATIC) + target_compile_features(Catch2_buildall_interface INTERFACE cxx_std_14) endif() list(APPEND CATCH_WARNING_TARGETS Catch2 Catch2WithMain) set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE) - # We still do not support building dynamic library with hidden visibility # so we want to check & warn users if they do this. However, we won't abort # the configuration step so that we don't have to also provide an override. -if (BUILD_SHARED_LIBS) +if(BUILD_SHARED_LIBS) + set_target_properties(Catch2 Catch2WithMain + PROPERTIES + WINDOWS_EXPORT_ALL_SYMBOLS ON + ) + + get_target_property(_VisPreset Catch2 CXX_VISIBILITY_PRESET) + if(NOT MSVC AND _VisPreset STREQUAL "hidden") set_target_properties(Catch2 Catch2WithMain PROPERTIES - WINDOWS_EXPORT_ALL_SYMBOLS ON + CXX_VISIBILITY_PRESET "default" + VISIBILITY_INLINES_HIDDEN OFF ) - - get_target_property(_VisPreset Catch2 CXX_VISIBILITY_PRESET) - if (NOT MSVC AND _VisPreset STREQUAL "hidden") - set_target_properties(Catch2 Catch2WithMain - PROPERTIES - CXX_VISIBILITY_PRESET "default" - VISIBILITY_INLINES_HIDDEN OFF - ) - message(WARNING "Setting Catch2's visibility to default." - " Hidden visibility is not supported.") - endif() + message(WARNING "Setting Catch2's visibility to default." + " Hidden visibility is not supported.") + endif() endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 37a5977e..bdd66a47 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,6 +1,6 @@ include(CatchMiscFunctions) -if (CATCH_BUILD_SURROGATES) +if(CATCH_BUILD_SURROGATES) message(STATUS "Configuring targets for surrogate TUs") # If the folder does not exist before we ask for output redirect to @@ -11,11 +11,9 @@ if (CATCH_BUILD_SURROGATES) # Returns the path to the generated file. function(createSurrogateFileTarget sourceHeader pathToFile) set(pathPrefix ${PROJECT_SOURCE_DIR}/src) - file(RELATIVE_PATH includePath ${pathPrefix} ${sourceHeader}) get_filename_component(basicFileName "${sourceHeader}" NAME_WE) - set(surrogateFilePath ${CMAKE_CURRENT_BINARY_DIR}/surrogates/surrogate_${basicFileName}.cpp) add_custom_command( @@ -41,10 +39,9 @@ if (CATCH_BUILD_SURROGATES) set(${OutArg} ${AllHeaders} PARENT_SCOPE) endfunction() - ExtractCatch2Headers(mainHeaders) - if (NOT mainHeaders) + if(NOT mainHeaders) message(FATAL_ERROR "No headers in the main target were detected. Something is broken.") endif() @@ -53,12 +50,10 @@ if (CATCH_BUILD_SURROGATES) list(APPEND surrogateFiles ${pathToGeneratedFile}) endforeach() - add_executable(Catch2SurrogateTarget ${surrogateFiles} ) target_link_libraries(Catch2SurrogateTarget PRIVATE Catch2WithMain) - endif() #### @@ -66,75 +61,72 @@ endif() # We need to disable property, but CMake doesn't support it # until 3.13 (not yet released) #### -if (MSVC) -configure_file(${CATCH_DIR}/tools/misc/SelfTest.vcxproj.user - ${CMAKE_BINARY_DIR}/tests - COPYONLY) +if(MSVC) + configure_file(${CATCH_DIR}/tools/misc/SelfTest.vcxproj.user ${CMAKE_BINARY_DIR}/tests COPYONLY) endif() #Temporary workaround - # define the sources of the self test # Please keep these ordered alphabetically set(TEST_SOURCES - ${SELF_TEST_DIR}/TestRegistrations.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Algorithms.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/AssertionHandler.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Clara.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/CmdLine.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/CmdLineHelpers.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/ColourImpl.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Details.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/FloatingPoint.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Integer.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/InternalBenchmark.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Json.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Parse.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Reporters.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Tag.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/TestCaseInfoHasher.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/TestSpec.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/TestSpecParser.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/TextFlow.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Sharding.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Stream.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/String.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/StringManip.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Xml.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/Traits.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/ToString.tests.cpp - ${SELF_TEST_DIR}/IntrospectiveTests/UniquePtr.tests.cpp - ${SELF_TEST_DIR}/helpers/parse_test_spec.cpp - ${SELF_TEST_DIR}/TimingTests/Sleep.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Approx.tests.cpp - ${SELF_TEST_DIR}/UsageTests/BDD.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Benchmark.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Class.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Compilation.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Condition.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Decomposition.tests.cpp - ${SELF_TEST_DIR}/UsageTests/EnumToString.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Exception.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Generators.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Message.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Misc.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Skip.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringByte.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringChrono.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringGeneral.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringOptional.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringPair.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringTuple.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringVariant.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringVector.tests.cpp - ${SELF_TEST_DIR}/UsageTests/ToStringWhich.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Tricky.tests.cpp - ${SELF_TEST_DIR}/UsageTests/VariadicMacros.tests.cpp - ${SELF_TEST_DIR}/UsageTests/MatchersRanges.tests.cpp - ${SELF_TEST_DIR}/UsageTests/Matchers.tests.cpp - ) + ${SELF_TEST_DIR}/TestRegistrations.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Algorithms.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/AssertionHandler.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Clara.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/CmdLine.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/CmdLineHelpers.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/ColourImpl.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Details.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/FloatingPoint.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Integer.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/InternalBenchmark.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Json.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Parse.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Reporters.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Tag.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/TestCaseInfoHasher.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/TestSpec.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/TestSpecParser.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/TextFlow.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Sharding.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Stream.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/String.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/StringManip.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Xml.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/Traits.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/ToString.tests.cpp + ${SELF_TEST_DIR}/IntrospectiveTests/UniquePtr.tests.cpp + ${SELF_TEST_DIR}/helpers/parse_test_spec.cpp + ${SELF_TEST_DIR}/TimingTests/Sleep.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Approx.tests.cpp + ${SELF_TEST_DIR}/UsageTests/BDD.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Benchmark.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Class.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Compilation.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Condition.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Decomposition.tests.cpp + ${SELF_TEST_DIR}/UsageTests/EnumToString.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Exception.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Generators.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Message.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Misc.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Skip.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringByte.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringChrono.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringGeneral.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringOptional.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringPair.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringTuple.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringVariant.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringVector.tests.cpp + ${SELF_TEST_DIR}/UsageTests/ToStringWhich.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Tricky.tests.cpp + ${SELF_TEST_DIR}/UsageTests/VariadicMacros.tests.cpp + ${SELF_TEST_DIR}/UsageTests/MatchersRanges.tests.cpp + ${SELF_TEST_DIR}/UsageTests/Matchers.tests.cpp +) set(TEST_HEADERS ${SELF_TEST_DIR}/helpers/parse_test_spec.hpp @@ -142,46 +134,45 @@ set(TEST_HEADERS ${SELF_TEST_DIR}/helpers/type_with_lit_0_comparisons.hpp ) - # Specify the headers, too, so CLion recognises them as project files set(HEADERS - ${TOP_LEVEL_HEADERS} - ${EXTERNAL_HEADERS} - ${INTERNAL_HEADERS} - ${REPORTER_HEADERS} - ${BENCHMARK_HEADERS} - ${BENCHMARK_SOURCES} + ${TOP_LEVEL_HEADERS} + ${EXTERNAL_HEADERS} + ${INTERNAL_HEADERS} + ${REPORTER_HEADERS} + ${BENCHMARK_HEADERS} + ${BENCHMARK_SOURCES} ) # Provide some groupings for IDEs -#SOURCE_GROUP("benchmark" FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES}) -#SOURCE_GROUP("Tests" FILES ${TEST_SOURCES}) +#source_group("benchmark" FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES}) +#source_group("Tests" FILES ${TEST_SOURCES}) include(CTest) add_executable(SelfTest ${TEST_SOURCES} ${TEST_HEADERS}) target_include_directories(SelfTest PRIVATE ${SELF_TEST_DIR}) target_link_libraries(SelfTest PRIVATE Catch2WithMain) -if (BUILD_SHARED_LIBS AND WIN32) - add_custom_command(TARGET SelfTest PRE_LINK - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $ $ - ) +if(BUILD_SHARED_LIBS AND WIN32) + add_custom_command(TARGET SelfTest PRE_LINK + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ + $ $ + ) endif() -if (CATCH_ENABLE_COVERAGE) - set(ENABLE_COVERAGE ON CACHE BOOL "Enable coverage build." FORCE) - find_package(codecov) - add_coverage(SelfTest) - list(APPEND LCOV_REMOVE_PATTERNS "'/usr/*'") - coverage_evaluate() +if(CATCH_ENABLE_COVERAGE) + set(ENABLE_COVERAGE ON CACHE BOOL "Enable coverage build." FORCE) + find_package(codecov) + add_coverage(SelfTest) + list(APPEND LCOV_REMOVE_PATTERNS "'/usr/*'") + coverage_evaluate() endif() # configure unit tests via CTest add_test(NAME RunTests COMMAND $ --order rand --rng-seed time) set_tests_properties(RunTests PROPERTIES - FAIL_REGULAR_EXPRESSION "Filters:" - COST 15 + FAIL_REGULAR_EXPRESSION "Filters:" + COST 15 ) # Because CTest does not allow us to check both return code _and_ expected @@ -189,8 +180,8 @@ set_tests_properties(RunTests PROPERTIES # the output, the second time we check the exit code. add_test(NAME List::Tests::Output COMMAND $ --list-tests --verbosity high) set_tests_properties(List::Tests::Output PROPERTIES - PASS_REGULAR_EXPRESSION "[0-9]+ test cases" - FAIL_REGULAR_EXPRESSION "Hidden Test" + PASS_REGULAR_EXPRESSION "[0-9]+ test cases" + FAIL_REGULAR_EXPRESSION "Hidden Test" ) # This should be equivalent to the old --list-test-names-only and be usable # with --input-file. @@ -198,35 +189,34 @@ add_test(NAME List::Tests::Quiet COMMAND $ --list-tests -- # Sadly we cannot ask for start-of-line and end-of-line in a ctest regex, # so we fail if we see space/tab at the start... set_tests_properties(List::Tests::Quiet PROPERTIES - PASS_REGULAR_EXPRESSION "\"#1905 -- test spec parser properly clears internal state between compound tests\"[\r\n]" - FAIL_REGULAR_EXPRESSION "[ \t]\"#1905 -- test spec parser properly clears internal state between compound tests\"" + PASS_REGULAR_EXPRESSION "\"#1905 -- test spec parser properly clears internal state between compound tests\"[\r\n]" + FAIL_REGULAR_EXPRESSION "[ \t]\"#1905 -- test spec parser properly clears internal state between compound tests\"" ) add_test(NAME List::Tests::ExitCode COMMAND $ --list-tests --verbosity high) add_test(NAME List::Tests::XmlOutput COMMAND $ --list-tests --verbosity high -r xml) set_tests_properties(List::Tests::XmlOutput PROPERTIES - PASS_REGULAR_EXPRESSION "[0-9]+" - FAIL_REGULAR_EXPRESSION "[0-9]+ test cases" + PASS_REGULAR_EXPRESSION "[0-9]+" + FAIL_REGULAR_EXPRESSION "[0-9]+ test cases" ) add_test(NAME List::Tags::Output COMMAND $ --list-tags) set_tests_properties(List::Tags::Output PROPERTIES - PASS_REGULAR_EXPRESSION "[0-9]+ tags" - FAIL_REGULAR_EXPRESSION "\\[\\.\\]") + PASS_REGULAR_EXPRESSION "[0-9]+ tags" + FAIL_REGULAR_EXPRESSION "\\[\\.\\]") add_test(NAME List::Tags::ExitCode COMMAND $ --list-tags) add_test(NAME List::Tags::XmlOutput COMMAND $ --list-tags -r xml) set_tests_properties(List::Tags::XmlOutput PROPERTIES - PASS_REGULAR_EXPRESSION "18" - FAIL_REGULAR_EXPRESSION "[0-9]+ tags" + PASS_REGULAR_EXPRESSION "18" + FAIL_REGULAR_EXPRESSION "[0-9]+ tags" ) - add_test(NAME List::Reporters::Output COMMAND $ --list-reporters) set_tests_properties(List::Reporters::Output PROPERTIES PASS_REGULAR_EXPRESSION "Available reporters:") add_test(NAME List::Reporters::ExitCode COMMAND $ --list-reporters) add_test(NAME List::Reporters::XmlOutput COMMAND $ --list-reporters -r xml) set_tests_properties(List::Reporters::XmlOutput PROPERTIES - PASS_REGULAR_EXPRESSION "compact" - FAIL_REGULAR_EXPRESSION "Available reporters:" + PASS_REGULAR_EXPRESSION "compact" + FAIL_REGULAR_EXPRESSION "Available reporters:" ) add_test(NAME List::Listeners::Output @@ -263,8 +253,8 @@ add_test(NAME TestSpecs::CombiningMatchingAndNonMatchingIsOk-1 COMMAND $ Tracker, "___nonexistent_test___") set_tests_properties(TestSpecs::CombiningMatchingAndNonMatchingIsOk-2 PROPERTIES - PASS_REGULAR_EXPRESSION "No test cases matched '\"___nonexistent_test___\"'" - FAIL_REGULAR_EXPRESSION "No tests ran" + PASS_REGULAR_EXPRESSION "No test cases matched '\"___nonexistent_test___\"'" + FAIL_REGULAR_EXPRESSION "No tests ran" ) add_test(NAME TestSpecs::NoMatchedTestsFail @@ -283,7 +273,7 @@ add_test(NAME TestSpecs::OverrideAllSkipFailure ) add_test(NAME TestSpecs::NonMatchingTestSpecIsRoundTrippable - COMMAND $ Tracker, "this test does not exist" "[nor does this tag]" + COMMAND $ Tracker, "this test does not exist" "[nor does this tag]" ) set_tests_properties(TestSpecs::NonMatchingTestSpecIsRoundTrippable PROPERTIES @@ -447,7 +437,6 @@ set_tests_properties("Benchmarking::SkipBenchmarkMacros" FAIL_REGULAR_EXPRESSION "benchmark name" ) - add_test(NAME "Benchmarking::FailureReporting::OptimizedOut" COMMAND $ "Failing benchmarks" -c "empty" -r xml @@ -510,7 +499,7 @@ set_tests_properties("ErrorHandling::InvalidTestSpecExitsEarly" FAIL_REGULAR_EXPRESSION "No tests ran" ) -if (MSVC) +if(MSVC) set(_NullFile "NUL") else() set(_NullFile "/dev/null") @@ -519,7 +508,7 @@ endif() # This test checks that there is nothing written out from the process, # but if CMake is running the tests under Valgrind or similar tool, then # that will write its own output to stdout and the test would fail. -if (NOT MEMORYCHECK_COMMAND) +if(NOT MEMORYCHECK_COMMAND) add_test(NAME "MultiReporter::CapturingReportersDontPropagateStdOut" COMMAND $ "Sends stuff to stdout and stderr" @@ -608,76 +597,71 @@ set_tests_properties("Reporters::JUnit::NamespacesAreNormalized" PASS_REGULAR_EXPRESSION "testcase classname=\"SelfTest(\.exe)?\\.A\\.B\\.TestClass\"" ) -if (CATCH_ENABLE_CONFIGURE_TESTS) - foreach(testName "DefaultReporter" "Disable" "DisableStringification" - "ExperimentalRedirect") - - add_test(NAME "CMakeConfig::${testName}" - COMMAND - "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_LIST_DIR}/TestScripts/testConfigure${testName}.py" "${CATCH_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" - ) - set_tests_properties("CMakeConfig::${testName}" - PROPERTIES - COST 240 - LABELS "uses-python" - ) - - endforeach() -endif() - -if (CATCH_ENABLE_CMAKE_HELPER_TESTS) - add_test(NAME "CMakeHelper::DiscoverTests" +if(CATCH_ENABLE_CONFIGURE_TESTS) + foreach(testName "DefaultReporter" "Disable" "DisableStringification" + "ExperimentalRedirect") + add_test(NAME "CMakeConfig::${testName}" COMMAND - "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_LIST_DIR}/TestScripts/DiscoverTests/VerifyRegistration.py" "${CATCH_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" + "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_LIST_DIR}/TestScripts/testConfigure${testName}.py" "${CATCH_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" ) - set_tests_properties("CMakeHelper::DiscoverTests" + set_tests_properties("CMakeConfig::${testName}" PROPERTIES COST 240 LABELS "uses-python" ) + endforeach() endif() -foreach (reporterName # "Automake" - the simple .trs format does not support any kind of comments/metadata - "compact" - "console" - "JUnit" - "SonarQube" - "TAP" - # "TeamCity" - does not seem to support test suite-level metadata/comments - "XML" - "JSON") +if(CATCH_ENABLE_CMAKE_HELPER_TESTS) + add_test(NAME "CMakeHelper::DiscoverTests" + COMMAND + "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_LIST_DIR}/TestScripts/DiscoverTests/VerifyRegistration.py" "${CATCH_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" + ) + set_tests_properties("CMakeHelper::DiscoverTests" + PROPERTIES + COST 240 + LABELS "uses-python" + ) +endif() - add_test(NAME "Reporters:Filters:${reporterName}" - COMMAND - $ [comparisons][string-case] "CaseInsensitiveLess is case insensitive" - --reporter ${reporterName} - ) - # Different regex for these two reporters, because the commas end up xml-escaped - if (reporterName MATCHES "JUnit|XML") - set(testCaseNameFormat ""CaseInsensitiveLess is case insensitive"") - elseif(reporterName MATCHES "JSON") - set(testCaseNameFormat "\\\\\"CaseInsensitiveLess is case insensitive\\\\\"") - else() - set(testCaseNameFormat "\"CaseInsensitiveLess is case insensitive\"") - endif() - set_tests_properties("Reporters:Filters:${reporterName}" - PROPERTIES - PASS_REGULAR_EXPRESSION "[fF]ilters.+\\[comparisons\\] \\[string-case\\] ${testCaseNameFormat}" - ) - - add_test(NAME "Reporters:RngSeed:${reporterName}" - COMMAND - $ "Factorials are computed" - --reporter ${reporterName} - --rng-seed 18181818 - ) - set_tests_properties("Reporters:RngSeed:${reporterName}" - PROPERTIES - PASS_REGULAR_EXPRESSION "18181818" - ) +foreach(reporterName # "Automake" - the simple .trs format does not support any kind of comments/metadata + "compact" + "console" + "JUnit" + "SonarQube" + "TAP" + # "TeamCity" - does not seem to support test suite-level metadata/comments + "XML" + "JSON") + add_test(NAME "Reporters:Filters:${reporterName}" + COMMAND + $ [comparisons][string-case] "CaseInsensitiveLess is case insensitive" + --reporter ${reporterName} + ) + # Different regex for these two reporters, because the commas end up xml-escaped + if(reporterName MATCHES "JUnit|XML") + set(testCaseNameFormat ""CaseInsensitiveLess is case insensitive"") + elseif(reporterName MATCHES "JSON") + set(testCaseNameFormat "\\\\\"CaseInsensitiveLess is case insensitive\\\\\"") + else() + set(testCaseNameFormat "\"CaseInsensitiveLess is case insensitive\"") + endif() + set_tests_properties("Reporters:Filters:${reporterName}" + PROPERTIES + PASS_REGULAR_EXPRESSION "[fF]ilters.+\\[comparisons\\] \\[string-case\\] ${testCaseNameFormat}" + ) + add_test(NAME "Reporters:RngSeed:${reporterName}" + COMMAND + $ "Factorials are computed" + --reporter ${reporterName} + --rng-seed 18181818 + ) + set_tests_properties("Reporters:RngSeed:${reporterName}" + PROPERTIES + PASS_REGULAR_EXPRESSION "18181818" + ) endforeach() - list(APPEND CATCH_WARNING_TARGETS SelfTest) set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE) diff --git a/tests/ExtraTests/CMakeLists.txt b/tests/ExtraTests/CMakeLists.txt index 3c38d675..77e8f756 100644 --- a/tests/ExtraTests/CMakeLists.txt +++ b/tests/ExtraTests/CMakeLists.txt @@ -1,12 +1,7 @@ -# -# Build extra tests. -# +cmake_minimum_required(VERSION 3.16) +project(Catch2ExtraTests LANGUAGES CXX) -cmake_minimum_required( VERSION 3.16 ) - -project( Catch2ExtraTests LANGUAGES CXX ) - -message( STATUS "Extra tests included" ) +message(STATUS "Extra tests included") add_test( NAME TestShardingIntegration @@ -21,8 +16,7 @@ add_test( NAME TestSharding::OverlyLargeShardIndex COMMAND $ --shard-index 5 --shard-count 5 ) -set_tests_properties( - TestSharding::OverlyLargeShardIndex +set_tests_properties(TestSharding::OverlyLargeShardIndex PROPERTIES PASS_REGULAR_EXPRESSION "The shard count \\(5\\) must be greater than the shard index \\(5\\)" ) @@ -31,8 +25,7 @@ set_tests_properties( # they have non-trivial execution time, so they are categorized as # extra tests, so that they are run less. add_test(NAME MinDuration::SimpleThreshold COMMAND $ --min-duration 0.950 [min_duration_test]) -set_tests_properties( - MinDuration::SimpleThreshold +set_tests_properties(MinDuration::SimpleThreshold PROPERTIES PASS_REGULAR_EXPRESSION "s: sleep_for_1000ms" FAIL_REGULAR_EXPRESSION "sleep_for_100ms" @@ -43,8 +36,7 @@ set_tests_properties( # -d yes overrides the threshold, so we should see the faster test even # with a ridiculous high min duration threshold add_test(NAME MinDuration::DurationOverrideYes COMMAND $ --min-duration 1.0 -d yes [min_duration_test]) -set_tests_properties( - MinDuration::DurationOverrideYes +set_tests_properties(MinDuration::DurationOverrideYes PROPERTIES PASS_REGULAR_EXPRESSION "s: sleep_for_100ms" ) @@ -52,27 +44,24 @@ set_tests_properties( # -d no overrides the threshold, so we should never see any tests even # with ridiculously low min duration threshold add_test(NAME MinDuration::DurationOverrideNo COMMAND $ --min-duration 0.0001 -d no [min_duration_test]) -set_tests_properties( - MinDuration::DurationOverrideNo +set_tests_properties(MinDuration::DurationOverrideNo PROPERTIES FAIL_REGULAR_EXPRESSION "sleep_for_250ms" ) - # ------------ end of duration reporting tests # define folders used: -set( TESTS_DIR ${CATCH_DIR}/tests/ExtraTests ) +set(TESTS_DIR ${CATCH_DIR}/tests/ExtraTests) add_executable(PrefixedMacros ${TESTS_DIR}/X01-PrefixedMacros.cpp) -target_compile_definitions( PrefixedMacros PRIVATE CATCH_CONFIG_PREFIX_ALL CATCH_CONFIG_RUNTIME_STATIC_REQUIRE ) +target_compile_definitions(PrefixedMacros PRIVATE CATCH_CONFIG_PREFIX_ALL CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) # Macro configuration does not touch the compiled parts, so we can link # it against the main library -target_link_libraries( PrefixedMacros Catch2WithMain ) +target_link_libraries(PrefixedMacros Catch2WithMain) add_test(NAME CATCH_CONFIG_PREFIX_ALL COMMAND PrefixedMacros -s) -set_tests_properties( - CATCH_CONFIG_PREFIX_ALL +set_tests_properties(CATCH_CONFIG_PREFIX_ALL PROPERTIES PASS_REGULAR_EXPRESSION "CATCH_" FAIL_REGULAR_EXPRESSION @@ -81,51 +70,47 @@ set_tests_properties( " REQUIRE; REQUIRE_FALSE; REQUIRE_THROWS; REQUIRE_THROWS_AS; REQUIRE_THROWS_WITH; REQUIRE_THROWS_MATCHES; REQUIRE_NOTHROW; CHECK; CHECK_FALSE; CHECKED_IF; CHECKED_ELSE; CHECK_NOFAIL; CHECK_THROWS; CHECK_THROWS_AS; CHECK_THROWS_WITH; CHECK_THROWS_MATCHES; CHECK_NOTHROW; REQUIRE_THAT; CHECK_THAT" ) - add_executable(DisabledMacros ${TESTS_DIR}/X02-DisabledMacros.cpp) -target_compile_definitions( DisabledMacros PRIVATE CATCH_CONFIG_DISABLE ) +target_compile_definitions(DisabledMacros PRIVATE CATCH_CONFIG_DISABLE) # Macro configuration does not touch the compiled parts, so we can link # it against the main library -target_link_libraries( DisabledMacros Catch2WithMain ) +target_link_libraries(DisabledMacros Catch2WithMain) add_test(NAME CATCH_CONFIG_DISABLE-1 COMMAND DisabledMacros -s) -set_tests_properties( - CATCH_CONFIG_DISABLE-1 +set_tests_properties(CATCH_CONFIG_DISABLE-1 PROPERTIES PASS_REGULAR_EXPRESSION "No tests ran" FAIL_REGULAR_EXPRESSION "This should not happen" ) add_test(NAME CATCH_CONFIG_DISABLE-2 COMMAND DisabledMacros --list-tests) -set_tests_properties( - CATCH_CONFIG_DISABLE-2 +set_tests_properties(CATCH_CONFIG_DISABLE-2 PROPERTIES PASS_REGULAR_EXPRESSION "0 test cases" ) -add_executable( DisabledExceptions-DefaultHandler ${TESTS_DIR}/X03-DisabledExceptions-DefaultHandler.cpp ) -add_executable( DisabledExceptions-CustomHandler ${TESTS_DIR}/X04-DisabledExceptions-CustomHandler.cpp ) +add_executable(DisabledExceptions-DefaultHandler ${TESTS_DIR}/X03-DisabledExceptions-DefaultHandler.cpp) +add_executable(DisabledExceptions-CustomHandler ${TESTS_DIR}/X04-DisabledExceptions-CustomHandler.cpp) foreach(target DisabledExceptions-DefaultHandler DisabledExceptions-CustomHandler) - target_compile_options( ${target} + target_compile_options(${target} PUBLIC $<$:/EHs-c-;/D_HAS_EXCEPTIONS=0> $<$,$,$>:-fno-exceptions> ) target_link_libraries(${target} Catch2_buildall_interface) endforeach() -target_compile_definitions( DisabledExceptions-CustomHandler PUBLIC CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER ) +target_compile_definitions(DisabledExceptions-CustomHandler PUBLIC CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) add_test(NAME CATCH_CONFIG_DISABLE_EXCEPTIONS-1 COMMAND DisabledExceptions-DefaultHandler "Tests that run") -set_tests_properties( - CATCH_CONFIG_DISABLE_EXCEPTIONS-1 +set_tests_properties(CATCH_CONFIG_DISABLE_EXCEPTIONS-1 PROPERTIES PASS_REGULAR_EXPRESSION "assertions: 4 \| 2 passed \| 2 failed" FAIL_REGULAR_EXPRESSION "abort;terminate;fatal" ) -add_executable( BazelReporter ${TESTS_DIR}/X30-BazelReporter.cpp ) -target_compile_definitions( BazelReporter PRIVATE CATCH_CONFIG_BAZEL_SUPPORT ) +add_executable(BazelReporter ${TESTS_DIR}/X30-BazelReporter.cpp) +target_compile_definitions(BazelReporter PRIVATE CATCH_CONFIG_BAZEL_SUPPORT) target_link_libraries(BazelReporter Catch2_buildall_interface) add_test(NAME CATCH_CONFIG_BAZEL_REPORTER-1 COMMAND @@ -137,7 +122,7 @@ set_tests_properties(CATCH_CONFIG_BAZEL_REPORTER-1 ) # We must now test this works without the build flag. -add_executable( BazelReporterNoCatchConfig ${TESTS_DIR}/X30-BazelReporter.cpp ) +add_executable(BazelReporterNoCatchConfig ${TESTS_DIR}/X30-BazelReporter.cpp) target_link_libraries(BazelReporterNoCatchConfig Catch2WithMain) add_test(NAME NO_CATCH_CONFIG_BAZEL_REPORTER-1 COMMAND @@ -159,7 +144,6 @@ set_tests_properties(BazelEnv::TESTBRIDGE_TEST_ONLY PASS_REGULAR_EXPRESSION "All tests passed \\(1 assertion in 1 test case\\)" ) - add_test(NAME BazelEnv::Sharding COMMAND "${PYTHON_EXECUTABLE}" "${CATCH_DIR}/tests/TestScripts/testBazelSharding.py" @@ -171,82 +155,69 @@ set_tests_properties(BazelEnv::Sharding LABELS "uses-python" ) - # The default handler on Windows leads to the just-in-time debugger firing, # which makes this test unsuitable for CI and headless runs, as it opens # up an interactive dialog. -if (NOT WIN32) +if(NOT WIN32) add_test(NAME CATCH_CONFIG_DISABLE_EXCEPTIONS-2 COMMAND DisabledExceptions-DefaultHandler "Tests that abort") - set_tests_properties( - CATCH_CONFIG_DISABLE_EXCEPTIONS-2 + set_tests_properties(CATCH_CONFIG_DISABLE_EXCEPTIONS-2 PROPERTIES PASS_REGULAR_EXPRESSION "Catch will terminate" ) endif() - add_test(NAME CATCH_CONFIG_DISABLE_EXCEPTIONS-3 COMMAND DisabledExceptions-CustomHandler "Tests that run") -set_tests_properties( - CATCH_CONFIG_DISABLE_EXCEPTIONS-3 +set_tests_properties(CATCH_CONFIG_DISABLE_EXCEPTIONS-3 PROPERTIES PASS_REGULAR_EXPRESSION "assertions: 4 \| 2 passed \| 2 failed" FAIL_REGULAR_EXPRESSION "====== CUSTOM HANDLER ======" ) add_test(NAME CATCH_CONFIG_DISABLE_EXCEPTIONS-4 COMMAND DisabledExceptions-CustomHandler "Tests that abort") -set_tests_properties( - CATCH_CONFIG_DISABLE_EXCEPTIONS-4 +set_tests_properties(CATCH_CONFIG_DISABLE_EXCEPTIONS-4 PROPERTIES PASS_REGULAR_EXPRESSION "====== CUSTOM HANDLER ======" ) - add_executable(DeferredStaticChecks ${TESTS_DIR}/X05-DeferredStaticChecks.cpp) target_link_libraries(DeferredStaticChecks PRIVATE Catch2WithMain) target_compile_definitions(DeferredStaticChecks PRIVATE "CATCH_CONFIG_RUNTIME_STATIC_REQUIRE") add_test(NAME DeferredStaticChecks COMMAND DeferredStaticChecks -r compact) -set_tests_properties( - DeferredStaticChecks +set_tests_properties(DeferredStaticChecks PROPERTIES PASS_REGULAR_EXPRESSION "test cases: 1 \\| 1 failed\nassertions: 3 \\| 3 failed" ) - add_executable(FallbackStringifier ${TESTS_DIR}/X10-FallbackStringifier.cpp) -target_compile_definitions( FallbackStringifier PRIVATE CATCH_CONFIG_FALLBACK_STRINGIFIER=fallbackStringifier ) -target_link_libraries( FallbackStringifier Catch2WithMain ) +target_compile_definitions(FallbackStringifier PRIVATE CATCH_CONFIG_FALLBACK_STRINGIFIER=fallbackStringifier) +target_link_libraries(FallbackStringifier Catch2WithMain) add_test(NAME FallbackStringifier COMMAND FallbackStringifier -r compact -s) -set_tests_properties( - FallbackStringifier +set_tests_properties(FallbackStringifier PROPERTIES PASS_REGULAR_EXPRESSION "foo{} for: { !!! }" ) - add_executable(DisableStringification ${TESTS_DIR}/X11-DisableStringification.cpp) -target_compile_definitions( DisableStringification PRIVATE CATCH_CONFIG_DISABLE_STRINGIFICATION ) +target_compile_definitions(DisableStringification PRIVATE CATCH_CONFIG_DISABLE_STRINGIFICATION) target_link_libraries(DisableStringification Catch2WithMain) add_test(NAME CATCH_CONFIG_DISABLE_STRINGIFICATION COMMAND DisableStringification -r compact -s) -set_tests_properties( - CATCH_CONFIG_DISABLE_STRINGIFICATION +set_tests_properties(CATCH_CONFIG_DISABLE_STRINGIFICATION PROPERTIES PASS_REGULAR_EXPRESSION "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" FAIL_REGULAR_EXPRESSION "Hidden{} == Hidden{}" ) - # This test touches windows.h, so it should only be compiled under msvc -if (MSVC) - # This test fails if it does not compile and succeeds otherwise - add_executable(WindowsHeader ${TESTS_DIR}/X90-WindowsHeaderInclusion.cpp) - target_link_libraries( WindowsHeader Catch2WithMain ) - add_test(NAME WindowsHeader COMMAND WindowsHeader -r compact) - list(APPEND CATCH_WARNING_TARGETS ${EXTRA_TEST_BINARIES} WindowsHeader) +if(MSVC) + # This test fails if it does not compile and succeeds otherwise + add_executable(WindowsHeader ${TESTS_DIR}/X90-WindowsHeaderInclusion.cpp) + target_link_libraries(WindowsHeader Catch2WithMain) + add_test(NAME WindowsHeader COMMAND WindowsHeader -r compact) + list(APPEND CATCH_WARNING_TARGETS ${EXTRA_TEST_BINARIES} WindowsHeader) endif() - add_executable(PartialTestCaseEvents ${TESTS_DIR}/X21-PartialTestCaseEvents.cpp) target_link_libraries(PartialTestCaseEvents PRIVATE Catch2WithMain) add_test( @@ -264,22 +235,19 @@ add_test( NAME BenchmarksInCumulativeReporter COMMAND BenchmarksInCumulativeReporter --reporter testReporter ) -set_tests_properties( - BenchmarksInCumulativeReporter +set_tests_properties(BenchmarksInCumulativeReporter PROPERTIES PASS_REGULAR_EXPRESSION "1\n2\n3\n4\n5\n" COST 30 ) - add_executable(CasingInReporterNames ${TESTS_DIR}/X23-CasingInReporterNames.cpp) target_link_libraries(CasingInReporterNames PRIVATE Catch2::Catch2WithMain) add_test( NAME Reporters::registration-is-case-preserving COMMAND CasingInReporterNames --list-reporters ) -set_tests_properties( - Reporters::registration-is-case-preserving +set_tests_properties(Reporters::registration-is-case-preserving PROPERTIES PASS_REGULAR_EXPRESSION "testReporterCASED" ) @@ -287,8 +255,7 @@ add_test( NAME Reporters::selection-is-case-insensitive COMMAND CasingInReporterNames -r testReportercased ) -set_tests_properties( - Reporters::selection-is-case-insensitive +set_tests_properties(Reporters::selection-is-case-insensitive PROPERTIES PASS_REGULAR_EXPRESSION "TestReporter constructed" ) @@ -300,15 +267,13 @@ add_test( COMMAND CapturedStdoutInTestCaseEvents --reporter test-reporter ) -set_tests_properties( - Reporters::CapturedStdOutInEvents +set_tests_properties(Reporters::CapturedStdOutInEvents PROPERTIES PASS_REGULAR_EXPRESSION "X27 - TestReporter constructed" FAIL_REGULAR_EXPRESSION "X27 ERROR" ) - -if (MSVC) +if(MSVC) set(_NullFile "NUL") else() set(_NullFile "/dev/null") @@ -320,7 +285,7 @@ target_link_libraries(ListenerStdoutCaptureInMultireporter PRIVATE Catch2::Catch # This test checks that there is nothing written out from the process, # but if CMake is running the tests under Valgrind or similar tool, then # that will write its own output to stdout and the test would fail. -if (NOT MEMORYCHECK_COMMAND) +if(NOT MEMORYCHECK_COMMAND) add_test( NAME MultiReporter::NoncapturingListenerDoesntCauseStdoutPassThrough COMMAND ListenerStdoutCaptureInMultireporter @@ -328,15 +293,13 @@ if (NOT MEMORYCHECK_COMMAND) --reporter junit::out=${_NullFile} ) - set_tests_properties( - MultiReporter::NoncapturingListenerDoesntCauseStdoutPassThrough + set_tests_properties(MultiReporter::NoncapturingListenerDoesntCauseStdoutPassThrough PROPERTIES PASS_REGULAR_EXPRESSION "X24 - NonCapturingListener initialized" FAIL_REGULAR_EXPRESSION "X24 - FooBarBaz" ) endif() - add_executable(ListenerCanAskForCapturedStdout ${TESTS_DIR}/X25-ListenerCanAskForCapturedStdout.cpp) target_link_libraries(ListenerCanAskForCapturedStdout PRIVATE Catch2::Catch2WithMain) add_test( @@ -345,8 +308,7 @@ add_test( --reporter compact::out=${_NullFile} --reporter console::out=${_NullFile} ) -set_tests_properties( - MultiReporter::CapturingListenerCausesStdoutCapture +set_tests_properties(MultiReporter::CapturingListenerCausesStdoutCapture PROPERTIES PASS_REGULAR_EXPRESSION "CapturingListener initialized" FAIL_REGULAR_EXPRESSION "X25 - ERROR" @@ -359,8 +321,7 @@ add_test( COMMAND ReporterPreferencesForPassingAssertionsIsRespected --reporter test-reporter ) -set_tests_properties( - Reporters::PreferencesForPassingAssertionsIsRespected +set_tests_properties(Reporters::PreferencesForPassingAssertionsIsRespected PROPERTIES PASS_REGULAR_EXPRESSION "X26 - TestReporter constructed" FAIL_REGULAR_EXPRESSION "X26 - assertionEnded" @@ -371,8 +332,7 @@ add_test( --reporter test-reporter --reporter console::out=${_NullFile} ) -set_tests_properties( - MultiReporter::PreferencesForPassingAssertionsIsRespected +set_tests_properties(MultiReporter::PreferencesForPassingAssertionsIsRespected PROPERTIES PASS_REGULAR_EXPRESSION "X26 - TestReporter constructed" FAIL_REGULAR_EXPRESSION "X26 - assertionEnded" @@ -384,8 +344,7 @@ add_test( NAME ListenersGetEventsBeforeReporters COMMAND ListenersGetEventsBeforeReporters --reporter test-reporter ) -set_tests_properties( - ListenersGetEventsBeforeReporters +set_tests_properties(ListenersGetEventsBeforeReporters PROPERTIES PASS_REGULAR_EXPRESSION "X28 - TestReporter constructed" FAIL_REGULAR_EXPRESSION "X28 - ERROR" @@ -398,21 +357,18 @@ add_test( COMMAND CustomArgumentsForReporters --reporter "test-reporter::Xa b=c 1::Xz:e = 1234" ) -set_tests_properties( - CustomArgumentsForReporters +set_tests_properties(CustomArgumentsForReporters PROPERTIES PASS_REGULAR_EXPRESSION "Xa b=c 1::Xz:e = 1234" ) - add_executable(DuplicatedTestCases-SameNameAndTags ${TESTS_DIR}/X31-DuplicatedTestCases.cpp) target_link_libraries(DuplicatedTestCases-SameNameAndTags PRIVATE Catch2::Catch2WithMain) add_test( NAME DuplicatedTestCases::SameNameAndTags COMMAND $ ) -set_tests_properties( - DuplicatedTestCases::SameNameAndTags +set_tests_properties(DuplicatedTestCases::SameNameAndTags PROPERTIES PASS_REGULAR_EXPRESSION "error: .* already defined\\." ) @@ -423,8 +379,7 @@ add_test( NAME DuplicatedTestCases::SameNameDifferentTags COMMAND $ ) -set_tests_properties( - DuplicatedTestCases::SameNameDifferentTags +set_tests_properties(DuplicatedTestCases::SameNameDifferentTags PROPERTIES FAIL_REGULAR_EXPRESSION "error: .* already defined\\." ) @@ -435,8 +390,7 @@ add_test( NAME DuplicatedTestCases::DuplicatedTestCaseMethods COMMAND $ ) -set_tests_properties( - DuplicatedTestCases::DuplicatedTestCaseMethods +set_tests_properties(DuplicatedTestCases::DuplicatedTestCaseMethods PROPERTIES PASS_REGULAR_EXPRESSION "error: .* already defined\\." ) @@ -447,21 +401,18 @@ add_test( NAME DuplicatedTestCases::DuplicatedTestCaseMethodsDifferentFixtures COMMAND $ ) -set_tests_properties( - DuplicatedTestCases::DuplicatedTestCaseMethodsDifferentFixtures +set_tests_properties(DuplicatedTestCases::DuplicatedTestCaseMethodsDifferentFixtures PROPERTIES FAIL_REGULAR_EXPRESSION "error: .* already defined\\." ) - add_executable(DuplicatedReporters ${TESTS_DIR}/X35-DuplicatedReporterNames.cpp) target_link_libraries(DuplicatedReporters PRIVATE Catch2::Catch2WithMain) add_test( NAME Reporters::RegistrationErrorsAreCaught COMMAND $ ) -set_tests_properties( - Reporters::RegistrationErrorsAreCaught +set_tests_properties(Reporters::RegistrationErrorsAreCaught PROPERTIES PASS_REGULAR_EXPRESSION "Errors occurred during startup!" ) @@ -472,8 +423,7 @@ add_test( NAME Reporters::CrashInJunitReporter COMMAND ${CMAKE_COMMAND} -E env $ --reporter JUnit ) -set_tests_properties( - Reporters::CrashInJunitReporter +set_tests_properties(Reporters::CrashInJunitReporter PROPERTIES PASS_REGULAR_EXPRESSION "" LABELS "uses-signals" @@ -493,8 +443,7 @@ add_test( #add_executable(DebugBreakMacros ${TESTS_DIR}/X12-CustomDebugBreakMacro.cpp) #target_link_libraries(DebugBreakMacros Catch2) #add_test(NAME DebugBreakMacros COMMAND DebugBreakMacros --break) -#set_tests_properties( -# DebugBreakMacros +#set_tests_properties(DebugBreakMacros # PROPERTIES # PASS_REGULAR_EXPRESSION "Pretty please, break into debugger" #) @@ -521,7 +470,6 @@ add_test( COMMAND $ --list-listeners ) - add_executable(AllSkipped ${TESTS_DIR}/X93-AllSkipped.cpp) target_link_libraries(AllSkipped PRIVATE Catch2::Catch2WithMain) @@ -534,21 +482,21 @@ set_tests_properties(TestSpecs::SkippingAllTestsFails WILL_FAIL ON ) -set( EXTRA_TEST_BINARIES - AllSkipped - PrefixedMacros - DisabledMacros - DisabledExceptions-DefaultHandler - DisabledExceptions-CustomHandler - FallbackStringifier - DisableStringification - PartialTestCaseEvents - DuplicatedTestCases-SameNameAndTags - DuplicatedTestCases-SameNameDifferentTags - DuplicatedTestCases-DuplicatedTestCaseMethods - NoTests - ListenersGetEventsBeforeReporters -# DebugBreakMacros +set(EXTRA_TEST_BINARIES + AllSkipped + PrefixedMacros + DisabledMacros + DisabledExceptions-DefaultHandler + DisabledExceptions-CustomHandler + FallbackStringifier + DisableStringification + PartialTestCaseEvents + DuplicatedTestCases-SameNameAndTags + DuplicatedTestCases-SameNameDifferentTags + DuplicatedTestCases-DuplicatedTestCaseMethods + NoTests + ListenersGetEventsBeforeReporters +# DebugBreakMacros ) # Notice that we are modifying EXTRA_TEST_BINARIES destructively, do not @@ -557,7 +505,6 @@ list(FILTER EXTRA_TEST_BINARIES EXCLUDE REGEX "DisabledExceptions.*") list(APPEND CATCH_WARNING_TARGETS ${EXTRA_TEST_BINARIES}) set(CATCH_WARNING_TARGETS ${CATCH_WARNING_TARGETS} PARENT_SCOPE) - # This sets up a one-off executable that compiles against the amalgamated # files, and then runs it for a super simple check that the amalgamated # files are usable. @@ -570,8 +517,7 @@ target_include_directories(AmalgamatedTestCompilation PRIVATE ${CATCH_DIR}/extra target_compile_features(AmalgamatedTestCompilation PRIVATE cxx_std_14) add_test(NAME AmalgamatedFileTest COMMAND AmalgamatedTestCompilation) -set_tests_properties( - AmalgamatedFileTest +set_tests_properties(AmalgamatedFileTest PROPERTIES PASS_REGULAR_EXPRESSION "All tests passed \\(14 assertions in 3 test cases\\)" ) diff --git a/tests/TestScripts/DiscoverTests/CMakeLists.txt b/tests/TestScripts/DiscoverTests/CMakeLists.txt index f0b49f4d..1bcefbb1 100644 --- a/tests/TestScripts/DiscoverTests/CMakeLists.txt +++ b/tests/TestScripts/DiscoverTests/CMakeLists.txt @@ -1,24 +1,18 @@ cmake_minimum_required(VERSION 3.16) +project(discover-tests-test LANGUAGES CXX) -project(discover-tests-test - LANGUAGES CXX -) - -add_executable(tests - register-tests.cpp -) - +add_executable(tests register-tests.cpp) add_subdirectory(${CATCH2_PATH} catch2-build) target_link_libraries(tests PRIVATE Catch2::Catch2WithMain) enable_testing() include(Catch) set(extra_args) -if (CMAKE_VERSION GREATER_EQUAL 3.27) - list(APPEND extra_args - DL_PATHS "${CMAKE_CURRENT_LIST_DIR};${CMAKE_CURRENT_LIST_DIR}/.." - ) -endif () +if(CMAKE_VERSION GREATER_EQUAL 3.27) + list(APPEND extra_args + DL_PATHS "${CMAKE_CURRENT_LIST_DIR};${CMAKE_CURRENT_LIST_DIR}/.." + ) +endif() catch_discover_tests( tests ADD_TAGS_AS_LABELS diff --git a/tools/misc/CMakeLists.txt b/tools/misc/CMakeLists.txt index 59811dfe..2531666c 100644 --- a/tools/misc/CMakeLists.txt +++ b/tools/misc/CMakeLists.txt @@ -1,11 +1,10 @@ cmake_minimum_required(VERSION 3.16) - project(CatchCoverageHelper) add_executable(CoverageHelper coverage-helper.cpp) set_property(TARGET CoverageHelper PROPERTY CXX_STANDARD 11) set_property(TARGET CoverageHelper PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET CoverageHelper PROPERTY CXX_EXTENSIONS OFF) -if (MSVC) - target_compile_options( CoverageHelper PRIVATE /W4 /w44265 /WX /w44061 /w44062 ) +if(MSVC) + target_compile_options(CoverageHelper PRIVATE /W4 /w44265 /WX /w44061 /w44062) endif()