| # This function calls the ${scriptname} file to execute one test case: | |
| # | |
| function(execute_one_script_test scriptname testname expected_result) | |
| message("execute_one_script_test") | |
| message("testname=[${testname}]") | |
| execute_process( | |
| COMMAND ${CMAKE_COMMAND} | |
| -D "dir:STRING=${dir}" | |
| -D "testname:STRING=${testname}" | |
| -P "${scriptname}" | |
| OUTPUT_VARIABLE out | |
| ERROR_VARIABLE err | |
| RESULT_VARIABLE result | |
| OUTPUT_STRIP_TRAILING_WHITESPACE | |
| ERROR_STRIP_TRAILING_WHITESPACE | |
| ) | |
| message("out=[${out}]") | |
| message("err=[${err}]") | |
| if(expected_result STREQUAL "fail") | |
| # case expected to fail, result should be non-0... | |
| # error if it's 0 | |
| if("${result}" STREQUAL "0") | |
| message(SEND_ERROR "script failed: testname='${testname}' [${result}] actually passed, but expected to fail...") | |
| endif() | |
| else() | |
| # case expected to pass, result should be 0... | |
| # error if it's non-0 | |
| if(NOT "${result}" STREQUAL "0") | |
| message(SEND_ERROR "script failed: testname='${testname}' [${result}] actually failed, but expected to pass...") | |
| endif() | |
| endif() | |
| message("") | |
| endfunction() | |
| # This function reads the script file and calls execute_one_script_test for | |
| # each testname case listed in the script. To add new cases, simply edit the | |
| # script file and add an elseif() clause that matches 'regex' below. | |
| # | |
| function(execute_all_script_tests scriptname result) | |
| file(READ "${scriptname}" script) | |
| string(REPLACE ";" "\\\\;" script "${script}") | |
| string(REPLACE "\n" "E;" script "${script}") | |
| set(count 0) | |
| set(regex "^ *(if|elseif) *\\( *testname +STREQUAL +\\\"*([^\\\"\\)]+)\\\"* *\\) *# *(fail|pass) *E$") | |
| foreach(line ${script}) | |
| if(line MATCHES "${regex}") | |
| set(testname "${CMAKE_MATCH_2}") | |
| set(expected_result "${CMAKE_MATCH_3}") | |
| math(EXPR count "${count} + 1") | |
| execute_one_script_test(${scriptname} ${testname} ${expected_result}) | |
| endif() | |
| endforeach() | |
| set(${result} ${count} PARENT_SCOPE) | |
| endfunction() |