aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/ECMAddTests.cmake62
-rw-r--r--tests/ECMAddTests/multi_tests/CMakeLists.txt13
-rw-r--r--tests/test_helpers.cmake28
3 files changed, 86 insertions, 17 deletions
diff --git a/modules/ECMAddTests.cmake b/modules/ECMAddTests.cmake
index cee6da4b..e9e2fc53 100644
--- a/modules/ECMAddTests.cmake
+++ b/modules/ECMAddTests.cmake
@@ -8,7 +8,9 @@
#
# ecm_add_tests(<sources> LINK_LIBRARIES <library> [<library> [...]]
# [NAME_PREFIX <prefix>]
-# [GUI])
+# [GUI]
+# [TARGET_NAMES_VAR <target_names_var>]
+# [TEST_NAMES_VAR <test_names_var>])
#
# A convenience function for adding multiple tests, each consisting of a
# single source file. For each file in <sources>, an executable target will be
@@ -27,6 +29,11 @@
# the executable entry point on Windows (although some frameworks, such as Qt,
# abstract this difference away).
#
+# The TARGET_NAMES_VAR and TEST_NAMES_VAR arguments, if given, should specify a
+# variable name to receive the list of generated target and test names,
+# respectively. This makes it convenient to apply properties to them as a
+# whole, for example, using set_target_properties() or set_tests_properties().
+#
# The generated target executables will have the effects of ecm_mark_as_test()
# (from the :module:`ECMMarkAsTest` module) applied to it.
#
@@ -47,6 +54,7 @@
#=============================================================================
# Copyright 2013 Alexander Richardson <arichardson.kde@gmail.com>
+# Copyright 2015 Alex Merry <alex.merry@kde.org>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file COPYING-CMAKE-SCRIPTS for details.
@@ -64,13 +72,15 @@ include(ECMMarkNonGuiExecutable)
function(ecm_add_test)
set(options GUI)
- set(oneValueArgs TEST_NAME NAME_PREFIX)
+ # TARGET_NAME_VAR and TEST_NAME_VAR are undocumented args used by
+ # ecm_add_tests
+ set(oneValueArgs TEST_NAME NAME_PREFIX TARGET_NAME_VAR TEST_NAME_VAR)
set(multiValueArgs LINK_LIBRARIES)
- cmake_parse_arguments(ECM_ADD_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
- set(_sources ${ECM_ADD_TEST_UNPARSED_ARGUMENTS})
+ cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+ set(_sources ${ARG_UNPARSED_ARGUMENTS})
list(LENGTH _sources _sourceCount)
- if(ECM_ADD_TEST_TEST_NAME)
- set(_targetname ${ECM_ADD_TEST_TEST_NAME})
+ if(ARG_TEST_NAME)
+ set(_targetname ${ARG_TEST_NAME})
elseif(${_sourceCount} EQUAL "1")
#use the source file name without extension as the testname
get_filename_component(_targetname ${_sources} NAME_WE)
@@ -79,35 +89,53 @@ function(ecm_add_test)
message(FATAL_ERROR "ecm_add_test() called with multiple source files but without setting \"TEST_NAME\"")
endif()
- set(_testname "${ECM_ADD_TEST_NAME_PREFIX}${_targetname}")
+ set(_testname ${ARG_NAME_PREFIX}${_targetname})
set(gui_args)
- if(ECM_ADD_TEST_GUI)
+ if(ARG_GUI)
set(gui_args WIN32 MACOSX_BUNDLE)
endif()
add_executable(${_targetname} ${gui_args} ${_sources})
- if(NOT ECM_ADD_TEST_GUI)
+ if(NOT ARG_GUI)
ecm_mark_nongui_executable(${_targetname})
endif()
add_test(NAME ${_testname} COMMAND ${_targetname})
- target_link_libraries(${_targetname} ${ECM_ADD_TEST_LINK_LIBRARIES})
+ target_link_libraries(${_targetname} ${ARG_LINK_LIBRARIES})
ecm_mark_as_test(${_targetname})
+ if (ARG_TARGET_NAME_VAR)
+ set(${ARG_TARGET_NAME_VAR} "${_targetname}" PARENT_SCOPE)
+ endif()
+ if (ARG_TEST_NAME_VAR)
+ set(${ARG_TEST_NAME_VAR} "${_testname}" PARENT_SCOPE)
+ endif()
endfunction()
function(ecm_add_tests)
set(options GUI)
- set(oneValueArgs NAME_PREFIX)
+ set(oneValueArgs NAME_PREFIX TARGET_NAMES_VAR TEST_NAMES_VAR)
set(multiValueArgs LINK_LIBRARIES)
- cmake_parse_arguments(ECM_ADD_TESTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
- if(ECM_ADD_TESTS_GUI)
+ cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+ if(ARG_GUI)
set(_exe_type GUI)
else()
set(_exe_type "")
endif()
- foreach(_test_source ${ECM_ADD_TESTS_UNPARSED_ARGUMENTS})
+ set(test_names)
+ set(target_names)
+ foreach(_test_source ${ARG_UNPARSED_ARGUMENTS})
ecm_add_test(${_test_source}
- NAME_PREFIX ${ECM_ADD_TESTS_NAME_PREFIX}
- LINK_LIBRARIES ${ECM_ADD_TESTS_LINK_LIBRARIES}
- ${_exe_type}
+ NAME_PREFIX ${ARG_NAME_PREFIX}
+ LINK_LIBRARIES ${ARG_LINK_LIBRARIES}
+ TARGET_NAME_VAR target_name
+ TEST_NAME_VAR test_name
+ ${_exe_type}
)
+ list(APPEND _test_names "${test_name}")
+ list(APPEND _target_names "${target_name}")
endforeach()
+ if (ARG_TARGET_NAMES_VAR)
+ set(${ARG_TARGET_NAMES_VAR} "${_target_names}" PARENT_SCOPE)
+ endif()
+ if (ARG_TEST_NAMES_VAR)
+ set(${ARG_TEST_NAMES_VAR} "${_test_names}" PARENT_SCOPE)
+ endif()
endfunction()
diff --git a/tests/ECMAddTests/multi_tests/CMakeLists.txt b/tests/ECMAddTests/multi_tests/CMakeLists.txt
index ca434773..0133c7d6 100644
--- a/tests/ECMAddTests/multi_tests/CMakeLists.txt
+++ b/tests/ECMAddTests/multi_tests/CMakeLists.txt
@@ -10,6 +10,7 @@ target_include_directories(testhelper PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
enable_testing()
include(ECMAddTests)
+include(../../test_helpers.cmake)
# clean up to avoid false-positives from check_files.cmake
file(REMOVE
@@ -24,12 +25,18 @@ file(REMOVE
"${CMAKE_CURRENT_BINARY_DIR}/test9.txt"
)
+set(exp_target_names "test1;test2;test3")
+set(exp_test_names "test1;test2;test3")
ecm_add_tests(
test1.cpp
test2.cpp
test3.cpp
LINK_LIBRARIES testhelper
+ TARGET_NAMES_VAR target_names
+ TEST_NAMES_VAR test_names
)
+assert_vars_setequal(target_names exp_target_names)
+assert_vars_setequal(test_names exp_test_names)
# check targets exist
get_property(_dummy TARGET test1 PROPERTY TYPE)
get_property(_dummy TARGET test2 PROPERTY TYPE)
@@ -112,13 +119,19 @@ if (NOT _is_bundle)
endif()
+set(exp_target_names "test8;test9")
+set(exp_test_names "p_test8;p_test9")
ecm_add_tests(
test8.cpp
test9.cpp
LINK_LIBRARIES testhelper
NAME_PREFIX p_
GUI
+ TARGET_NAMES_VAR target_names
+ TEST_NAMES_VAR test_names
)
+assert_vars_setequal(target_names exp_target_names)
+assert_vars_setequal(test_names exp_test_names)
get_property(_dummy TARGET test8 PROPERTY TYPE)
get_property(_dummy TARGET test9 PROPERTY TYPE)
get_property(_dummy TEST p_test8 PROPERTY TIMEOUT)
diff --git a/tests/test_helpers.cmake b/tests/test_helpers.cmake
index 73be343e..d9314d25 100644
--- a/tests/test_helpers.cmake
+++ b/tests/test_helpers.cmake
@@ -62,3 +62,31 @@ macro(assert_var_absolute_path varname)
endif()
endmacro()
+function(assert_vars_setequal varname exp_varname)
+ if(ARGC LESS 3 OR NOT "${ARGV2}" STREQUAL "ALLOW_UNDEFINED")
+ assert_var_defined(${varname})
+ endif()
+ # need real variables
+ set(list1 "${${varname}}")
+ set(list2 "${${exp_varname}}")
+ list(LENGTH list1 list1_len)
+ list(LENGTH list2 list2_len)
+ set(same_els FALSE)
+ if(list1_len EQUAL list2_len)
+ set(same_els TRUE)
+ foreach(item ${list1})
+ list(FIND list2 "${item}" pos)
+ if(pos EQUAL "-1")
+ set(same_els FALSE)
+ break()
+ else()
+ # deal nicely with duplicates
+ list(REMOVE_AT list2 "${pos}")
+ endif()
+ endforeach()
+ endif()
+ if(NOT same_els)
+ message(SEND_ERROR "${varname} is '${${varname}}', expecting '${${exp_varname}}'.")
+ endif()
+endfunction()
+