# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
# This is an undocumented internal helper for the FindMatlab
# module ``matlab_add_unit_test`` command.
# Usage: cmake
# -Dtest_timeout=180
# -Doutput_directory=
# -Dadditional_paths=""
# -Dno_unittest_framework=""
# -DMatlab_PROGRAM=matlab_exe_location
# -DMatlab_ADDITIONAL_STARTUP_OPTIONS=""
# -Dtest_name=name_of_the_test
# -Dcustom_Matlab_test_command=""
# -Dcmd_to_run_before_test=""
# -Dunittest_file_to_run
# -Dmaut_BATCH_OPTION="-batch"
# -P FindMatlab_TestsRedirect.cmake
set ( Matlab_UNIT_TESTS_CMD -nosplash -nodesktop -nodisplay ${ Matlab_ADDITIONAL_STARTUP_OPTIONS } )
if ( WIN32 )
set ( Matlab_UNIT_TESTS_CMD ${ Matlab_UNIT_TESTS_CMD } -wait )
endif ( )
if ( NOT test_timeout )
set ( test_timeout 180 )
endif ( )
# If timeout is -1, then do not put a timeout on the execute_process
if ( test_timeout EQUAL -1 )
set ( test_timeout "" )
else ( )
set ( test_timeout TIMEOUT ${ test_timeout } )
endif ( )
if ( NOT cmd_to_run_before_test )
set ( cmd_to_run_before_test )
endif ( )
get_filename_component ( unittest_file_directory "${unittest_file_to_run}" DIRECTORY )
get_filename_component ( unittest_file_to_run_name "${unittest_file_to_run}" NAME_WE )
set ( concat_string ' ${ unittest_file_directory } ' )
foreach ( s IN LISTS additional_paths )
if ( NOT "${s}" STREQUAL "" )
string ( APPEND concat_string ", '${s}'" )
endif ( )
endforeach ( )
if ( custom_Matlab_test_command )
set ( unittest_to_run "${custom_Matlab_test_command}" )
else ( )
set ( unittest_to_run "runtests('${unittest_file_to_run_name}'), exit(max([ans(1,:).Failed]))" )
endif ( )
if ( no_unittest_framework )
set ( unittest_to_run "${unittest_file_to_run_name}" )
endif ( )
set ( command_to_run "try, ${unittest_to_run}, catch err, disp('An exception has been thrown during the execution'), disp(err), disp(err.stack), exit(1), end, exit(0)" )
set ( Matlab_SCRIPT_TO_RUN
" addpath ( ${ concat_string } ) ; $ { c m d _ t o _ r u n _ b e f o r e _ t e s t } ; $ { c o m m a n d _ t o _ r u n } "
)
# if the working directory is not specified then default
# to the output_directory because the log file will go there
# if the working_directory is specified it will override the
# output_directory
if ( NOT working_directory )
set ( working_directory "${output_directory}" )
endif ( )
string ( REPLACE "/" "_" log_file_name "${test_name}.log" )
set ( Matlab_LOG_FILE "${working_directory}/${log_file_name}" )
set ( devnull )
if ( UNIX )
set ( devnull INPUT_FILE /dev/null )
elseif ( WIN32 )
set ( devnull INPUT_FILE NUL )
endif ( )
execute_process (
# Do not use a full path to log file. Depend on the fact that the log file
# is always going to go in the working_directory. This is because matlab
# on unix is a shell script that does not handle spaces in the logfile path.
C O M M A N D " $ { M a t l a b _ P R O G R A M } " $ { M a t l a b _ U N I T _ T E S T S _ C M D } - l o g f i l e " $ { l o g _ f i l e _ n a m e } " " $ { m a u t _ B A T C H _ O P T I O N } " " $ { M a t l a b _ S C R I P T _ T O _ R U N } "
R E S U L T _ V A R I A B L E r e s
$ { t e s t _ t i m e o u t }
O U T P U T _ Q U I E T # we do not want the output twice
W O R K I N G _ D I R E C T O R Y " $ { w o r k i n g _ d i r e c t o r y } "
$ { d e v n u l l }
)
if ( NOT EXISTS ${ Matlab_LOG_FILE } )
message ( FATAL_ERROR "[MATLAB] ERROR: cannot find the log file ${Matlab_LOG_FILE}" )
endif ( )
# print the output in any case.
file ( READ ${ Matlab_LOG_FILE } matlab_log_content )
message ( "Matlab test ${name_of_the_test} output:\n${matlab_log_content}" ) # if we put FATAL_ERROR here, the file is indented.
if ( NOT ( res EQUAL 0 ) )
message ( FATAL_ERROR "[MATLAB] TEST FAILED Matlab returned ${res}" )
endif ( )