-
Notifications
You must be signed in to change notification settings - Fork 794
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
de589e1
commit 9bb4ad7
Showing
6 changed files
with
407 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,258 @@ | ||
# - Add tests using boost::test | ||
# | ||
# Add this line to your test files in place of including a basic boost test header: | ||
# #include <BoostTestTargetConfig.h> | ||
# | ||
# If you cannot do that and must use the included form for a given test, | ||
# include the line | ||
# // OVERRIDE_BOOST_TEST_INCLUDED_WARNING | ||
# in the same file with the boost test include. | ||
# | ||
# include(BoostTestTargets) | ||
# add_boost_test(<testdriver_name> SOURCES <source1> [<more sources...>] | ||
# [FAIL_REGULAR_EXPRESSION <additional fail regex>] | ||
# [LAUNCHER <generic launcher script>] | ||
# [LIBRARIES <library> [<library>...]] | ||
# [RESOURCES <resource> [<resource>...]] | ||
# [TESTS <testcasename> [<testcasename>...]]) | ||
# | ||
# If for some reason you need access to the executable target created, | ||
# it can be found in ${${testdriver_name}_TARGET_NAME} as specified when | ||
# you called add_boost_test | ||
# | ||
# Requires CMake 2.6 or newer (uses the 'function' command) | ||
# | ||
# Requires: | ||
# GetForceIncludeDefinitions | ||
# CopyResourcesToBuildTree | ||
# | ||
# Original Author: | ||
# 2009-2010 Ryan Pavlik <[email protected]> <[email protected]> | ||
# http://academic.cleardefinition.com | ||
# Iowa State University HCI Graduate Program/VRAC | ||
# | ||
# Copyright Iowa State University 2009-2010. | ||
# Distributed under the Boost Software License, Version 1.0. | ||
# (See accompanying file LICENSE_1_0.txt or copy at | ||
# http://www.boost.org/LICENSE_1_0.txt) | ||
|
||
if(__add_boost_test) | ||
return() | ||
endif() | ||
set(__add_boost_test YES) | ||
|
||
set(BOOST_TEST_TARGET_PREFIX "boosttest") | ||
|
||
if(NOT Boost_FOUND) | ||
find_package(Boost 1.34.0 QUIET) | ||
endif() | ||
if("${Boost_VERSION}0" LESS "1034000") | ||
set(_shared_msg | ||
"NOTE: boost::test-based targets and tests cannot " | ||
"be added: boost >= 1.34.0 required but not found. " | ||
"(found: '${Boost_VERSION}'; want >=103400) ") | ||
if(BUILD_TESTING) | ||
message(FATAL_ERROR | ||
${_shared_msg} | ||
"You may disable BUILD_TESTING to continue without the " | ||
"tests.") | ||
else() | ||
message(STATUS | ||
${_shared_msg} | ||
"BUILD_TESTING disabled, so continuing anyway.") | ||
endif() | ||
endif() | ||
|
||
include(GetForceIncludeDefinitions.cmake) | ||
include(CopyResourcesToBuildTree.cmake) | ||
|
||
if(Boost_FOUND AND NOT "${Boost_VERSION}0" LESS "1034000") | ||
set(_boosttesttargets_libs) | ||
set(_boostConfig "BoostTestTargetsIncluded.h") | ||
if(NOT Boost_UNIT_TEST_FRAMEWORK_LIBRARY) | ||
find_package(Boost 1.34.0 QUIET COMPONENTS unit_test_framework) | ||
endif() | ||
if(Boost_UNIT_TEST_FRAMEWORK_LIBRARY) | ||
set(_boosttesttargets_libs "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}") | ||
if(Boost_USE_STATIC_LIBS) | ||
set(_boostConfig "BoostTestTargetsStatic.h") | ||
else() | ||
if(NOT APPLE) | ||
set(_boostConfig "BoostTestTargetsDynamic.h") | ||
endif() | ||
endif() | ||
endif() | ||
get_filename_component(_moddir ${CMAKE_CURRENT_LIST_FILE} PATH) | ||
configure_file("${_moddir}/${_boostConfig}" | ||
"${CMAKE_CURRENT_BINARY_DIR}/BoostTestTargetConfig.h" | ||
COPYONLY) | ||
include_directories("${CMAKE_CURRENT_BINARY_DIR}") | ||
endif() | ||
|
||
function(add_boost_test _name) | ||
if(NOT BUILD_TESTING) | ||
return() | ||
endif() | ||
|
||
# parse arguments | ||
set(_nowhere) | ||
set(_curdest _nowhere) | ||
set(_val_args | ||
SOURCES | ||
FAIL_REGULAR_EXPRESSION | ||
LAUNCHER | ||
LIBRARIES | ||
RESOURCES | ||
TESTS) | ||
set(_bool_args | ||
USE_COMPILED_LIBRARY) | ||
foreach(_arg ${_val_args} ${_bool_args}) | ||
set(${_arg}) | ||
endforeach() | ||
foreach(_element ${ARGN}) | ||
list(FIND _val_args "${_element}" _val_arg_find) | ||
list(FIND _bool_args "${_element}" _bool_arg_find) | ||
if("${_val_arg_find}" GREATER "-1") | ||
set(_curdest "${_element}") | ||
elseif("${_bool_arg_find}" GREATER "-1") | ||
set("${_element}" ON) | ||
set(_curdest _nowhere) | ||
else() | ||
list(APPEND ${_curdest} "${_element}") | ||
endif() | ||
endforeach() | ||
|
||
if(_nowhere) | ||
message(FATAL_ERROR "Syntax error in use of add_boost_test!") | ||
endif() | ||
|
||
if(NOT SOURCES) | ||
message(FATAL_ERROR | ||
"Syntax error in use of add_boost_test: at least one source file required!") | ||
endif() | ||
|
||
if(Boost_FOUND AND NOT "${Boost_VERSION}0" LESS "1034000") | ||
|
||
include_directories(${Boost_INCLUDE_DIRS}) | ||
|
||
set(includeType) | ||
foreach(src ${SOURCES}) | ||
file(READ ${src} thefile) | ||
if("${thefile}" MATCHES ".*BoostTestTargetConfig.h.*") | ||
set(includeType CONFIGURED) | ||
set(includeFileLoc ${src}) | ||
break() | ||
elseif("${thefile}" MATCHES ".*boost/test/included/unit_test.hpp.*") | ||
set(includeType INCLUDED) | ||
set(includeFileLoc ${src}) | ||
set(_boosttesttargets_libs) # clear this out - linking would be a bad idea | ||
if(NOT | ||
"${thefile}" | ||
MATCHES | ||
".*OVERRIDE_BOOST_TEST_INCLUDED_WARNING.*") | ||
message("Please replace the include line in ${src} with this alternate include line instead:") | ||
message(" \#include <BoostTestTargetConfig.h>") | ||
message("Once you've saved your changes, re-run CMake. (See BoostTestTargets.cmake for more info)") | ||
endif() | ||
break() | ||
endif() | ||
endforeach() | ||
|
||
if(NOT _boostTestTargetsNagged${_name} STREQUAL "${includeType}") | ||
if("${includeType}" STREQUAL "CONFIGURED") | ||
message(STATUS | ||
"Test '${_name}' uses the CMake-configurable form of the boost test framework - congrats! (Including File: ${includeFileLoc})") | ||
elseif("${includeType}" STREQUAL "INCLUDED") | ||
message("In test '${_name}': ${includeFileLoc} uses the 'included' form of the boost unit test framework.") | ||
else() | ||
message("In test '${_name}': Didn't detect the CMake-configurable boost test include.") | ||
message("Please replace your existing boost test include in that test with the following:") | ||
message(" \#include <BoostTestTargetConfig.h>") | ||
message("Once you've saved your changes, re-run CMake. (See BoostTestTargets.cmake for more info)") | ||
endif() | ||
endif() | ||
set(_boostTestTargetsNagged${_name} | ||
"${includeType}" | ||
CACHE | ||
INTERNAL | ||
"" | ||
FORCE) | ||
|
||
|
||
if(RESOURCES) | ||
list(APPEND SOURCES ${RESOURCES}) | ||
endif() | ||
|
||
# Generate a unique target name, using the relative binary dir | ||
# and provided name. (transform all / into _ and remove all other | ||
# non-alphabet characters) | ||
file(RELATIVE_PATH | ||
targetpath | ||
"${CMAKE_BINARY_DIR}" | ||
"${CMAKE_CURRENT_BINARY_DIR}") | ||
string(REGEX REPLACE "[^A-Za-z/_]" "" targetpath "${targetpath}") | ||
string(REPLACE "/" "_" targetpath "${targetpath}") | ||
|
||
set(_target_name ${_name}) | ||
set(${_name}_TARGET_NAME "${_target_name}" PARENT_SCOPE) | ||
|
||
# Build the test. | ||
add_executable(${_target_name} ${SOURCES}) | ||
|
||
list(APPEND LIBRARIES ${_boosttesttargets_libs}) | ||
|
||
if(LIBRARIES) | ||
target_link_libraries(${_target_name} ${LIBRARIES}) | ||
endif() | ||
|
||
if(RESOURCES) | ||
set_property(TARGET ${_target_name} PROPERTY RESOURCE ${RESOURCES}) | ||
copy_resources_to_build_tree(${_target_name}) | ||
endif() | ||
|
||
if(NOT Boost_TEST_FLAGS) | ||
# set(Boost_TEST_FLAGS --catch_system_error=yes --output_format=XML) | ||
set(Boost_TEST_FLAGS --catch_system_error=yes) | ||
endif() | ||
|
||
# TODO: Figure out why only recent boost handles individual test running properly | ||
|
||
if(LAUNCHER) | ||
set(_test_command ${LAUNCHER} "\$<TARGET_FILE:${_target_name}>") | ||
else() | ||
set(_test_command ${_target_name}) | ||
endif() | ||
|
||
if(TESTS AND ( "${Boost_VERSION}" VERSION_GREATER "103799" )) | ||
foreach(_test ${TESTS}) | ||
add_test( | ||
${_name}-${_test} | ||
${_test_command} --run_test=${_test} ${Boost_TEST_FLAGS} | ||
) | ||
if(FAIL_REGULAR_EXPRESSION) | ||
set_tests_properties(${_name}-${_test} | ||
PROPERTIES | ||
FAIL_REGULAR_EXPRESSION | ||
"${FAIL_REGULAR_EXPRESSION}") | ||
endif() | ||
endforeach() | ||
else() | ||
add_test( | ||
${_name}-boost_test | ||
${_test_command} ${Boost_TEST_FLAGS} | ||
) | ||
if(FAIL_REGULAR_EXPRESSION) | ||
set_tests_properties(${_name}-boost_test | ||
PROPERTIES | ||
FAIL_REGULAR_EXPRESSION | ||
"${FAIL_REGULAR_EXPRESSION}") | ||
endif() | ||
endif() | ||
|
||
# CppCheck the test if we can. | ||
if(COMMAND add_cppcheck) | ||
add_cppcheck(${_target_name} STYLE UNUSED_FUNCTIONS) | ||
endif() | ||
|
||
endif() | ||
endfunction() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
// Small header computed by CMake to set up boost test. | ||
// include AFTER #define BOOST_TEST_MODULE whatever | ||
// but before any other boost test includes. | ||
|
||
// Using the Boost UTF dynamic library | ||
|
||
#define BOOST_TEST_DYN_LINK | ||
#include <boost/test/unit_test.hpp> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
// Small header computed by CMake to set up boost test. | ||
// include AFTER #define BOOST_TEST_MODULE whatever | ||
// but before any other boost test includes. | ||
|
||
// Using the Boost UTF included framework | ||
|
||
#include <boost/test/included/unit_test.hpp> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
// Small header computed by CMake to set up boost test. | ||
// include AFTER #define BOOST_TEST_MODULE whatever | ||
// but before any other boost test includes. | ||
|
||
// Using the Boost UTF static library | ||
|
||
#include <boost/test/unit_test.hpp> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
# - Copy the resources your app needs to the build tree. | ||
# | ||
# copy_resources_to_build_tree(<target_name>) | ||
# | ||
# Requires CMake 2.6 or newer (uses the 'function' command) | ||
# | ||
# Original Author: | ||
# 2009-2010 Ryan Pavlik <[email protected]> <[email protected]> | ||
# http://academic.cleardefinition.com | ||
# Iowa State University HCI Graduate Program/VRAC | ||
# | ||
# Copyright Iowa State University 2009-2010. | ||
# Distributed under the Boost Software License, Version 1.0. | ||
# (See accompanying file LICENSE_1_0.txt or copy at | ||
# http://www.boost.org/LICENSE_1_0.txt) | ||
|
||
if(__copy_resources_to_build_tree) | ||
return() | ||
endif() | ||
set(__copy_resources_to_build_tree YES) | ||
|
||
function(copy_resources_to_build_tree _target) | ||
get_target_property(_resources ${_target} RESOURCE) | ||
if(NOT _resources) | ||
# Bail if no resources | ||
message(STATUS | ||
"Told to copy resources for target ${_target}, but " | ||
"no resources are set!") | ||
return() | ||
endif() | ||
|
||
get_target_property(_path ${_target} LOCATION) | ||
get_filename_component(_path "${_path}" PATH) | ||
|
||
if(NOT MSVC AND NOT "${CMAKE_GENERATOR}" MATCHES "Makefiles") | ||
foreach(_config ${CMAKE_CONFIGURATION_TYPES}) | ||
get_target_property(_path${_config} ${_target} LOCATION_${_config}) | ||
get_filename_component(_path${_config} "${_path${_config}}" PATH) | ||
add_custom_command(TARGET ${_target} | ||
POST_BUILD | ||
COMMAND | ||
${CMAKE_COMMAND} | ||
ARGS -E make_directory "${_path${_config}}/" | ||
COMMENT "Creating directory ${_path${_config}}/") | ||
endforeach() | ||
endif() | ||
|
||
foreach(_res ${_resources}) | ||
if(NOT IS_ABSOLUTE "${_res}") | ||
get_filename_component(_res "${_res}" ABSOLUTE) | ||
endif() | ||
get_filename_component(_name "${_res}" NAME) | ||
|
||
if(MSVC) | ||
# Working dir is solution file dir, not exe file dir. | ||
add_custom_command(TARGET ${_target} | ||
POST_BUILD | ||
COMMAND | ||
${CMAKE_COMMAND} | ||
ARGS -E copy "${_res}" "${CMAKE_BINARY_DIR}/" | ||
COMMENT "Copying ${_name} to ${CMAKE_BINARY_DIR}/ for MSVC") | ||
else() | ||
if("${CMAKE_GENERATOR}" MATCHES "Makefiles") | ||
add_custom_command(TARGET ${_target} | ||
POST_BUILD | ||
COMMAND | ||
${CMAKE_COMMAND} | ||
ARGS -E copy "${_res}" "${_path}/" | ||
COMMENT "Copying ${_name} to ${_path}/") | ||
else() | ||
foreach(_config ${CMAKE_CONFIGURATION_TYPES}) | ||
add_custom_command(TARGET ${_target} | ||
POST_BUILD | ||
COMMAND | ||
${CMAKE_COMMAND} | ||
ARGS -E copy "${_res}" "${_path${_config}}" | ||
COMMENT "Copying ${_name} to ${_path${_config}}") | ||
endforeach() | ||
|
||
endif() | ||
endif() | ||
endforeach() | ||
endfunction() |
Oops, something went wrong.