Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorHolger Kaelberer2023-04-11 09:43:44 +0200
committerMartin Hořeňovský2023-04-19 23:51:42 +0200
commit4e8399d83532cc8f990caa3937319c3f8f92e8b8 (patch)
tree793fc607c5223c017e9070ea29c51214837116b1
parent9a2a4eadc0e50e0534278010624eac15991413a7 (diff)
downloadcatch3-4e8399d83532cc8f990caa3937319c3f8f92e8b8.tar.gz
CatchAddTests.cmake: Refactor into callable method
Move test discovery logic into new catch_discover_tests_impl method and make CatchAddTests aware of whether it is being launched in CMake's script mode. When launched in script mode, catch_discover_tests_impl is called passing arguments obtained from the definitions passed into the call to cmake. This preserves the existing behavior assumed by Catch.cmake. Looking ahead, it also allows CatchAddTests to be included in generated files and call catch_discover_tests_impl to perform test discovery at test runtime with the new PRE_TEST discovery mode introduced later.
-rw-r--r--extras/CatchAddTests.cmake269
1 files changed, 150 insertions, 119 deletions
diff --git a/extras/CatchAddTests.cmake b/extras/CatchAddTests.cmake
index 2df663dc..91f79f3c 100644
--- a/extras/CatchAddTests.cmake
+++ b/extras/CatchAddTests.cmake
@@ -1,28 +1,6 @@
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
-set(prefix "${TEST_PREFIX}")
-set(suffix "${TEST_SUFFIX}")
-set(spec ${TEST_SPEC})
-set(extra_args ${TEST_EXTRA_ARGS})
-set(properties ${TEST_PROPERTIES})
-set(reporter ${TEST_REPORTER})
-set(output_dir ${TEST_OUTPUT_DIR})
-set(output_prefix ${TEST_OUTPUT_PREFIX})
-set(output_suffix ${TEST_OUTPUT_SUFFIX})
-set(dl_paths ${TEST_DL_PATHS})
-set(script)
-set(suite)
-set(tests)
-
-if(WIN32)
- set(dl_paths_variable_name PATH)
-elseif(APPLE)
- set(dl_paths_variable_name DYLD_LIBRARY_PATH)
-else()
- set(dl_paths_variable_name LD_LIBRARY_PATH)
-endif()
-
function(add_command NAME)
set(_args "")
# use ARGV* instead of ARGN, because ARGN splits arrays into multiple arguments
@@ -38,119 +16,172 @@ function(add_command NAME)
set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE)
endfunction()
-# Run test executable to get list of available tests
-if(NOT EXISTS "${TEST_EXECUTABLE}")
- message(FATAL_ERROR
- "Specified test executable '${TEST_EXECUTABLE}' does not exist"
- )
-endif()
-
-if(dl_paths)
- cmake_path(CONVERT "${dl_paths}" TO_NATIVE_PATH_LIST paths)
- set(ENV{${dl_paths_variable_name}} "${paths}")
-endif()
+function(catch_discover_tests_impl)
-execute_process(
- COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-tests --verbosity quiet
- OUTPUT_VARIABLE output
- RESULT_VARIABLE result
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
-)
-if(NOT ${result} EQUAL 0)
- message(FATAL_ERROR
- "Error running test executable '${TEST_EXECUTABLE}':\n"
- " Result: ${result}\n"
- " Output: ${output}\n"
+ cmake_parse_arguments(
+ ""
+ ""
+ "TEST_EXECUTABLE;TEST_WORKING_DIR;TEST_DL_PATHS;TEST_OUTPUT_DIR;TEST_OUTPUT_PREFIX;TEST_OUTPUT_SUFFIX;TEST_PREFIX;TEST_REPORTER;TEST_SPEC;TEST_SUFFIX;TEST_LIST;CTEST_FILE"
+ "TEST_EXTRA_ARGS;TEST_PROPERTIES;TEST_EXECUTOR"
+ ${ARGN}
)
-endif()
-string(REPLACE "\n" ";" output "${output}")
+ set(prefix "${_TEST_PREFIX}")
+ set(suffix "${_TEST_SUFFIX}")
+ set(spec ${_TEST_SPEC})
+ set(extra_args ${_TEST_EXTRA_ARGS})
+ set(properties ${_TEST_PROPERTIES})
+ set(reporter ${_TEST_REPORTER})
+ set(output_dir ${_TEST_OUTPUT_DIR})
+ set(output_prefix ${_TEST_OUTPUT_PREFIX})
+ set(output_suffix ${_TEST_OUTPUT_SUFFIX})
+ set(dl_paths ${_TEST_DL_PATHS})
+ set(script)
+ set(suite)
+ set(tests)
+
+ if(WIN32)
+ set(dl_paths_variable_name PATH)
+ elseif(APPLE)
+ set(dl_paths_variable_name DYLD_LIBRARY_PATH)
+ else()
+ set(dl_paths_variable_name LD_LIBRARY_PATH)
+ endif()
-# Prepare reporter
-if(reporter)
- set(reporter_arg "--reporter ${reporter}")
+ # Run test executable to get list of available tests
+ if(NOT EXISTS "${_TEST_EXECUTABLE}")
+ message(FATAL_ERROR
+ "Specified test executable '${_TEST_EXECUTABLE}' does not exist"
+ )
+ endif()
+
+ if(dl_paths)
+ cmake_path(CONVERT "${dl_paths}" TO_NATIVE_PATH_LIST paths)
+ set(ENV{${dl_paths_variable_name}} "${paths}")
+ endif()
- # Run test executable to check whether reporter is available
- # note that the use of --list-reporters is not the important part,
- # we only want to check whether the execution succeeds with ${reporter_arg}
execute_process(
- COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} ${reporter_arg} --list-reporters
- OUTPUT_VARIABLE reporter_check_output
- RESULT_VARIABLE reporter_check_result
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
+ COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" ${spec} --list-tests --verbosity quiet
+ OUTPUT_VARIABLE output
+ RESULT_VARIABLE result
+ WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
)
- if(${reporter_check_result} EQUAL 255)
- message(FATAL_ERROR
- "\"${reporter}\" is not a valid reporter!\n"
- )
- elseif(NOT ${reporter_check_result} EQUAL 0)
+ if(NOT ${result} EQUAL 0)
message(FATAL_ERROR
- "Error running test executable '${TEST_EXECUTABLE}':\n"
- " Result: ${reporter_check_result}\n"
- " Output: ${reporter_check_output}\n"
+ "Error running test executable '${_TEST_EXECUTABLE}':\n"
+ " Result: ${result}\n"
+ " Output: ${output}\n"
)
endif()
-endif()
-# Prepare output dir
-if(output_dir AND NOT IS_ABSOLUTE ${output_dir})
- set(output_dir "${TEST_WORKING_DIR}/${output_dir}")
- if(NOT EXISTS ${output_dir})
- file(MAKE_DIRECTORY ${output_dir})
+ string(REPLACE "\n" ";" output "${output}")
+
+ # Prepare reporter
+ if(reporter)
+ set(reporter_arg "--reporter ${reporter}")
+
+ # Run test executable to check whether reporter is available
+ # note that the use of --list-reporters is not the important part,
+ # we only want to check whether the execution succeeds with ${reporter_arg}
+ execute_process(
+ COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} ${reporter_arg} --list-reporters
+ OUTPUT_VARIABLE reporter_check_output
+ RESULT_VARIABLE reporter_check_result
+ WORKING_DIRECTORY "${TEST_WORKING_DIR}"
+ )
+ if(${reporter_check_result} EQUAL 255)
+ message(FATAL_ERROR
+ "\"${reporter}\" is not a valid reporter!\n"
+ )
+ elseif(NOT ${reporter_check_result} EQUAL 0)
+ message(FATAL_ERROR
+ "Error running test executable '${TEST_EXECUTABLE}':\n"
+ " Result: ${reporter_check_result}\n"
+ " Output: ${reporter_check_output}\n"
+ )
+ endif()
endif()
-endif()
-if(dl_paths)
- foreach(path ${dl_paths})
- cmake_path(NATIVE_PATH path native_path)
- list(APPEND environment_modifications "${dl_paths_variable_name}=path_list_prepend:${native_path}")
- endforeach()
-endif()
+ # Prepare output dir
+ if(output_dir AND NOT IS_ABSOLUTE ${output_dir})
+ set(output_dir "${_TEST_WORKING_DIR}/${output_dir}")
+ if(NOT EXISTS ${output_dir})
+ file(MAKE_DIRECTORY ${output_dir})
+ endif()
+ endif()
-# Parse output
-foreach(line ${output})
- set(test ${line})
- # Escape characters in test case names that would be parsed by Catch2
- set(test_name ${test})
- foreach(char , [ ])
- string(REPLACE ${char} "\\${char}" test_name ${test_name})
- endforeach(char)
- # ...add output dir
- if(output_dir)
- string(REGEX REPLACE "[^A-Za-z0-9_]" "_" test_name_clean ${test_name})
- set(output_dir_arg "--out ${output_dir}/${output_prefix}${test_name_clean}${output_suffix}")
+ if(dl_paths)
+ foreach(path ${dl_paths})
+ cmake_path(NATIVE_PATH path native_path)
+ list(APPEND environment_modifications "${dl_paths_variable_name}=path_list_prepend:${native_path}")
+ endforeach()
endif()
-
- # ...and add to script
- add_command(add_test
- "${prefix}${test}${suffix}"
- ${TEST_EXECUTOR}
- "${TEST_EXECUTABLE}"
- "${test_name}"
- ${extra_args}
- "${reporter_arg}"
- "${output_dir_arg}"
- )
- add_command(set_tests_properties
- "${prefix}${test}${suffix}"
- PROPERTIES
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
- ${properties}
- )
- if(environment_modifications)
- add_command(set_tests_properties
- "${prefix}${test}${suffix}"
- PROPERTIES
- ENVIRONMENT_MODIFICATION "${environment_modifications}")
- endif()
+ # Parse output
+ foreach(line ${output})
+ set(test ${line})
+ # Escape characters in test case names that would be parsed by Catch2
+ set(test_name ${test})
+ foreach(char , [ ])
+ string(REPLACE ${char} "\\${char}" test_name ${test_name})
+ endforeach(char)
+ # ...add output dir
+ if(output_dir)
+ string(REGEX REPLACE "[^A-Za-z0-9_]" "_" test_name_clean ${test_name})
+ set(output_dir_arg "--out ${output_dir}/${output_prefix}${test_name_clean}${output_suffix}")
+ endif()
- list(APPEND tests "${prefix}${test}${suffix}")
-endforeach()
+ # ...and add to script
+ add_command(add_test
+ "${prefix}${test}${suffix}"
+ ${_TEST_EXECUTOR}
+ "${_TEST_EXECUTABLE}"
+ "${test_name}"
+ ${extra_args}
+ "${reporter_arg}"
+ "${output_dir_arg}"
+ )
+ add_command(set_tests_properties
+ "${prefix}${test}${suffix}"
+ PROPERTIES
+ WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
+ ${properties}
+ )
+
+ if(environment_modifications)
+ add_command(set_tests_properties
+ "${prefix}${test}${suffix}"
+ PROPERTIES
+ ENVIRONMENT_MODIFICATION "${environment_modifications}")
+ endif()
+
+ list(APPEND tests "${prefix}${test}${suffix}")
+ endforeach()
-# Create a list of all discovered tests, which users may use to e.g. set
-# properties on the tests
-add_command(set ${TEST_LIST} ${tests})
+ # Create a list of all discovered tests, which users may use to e.g. set
+ # properties on the tests
+ add_command(set ${_TEST_LIST} ${tests})
-# Write CTest script
-file(WRITE "${CTEST_FILE}" "${script}")
+ # Write CTest script
+ file(WRITE "${_CTEST_FILE}" "${script}")
+endfunction()
+
+if(CMAKE_SCRIPT_MODE_FILE)
+ catch_discover_tests_impl(
+ TEST_EXECUTABLE ${TEST_EXECUTABLE}
+ TEST_EXECUTOR ${TEST_EXECUTOR}
+ TEST_WORKING_DIR ${TEST_WORKING_DIR}
+ TEST_SPEC ${TEST_SPEC}
+ TEST_EXTRA_ARGS ${TEST_EXTRA_ARGS}
+ TEST_PROPERTIES ${TEST_PROPERTIES}
+ TEST_PREFIX ${TEST_PREFIX}
+ TEST_SUFFIX ${TEST_SUFFIX}
+ TEST_LIST ${TEST_LIST}
+ TEST_REPORTER ${TEST_REPORTER}
+ TEST_OUTPUT_DIR ${TEST_OUTPUT_DIR}
+ TEST_OUTPUT_PREFIX ${TEST_OUTPUT_PREFIX}
+ TEST_OUTPUT_SUFFIX ${TEST_OUTPUT_SUFFIX}
+ TEST_DL_PATHS ${TEST_DL_PATHS}
+ CTEST_FILE ${CTEST_FILE}
+ )
+endif()