mirror of
https://github.com/reactos/CMake.git
synced 2024-12-12 22:05:57 +00:00
bfcda4013a
Add a new gtest_discover_tests function to GoogleTest.cmake, implementing dynamic test discovery (i.e. tests are discovered by actually running the test executable and asking for the list of available tests, which is used to dynamically declare the tests) rather than the source-parsing approach used by gtest_add_tests. Compared to the source-parsing approach, this has the advantage of being robust against users declaring tests in unusual ways, and much better support for advanced features such as parameterized tests. A unit test, modeled after the TEST_INCLUDE_DIR[S] test, is also included. Note that the unit test does not actually require that Google Test is available. The new functionality does not actually depend on Google Test as such; it only requires that the test executable lists tests in the expected format when invoked with --gtest_list_tests, which the unit test can fake readily.
101 lines
3.1 KiB
CMake
101 lines
3.1 KiB
CMake
# 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(extra_args ${TEST_EXTRA_ARGS})
|
|
set(properties ${TEST_PROPERTIES})
|
|
set(script)
|
|
set(suite)
|
|
set(tests)
|
|
|
|
function(add_command NAME)
|
|
set(_args "")
|
|
foreach(_arg ${ARGN})
|
|
if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
|
|
set(_args "${_args} [==[${_arg}]==]")
|
|
else()
|
|
set(_args "${_args} ${_arg}")
|
|
endif()
|
|
endforeach()
|
|
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()
|
|
execute_process(
|
|
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" --gtest_list_tests
|
|
OUTPUT_VARIABLE output
|
|
RESULT_VARIABLE result
|
|
)
|
|
if(NOT ${result} EQUAL 0)
|
|
message(FATAL_ERROR
|
|
"Error running test executable '${TEST_EXECUTABLE}':\n"
|
|
" Result: ${result}\n"
|
|
" Output: ${output}\n"
|
|
)
|
|
endif()
|
|
|
|
string(REPLACE "\n" ";" output "${output}")
|
|
|
|
# Parse output
|
|
foreach(line ${output})
|
|
# Skip header
|
|
if(NOT line MATCHES "gtest_main\\.cc")
|
|
# Do we have a module name or a test name?
|
|
if(NOT line MATCHES "^ ")
|
|
# Module; remove trailing '.' to get just the name...
|
|
string(REGEX REPLACE "\\.( *#.*)?" "" suite "${line}")
|
|
if(line MATCHES "#" AND NOT NO_PRETTY_TYPES)
|
|
string(REGEX REPLACE "/[0-9]\\.+ +#.*= +" "/" pretty_suite "${line}")
|
|
else()
|
|
set(pretty_suite "${suite}")
|
|
endif()
|
|
string(REGEX REPLACE "^DISABLED_" "" pretty_suite "${pretty_suite}")
|
|
else()
|
|
# Test name; strip spaces and comments to get just the name...
|
|
string(REGEX REPLACE " +" "" test "${line}")
|
|
if(test MATCHES "#" AND NOT NO_PRETTY_VALUES)
|
|
string(REGEX REPLACE "/[0-9]+#GetParam..=" "/" pretty_test "${test}")
|
|
else()
|
|
string(REGEX REPLACE "#.*" "" pretty_test "${test}")
|
|
endif()
|
|
string(REGEX REPLACE "^DISABLED_" "" pretty_test "${pretty_test}")
|
|
string(REGEX REPLACE "#.*" "" test "${test}")
|
|
# ...and add to script
|
|
add_command(add_test
|
|
"${prefix}${pretty_suite}.${pretty_test}${suffix}"
|
|
${TEST_EXECUTOR}
|
|
"${TEST_EXECUTABLE}"
|
|
"--gtest_filter=${suite}.${test}"
|
|
"--gtest_also_run_disabled_tests"
|
|
${extra_args}
|
|
)
|
|
if(suite MATCHES "^DISABLED" OR test MATCHES "^DISABLED")
|
|
add_command(set_tests_properties
|
|
"${prefix}${pretty_suite}.${pretty_test}${suffix}"
|
|
PROPERTIES DISABLED TRUE
|
|
)
|
|
endif()
|
|
add_command(set_tests_properties
|
|
"${prefix}${pretty_suite}.${pretty_test}${suffix}"
|
|
PROPERTIES
|
|
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
|
|
${properties}
|
|
)
|
|
list(APPEND tests "${prefix}${pretty_suite}.${pretty_test}${suffix}")
|
|
endif()
|
|
endif()
|
|
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})
|
|
|
|
# Write CTest script
|
|
file(WRITE "${CTEST_FILE}" "${script}")
|