| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| if (CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.8) |
| message(FATAL_ERROR "ParseAndAddCatchTests requires CMake 2.8.8 or newer") |
| endif() |
|
|
| option(PARSE_CATCH_TESTS_VERBOSE "Print Catch to CTest parser debug messages" OFF) |
| option(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS "Exclude tests with [!hide], [.] or [.foo] tags" OFF) |
| option(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME "Add fixture class name to the test name" ON) |
| option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test name" ON) |
| option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF) |
|
|
| function(ParseAndAddCatchTests_PrintDebugMessage) |
| if(PARSE_CATCH_TESTS_VERBOSE) |
| message(STATUS "ParseAndAddCatchTests: ${ARGV}") |
| endif() |
| endfunction() |
|
|
| |
| |
| |
| |
| |
| function(ParseAndAddCatchTests_RemoveComments CppCode) |
| string(ASCII 2 CMakeBeginBlockComment) |
| string(ASCII 3 CMakeEndBlockComment) |
| string(REGEX REPLACE "/\\*" "${CMakeBeginBlockComment}" ${CppCode} "${${CppCode}}") |
| string(REGEX REPLACE "\\*/" "${CMakeEndBlockComment}" ${CppCode} "${${CppCode}}") |
| string(REGEX REPLACE "${CMakeBeginBlockComment}[^${CMakeEndBlockComment}]*${CMakeEndBlockComment}" "" ${CppCode} "${${CppCode}}") |
| string(REGEX REPLACE "\n[ \t]*//+[^\n]+" "\n" ${CppCode} "${${CppCode}}") |
|
|
| set(${CppCode} "${${CppCode}}" PARENT_SCOPE) |
| endfunction() |
|
|
| |
| function(ParseAndAddCatchTests_ParseFile SourceFile TestTarget) |
| |
| if(SourceFile MATCHES "\\\$<TARGET_OBJECTS:.+>") |
| ParseAndAddCatchTests_PrintDebugMessage("Detected OBJECT library: ${SourceFile} this will not be scanned for tests.") |
| return() |
| endif() |
| |
| get_filename_component(SourceFile ${SourceFile} ABSOLUTE) |
| if(NOT EXISTS ${SourceFile}) |
| message(WARNING "Cannot find source file: ${SourceFile}") |
| return() |
| endif() |
| ParseAndAddCatchTests_PrintDebugMessage("parsing ${SourceFile}") |
| file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME) |
|
|
| |
| ParseAndAddCatchTests_RemoveComments(Contents) |
|
|
| |
| |
| string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([ \t\n]*\"[^\"]*\"[ \t\n]*(,[ \t\n]*\"[^\"]*\")?(,[ \t\n]*[^\,\)]*)*\\)[ \t\n]*\{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}") |
|
|
| if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests) |
| ParseAndAddCatchTests_PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property") |
| set_property( |
| DIRECTORY |
| APPEND |
| PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile} |
| ) |
| endif() |
|
|
| |
| if(POLICY CMP0110) |
| cmake_policy(GET CMP0110 _cmp0110_value) |
| else() |
| |
| set(_cmp0110_value) |
| endif() |
|
|
| foreach(TestName ${Tests}) |
| |
| string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}") |
|
|
| |
| string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}") |
| string(REGEX MATCH "(CATCH_)?(TEMPLATE_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}") |
| string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}") |
|
|
| |
| string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}") |
|
|
| |
| string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}") |
| string(REPLACE "\";\"" ";" TestStrings "${TestStrings}") |
|
|
| |
| list(LENGTH TestStrings TestStringsLength) |
| if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1) |
| message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}") |
| endif() |
|
|
| |
| list(GET TestStrings 0 Name) |
| if("${TestType}" STREQUAL "SCENARIO") |
| set(Name "Scenario: ${Name}") |
| endif() |
| if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND "${TestType}" MATCHES "(CATCH_)?TEST_CASE_METHOD" AND TestFixture ) |
| set(CTestName "${TestFixture}:${Name}") |
| else() |
| set(CTestName "${Name}") |
| endif() |
| if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME) |
| set(CTestName "${TestTarget}:${CTestName}") |
| endif() |
| |
| set(Labels ${TestTarget}) |
| if(TestStringsLength EQUAL 2) |
| list(GET TestStrings 1 Tags) |
| string(TOLOWER "${Tags}" Tags) |
| |
| if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*") |
| list(REMOVE_ITEM Labels ${TestTarget}) |
| endif() |
| string(REPLACE "]" ";" Tags "${Tags}") |
| string(REPLACE "[" "" Tags "${Tags}") |
| else() |
| |
| unset(Tags) |
| endif() |
|
|
| list(APPEND Labels ${Tags}) |
|
|
| set(HiddenTagFound OFF) |
| foreach(label ${Labels}) |
| string(REGEX MATCH "^!hide|^\\." result ${label}) |
| if(result) |
| set(HiddenTagFound ON) |
| break() |
| endif(result) |
| endforeach(label) |
| if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9") |
| ParseAndAddCatchTests_PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label") |
| else() |
| ParseAndAddCatchTests_PrintDebugMessage("Adding test \"${CTestName}\"") |
| if(Labels) |
| ParseAndAddCatchTests_PrintDebugMessage("Setting labels to ${Labels}") |
| endif() |
|
|
| |
| string(REPLACE "," "\\," Name ${Name}) |
|
|
| |
| |
| |
| if(_cmp0110_value STREQUAL "NEW" OR ${CMAKE_VERSION} VERSION_EQUAL "3.18") |
| ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to NEW, no need for add_test(\"\") workaround") |
| else() |
| ParseAndAddCatchTests_PrintDebugMessage("CMP0110 set to OLD adding \"\" for add_test() workaround") |
| set(CTestName "\"${CTestName}\"") |
| endif() |
|
|
| |
| if("${TestTypeAndFixture}" MATCHES ".*TEMPLATE_.*") |
| set(Name "${Name} - *") |
| endif() |
|
|
| |
| add_test(NAME "${CTestName}" COMMAND ${OptionalCatchTestLauncher} $<TARGET_FILE:${TestTarget}> ${Name} ${AdditionalCatchParameters}) |
| |
| if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8") |
| ParseAndAddCatchTests_PrintDebugMessage("Setting DISABLED test property") |
| set_tests_properties("${CTestName}" PROPERTIES DISABLED ON) |
| else() |
| set_tests_properties("${CTestName}" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran" |
| LABELS "${Labels}") |
| endif() |
| set_property( |
| TARGET ${TestTarget} |
| APPEND |
| PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") |
| set_property( |
| SOURCE ${SourceFile} |
| APPEND |
| PROPERTY ParseAndAddCatchTests_TESTS "${CTestName}") |
| endif() |
|
|
|
|
| endforeach() |
| endfunction() |
|
|
| |
| function(ParseAndAddCatchTests TestTarget) |
| message(DEPRECATION "ParseAndAddCatchTest: function deprecated because of possibility of missed test cases. Consider using 'catch_discover_tests' from 'Catch.cmake'") |
| ParseAndAddCatchTests_PrintDebugMessage("Started parsing ${TestTarget}") |
| get_target_property(SourceFiles ${TestTarget} SOURCES) |
| ParseAndAddCatchTests_PrintDebugMessage("Found the following sources: ${SourceFiles}") |
| foreach(SourceFile ${SourceFiles}) |
| ParseAndAddCatchTests_ParseFile(${SourceFile} ${TestTarget}) |
| endforeach() |
| ParseAndAddCatchTests_PrintDebugMessage("Finished parsing ${TestTarget}") |
| endfunction() |
|
|