Select Git revision
IA_GrabLeft.uasset
Testing.cmake 10.05 KiB
#------------------------------------------------------------------------------
# Project Phoenix
#
# Copyright (c) 2017-2018 RWTH Aachen University, Germany,
# Virtual Reality & Immersive Visualization Group.
#------------------------------------------------------------------------------
# License
#
# Licensed under the 3-Clause BSD License (the "License");
# you may not use this file except in compliance with the License.
# See the file LICENSE for the full text.
# You may obtain a copy of the License at
#
# https://opensource.org/licenses/BSD-3-Clause
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#------------------------------------------------------------------------------
include(CTest)
enable_testing()
include(WarningLevels)
conan_or_find_package(catch REQUIRED)
conan_or_find_package(trompeloeil REQUIRED)
define_property(TARGET
PROPERTY testing__removes_libraries
BRIEF_DOCS "Libraries to be removed for mocking"
FULL_DOCS "Libraries to be removed for mocking")
define_property(TARGET
PROPERTY testing__adds_libraries
BRIEF_DOCS "Libraries to be added for mocking"
FULL_DOCS "Libraries to be added for mocking")
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY ADDED_TESTS "")
set(IS_BUILD_SERVER
FALSE CACHE BOOL
"Is this the build server? So we, e.g., simulate user input for tests requiring it."
)
function(CREATE_TEST_MAIN)
set(options)
set(oneValueArgs )
set(multiValueArgs SOURCES HEADERS INCLUDE_DIRECTORIES LIBRARIES )
cmake_parse_arguments(CREATE_TEST_MAIN_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
testing__add_library_(
NAME test_main
SOURCES ${CREATE_TEST_MAIN__SOURCES} ${CREATE_TEST_MAIN__HEADERS}
INCLUDE_DIRECTORIES ${CREATE_TEST_MAIN__INCLUDE_DIRECTORIES}
LIBRARIES ${CREATE_TEST_MAIN__LIBRARIES}
)
endfunction()
function(CREATE_MOCK_MAIN)
set(options)
set(oneValueArgs )
set(multiValueArgs SOURCES HEADERS INCLUDE_DIRECTORIES LIBRARIES )
cmake_parse_arguments(CREATE_MOCK_MAIN_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
testing__add_library_(
NAME mock_main
SOURCES ${CREATE_MOCK_MAIN__SOURCES} ${CREATE_MOCK_MAIN__HEADERS}
INCLUDE_DIRECTORIES ${CREATE_MOCK_MAIN__INCLUDE_DIRECTORIES}
LIBRARIES ${CREATE_MOCK_MAIN__LIBRARIES}
)
endfunction()
function(TESTING__ADD_LIBRARY_)
set(options)
set(oneValueArgs NAME)
set(multiValueArgs SOURCES HEADERS INCLUDE_DIRECTORIES LIBRARIES )
cmake_parse_arguments(TESTING__ADD_LIBRARY_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
add_library(${TESTING__ADD_LIBRARY__NAME}
${TESTING__ADD_LIBRARY__SOURCES}
${TESTING__ADD_LIBRARY__HEADERS}
)
target_include_directories(${TESTING__ADD_LIBRARY__NAME}
PUBLIC ${TESTING__ADD_LIBRARY__INCLUDE_DIRECTORIES}
)
target_link_libraries(${TESTING__ADD_LIBRARY__NAME}
${TESTING__ADD_LIBRARY__LIBRARIES}
)
endfunction()
function(ADD_TESTS)
set(options )
set(oneValueArgs NAME)
set(multiValueArgs
SOURCES HEADERS INCLUDE_DIRECTORIES LIBRARIES PATH_TO_ADD)
cmake_parse_arguments(ADD_TESTS_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
foreach(TEST_SOURCE_FILE ${ADD_TESTS__SOURCES})
add_single_test(
NAME ${TEST_NAME}
SOURCE ${TEST_SOURCE_FILE}
INCLUDE_DIRECTORIES ${ADD_TESTS__INCLUDE_DIRECTORIES}
LIBRARIES ${ADD_TESTS__LIBRARIES}
PATH_TO_ADD ${ADD_TESTS__PATH_TO_ADD}
)
endforeach()
endfunction()
macro(ADD_SINGLE_TEST)
set(options )
set(oneValueArgs)
set(multiValueArgs SOURCE INCLUDE_DIRECTORIES LIBRARIES PATH_TO_ADD)
cmake_parse_arguments(ADD_SINGLE_TEST_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
get_filename_component(
TEST_NAME
${ADD_SINGLE_TEST__SOURCE} NAME_WE)
add_executable(${TEST_NAME}
${ADD_SINGLE_TEST__SOURCE}
)
target_include_directories(${TEST_NAME}
PRIVATE ${ADD_SINGLE_TEST__INCLUDE_DIRECTORIES}
)
target_link_libraries(${TEST_NAME}
${ADD_SINGLE_TEST__LIBRARIES}
${CONAN_OR_CMAKE_catch}
test_main mock_main
)
CONFIGURE_TEST_(
NAME ${TEST_NAME}
SOURCE ${ADD_SINGLE_TEST__SOURCE}
PATH_TO_ADD ${ADD_SINGLE_TEST__PATH_TO_ADD}
)
endmacro()
function(CONFIGURE_TEST_)
set(options )
set(oneValueArgs NAME)
set(multiValueArgs SOURCE PATH_TO_ADD)
cmake_parse_arguments(CONFIGURE_TEST_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(WIN32 AND MSVC)
CONFIGURE_MSVC_USERFILE(${CONFIGURE_TEST__NAME}
${CONFIGURE_TEST__PATH_TO_ADD})
endif()
add_test(NAME ${CONFIGURE_TEST__NAME}
COMMAND ${CONFIGURE_TEST__NAME})
set_warning_levels_RWTH(${CONFIGURE_TEST__NAME})
testing__set_timeout_(${CONFIGURE_TEST__NAME})
set_property(TARGET ${CONFIGURE_TEST__NAME}
PROPERTY FOLDER "Tests")
source_group("Source Files"
FILES ${CONFIGURE_TEST__SOURCE})
set_property(GLOBAL APPEND PROPERTY
ADDED_TESTS "${CONFIGURE_TEST__NAME}")
if(IS_BUILD_SERVER)
target_compile_definitions(${CONFIGURE_TEST__NAME} PUBLIC -DIS_BUILD_SERVER)
endif()
endfunction()
function(TESTING__SET_TIMEOUT_ TARGET)
if(NOT ${TARGET} MATCHES "integration")
set_tests_properties(${TARGET} PROPERTIES TIMEOUT 10.0)
else()
set_tests_properties(${TARGET} PROPERTIES TIMEOUT 120.0)
endif()
endfunction()
macro(ADD_MOCK)
set(options )
set(oneValueArgs NAME)
set(multiValueArgs
SOURCES
HEADERS
INCLUDE_DIRECTORIES
INCLUDE_DIRECTORIES_OF
COMPILE_OPTIONS
REMOVES_LIBRARIES
ADDS_LIBRARIES_OF
)
cmake_parse_arguments(ADD_MOCK_
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
string(TOUPPER ${ADD_MOCK__NAME} ADD_MOCK__NAME_UPPER)
string(TOLOWER ${ADD_MOCK__NAME} ADD_MOCK__NAME_LOWER)
add_library(${ADD_MOCK__NAME} SHARED
${ADD_MOCK__SOURCES}
${ADD_MOCK__HEADERS}
)
target_link_libraries(${ADD_MOCK__NAME}
${CONAN_OR_CMAKE_trompeloeil}
mock_main test_main
)
foreach(CURRENT_TARGET ${ADD_MOCK__INCLUDE_DIRECTORIES_OF})
get_target_property(CURRENT_INCLUCE_DIRECTORIES
${CURRENT_TARGET} INTERFACE_INCLUDE_DIRECTORIES)
message("CURRENT_INCLUCE_DIRECTORIES ${CURRENT_INCLUCE_DIRECTORIES}")
if (CURRENT_INCLUCE_DIRECTORIES)
target_include_directories(${ADD_MOCK__NAME}
PUBLIC ${CURRENT_INCLUCE_DIRECTORIES}
)
endif()
endforeach()
target_include_directories(${ADD_MOCK__NAME}
PUBLIC ${ADD_MOCK__INCLUDE_DIRECTORIES}
)
target_compile_definitions(${ADD_MOCK__NAME}
PRIVATE ${ADD_MOCK__NAME_UPPER}_BUILD
)
target_compile_options(${ADD_MOCK__NAME}
PUBLIC ${ADD_MOCK__COMPILE_OPTIONS}
)
set_property(TARGET ${ADD_MOCK__NAME} PROPERTY FOLDER "Tests")
set_target_properties(${ADD_MOCK__NAME}
PROPERTIES testing__removes_libraries "${ADD_MOCK__REMOVES_LIBRARIES}")
set(ADDITIONAL_LIBRARY_LOCATIONS )
foreach(CURRENT_TARGET ${ADD_MOCK__ADDS_LIBRARIES_OF})
get_target_property(LIBRARY_LOCATION ${CURRENT_TARGET} LOCATION)
list(APPEND ADDITIONAL_LIBRARY_LOCATIONS ${LIBRARY_LOCATION})
endforeach()
set_target_properties(${ADD_MOCK__NAME}
PROPERTIES testing__adds_libraries "${ADDITIONAL_LIBRARY_LOCATIONS}")
generate_export_header(${ADD_MOCK__NAME}
EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/mocks/${ADD_MOCK__NAME_LOWER}_export.hpp
)
set_warning_levels_rwth(${ADD_MOCK__NAME})
endmacro()
#-------------------------------------------------------------------------------
function(CONFIGURE_MSVC_USERFILE TARGET_NAME PATH_TO_ADD)
file(TO_NATIVE_PATH "${PATH_TO_ADD}/Release" _DLL_PATH_RELEASE)
file(TO_NATIVE_PATH "${PATH_TO_ADD}/Debug" _DLL_PATH_DEBUG)
set(SOURCE_USER_FILE
"${CMAKE_SOURCE_DIR}/cmake/VisualStudio2013.vcxproj.user.in")
set(DESTINATION_USER_FILE
"${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.vcxproj.user")
configure_file(${SOURCE_USER_FILE} ${DESTINATION_USER_FILE} @ONLY)
endfunction()
function(CREATE_CATCH_MAIN_INTERNAL_
NAME SOURCE INCLUDE_DIRECTORIES)
add_library(${NAME} ${SOURCE})
target_include_directories(${NAME} PRIVATE ${INCLUDE_DIRECTORIES})
target_link_libraries(${NAME} ${CONAN_OR_CMAKE_catch} ${CONAN_OR_CMAKE_trompeloeil})
set_property(TARGET ${NAME} PROPERTY FOLDER "Tests")
source_group("Source Files" FILES ${SOURCE})
endfunction()
macro(EXTRACT_UNIT_AND_INTEGRATION_TEST_TARGETS)
get_property(added_tests GLOBAL PROPERTY ADDED_TESTS)
foreach(filename ${added_tests})
if(${filename} MATCHES "integration_test")
message(STATUS "Integration Test: ${filename}")
set(INTEGRATION_TEST_TARGETS ${INTEGRATION_TEST_TARGETS} ${filename})
else()
message(STATUS "Unit Test: ${filename}")
set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${filename})
endif()
endforeach()
endmacro()
macro(ADD_TEST_SUITE)
set(options)
set(oneValueArgs NAME TEST_REGEX)
set(multiValueArgs DEPEND_ON_TARGETS)
cmake_parse_arguments(ADD_TEST_SUITE
"${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
#we have to escape the " for visual studio)
add_custom_target(${ADD_TEST_SUITE_NAME} COMMAND ctest --tests-regex \"${ADD_TEST_SUITE_TEST_REGEX}\" -C $<CONFIG>)
# This comment just ends the escaped signs, for VS highlighting "
if(ADD_TEST_SUITE_DEPEND_ON_TARGETS)
add_dependencies(${ADD_TEST_SUITE_NAME} ${ADD_TEST_SUITE_DEPEND_ON_TARGETS})
endif()
set_property(TARGET ${ADD_TEST_SUITE_NAME} PROPERTY FOLDER "_Test-Suites_")
endmacro()
function(CREATE_TEST_SUITES)
EXTRACT_UNIT_AND_INTEGRATION_TEST_TARGETS()
ADD_TEST_SUITE(
NAME "Unit-Test-Suite"
TEST_REGEX "^test"
DEPEND_ON_TARGETS ${UNIT_TEST_TARGETS})
ADD_TEST_SUITE(
NAME "Integration-Test-Suite"
TEST_REGEX "^integration"
DEPEND_ON_TARGETS ${INTEGRATION_TEST_TARGETS})
ADD_TEST_SUITE(
NAME "Cpplint-Test-Suite"
TEST_REGEX "cpplint")
ADD_TEST_SUITE(
NAME "Cppcheck-Test-Suite"
TEST_REGEX "cppcheck")
endfunction()