mirror of
https://github.com/Bismuth-Forge/bismuth.git
synced 2024-09-11 00:15:37 +03:00
This adds Plasma API wrapper prototype with the example doctest unit test. Later the wrapper will be extended until all the features we need are supported.
121 lines
3.5 KiB
CMake
121 lines
3.5 KiB
CMake
# SPDX-FileCopyrightText: none
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
set(prefix "${TEST_PREFIX}")
|
|
set(suffix "${TEST_SUFFIX}")
|
|
set(spec ${TEST_SPEC})
|
|
set(extra_args ${TEST_EXTRA_ARGS})
|
|
set(properties ${TEST_PROPERTIES})
|
|
set(add_labels ${TEST_ADD_LABELS})
|
|
set(junit_output_dir "${TEST_JUNIT_OUTPUT_DIR}")
|
|
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}]==]") # 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()
|
|
|
|
if("${spec}" MATCHES .)
|
|
set(spec "--test-case=${spec}")
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-cases
|
|
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"
|
|
)
|
|
endif()
|
|
|
|
string(REPLACE "\n" ";" output "${output}")
|
|
|
|
# Parse output
|
|
foreach(line ${output})
|
|
if("${line}" STREQUAL "===============================================================================" OR "${line}" MATCHES [==[^\[doctest\] ]==])
|
|
continue()
|
|
endif()
|
|
set(test ${line})
|
|
set(labels "")
|
|
if(${add_labels})
|
|
# get test suite that test belongs to
|
|
execute_process(
|
|
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" --test-case=${test} --list-test-suites
|
|
OUTPUT_VARIABLE labeloutput
|
|
RESULT_VARIABLE labelresult
|
|
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
|
|
)
|
|
if(NOT ${labelresult} EQUAL 0)
|
|
message(FATAL_ERROR
|
|
"Error running test executable '${TEST_EXECUTABLE}':\n"
|
|
" Result: ${labelresult}\n"
|
|
" Output: ${labeloutput}\n"
|
|
)
|
|
endif()
|
|
|
|
string(REPLACE "\n" ";" labeloutput "${labeloutput}")
|
|
foreach(labelline ${labeloutput})
|
|
if("${labelline}" STREQUAL "===============================================================================" OR "${labelline}" MATCHES [==[^\[doctest\] ]==])
|
|
continue()
|
|
endif()
|
|
list(APPEND labels ${labelline})
|
|
endforeach()
|
|
endif()
|
|
|
|
if(NOT "${junit_output_dir}" STREQUAL "")
|
|
# turn testname into a valid filename by replacing all special characters with "-"
|
|
string(REGEX REPLACE "[/\\:\"|<>]" "-" test_filename "${test}")
|
|
set(TEST_JUNIT_OUTPUT_PARAM "--reporters=junit" "--out=${junit_output_dir}/${prefix}${test_filename}${suffix}.xml")
|
|
else()
|
|
unset(TEST_JUNIT_OUTPUT_PARAM)
|
|
endif()
|
|
# use escape commas to handle properly test cases with commas inside the name
|
|
string(REPLACE "," "\\," test_name ${test})
|
|
# ...and add to script
|
|
add_command(add_test
|
|
"${prefix}${test}${suffix}"
|
|
${TEST_EXECUTOR}
|
|
"${TEST_EXECUTABLE}"
|
|
"--test-case=${test_name}"
|
|
"${TEST_JUNIT_OUTPUT_PARAM}"
|
|
${extra_args}
|
|
)
|
|
add_command(set_tests_properties
|
|
"${prefix}${test}${suffix}"
|
|
PROPERTIES
|
|
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
|
|
LABELS ${labels}
|
|
${properties}
|
|
)
|
|
unset(labels)
|
|
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}")
|