123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- # 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(script)
- set(suite)
- set(tests)
- function(add_command NAME)
- set(_args "")
- # use ARGV* instead of ARGN, because ARGN splits arrays into multiple arguments
- math(EXPR _last_arg ${ARGC}-1)
- foreach(_n RANGE 1 ${_last_arg})
- set(_arg "${ARGV${_n}}")
- if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
- set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument
- 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}" ${spec} --list-test-names-only
- OUTPUT_VARIABLE output
- RESULT_VARIABLE result
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
- )
- # Catch --list-test-names-only reports the number of tests, so 0 is... surprising
- if(${result} EQUAL 0)
- message(WARNING
- "Test executable '${TEST_EXECUTABLE}' contains no tests!\n"
- )
- elseif(${result} LESS 0)
- message(FATAL_ERROR
- "Error running test executable '${TEST_EXECUTABLE}':\n"
- " Result: ${result}\n"
- " Output: ${output}\n"
- )
- endif()
- string(REPLACE "\n" ";" output "${output}")
- # Run test executable to get list of available reporters
- execute_process(
- COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-reporters
- OUTPUT_VARIABLE reporters_output
- RESULT_VARIABLE reporters_result
- WORKING_DIRECTORY "${TEST_WORKING_DIR}"
- )
- if(${reporters_result} EQUAL 0)
- message(WARNING
- "Test executable '${TEST_EXECUTABLE}' contains no reporters!\n"
- )
- elseif(${reporters_result} LESS 0)
- message(FATAL_ERROR
- "Error running test executable '${TEST_EXECUTABLE}':\n"
- " Result: ${reporters_result}\n"
- " Output: ${reporters_output}\n"
- )
- endif()
- string(FIND "${reporters_output}" "${reporter}" reporter_is_valid)
- if(reporter AND ${reporter_is_valid} EQUAL -1)
- message(FATAL_ERROR
- "\"${reporter}\" is not a valid reporter!\n"
- )
- endif()
- # Prepare reporter
- if(reporter)
- set(reporter_arg "--reporter ${reporter}")
- 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}")
- 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}
- )
- 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})
- # Write CTest script
- file(WRITE "${CTEST_FILE}" "${script}")
|