-
Notifications
You must be signed in to change notification settings - Fork 122
/
FindCxxTest.cmake
208 lines (184 loc) · 8.52 KB
/
FindCxxTest.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# - Find CxxTest
# Find the CxxTest suite and declare a helper macro for creating unit tests
# and integrating them with CTest.
# For more details on CxxTest see http://cxxtest.tigris.org
#
# INPUT Variables
#
# CXXTEST_USE_PYTHON
# If true, the CXXTEST_ADD_TEST macro will use
# the Python test generator instead of Perl.
#
# OUTPUT Variables
#
# CXXTEST_FOUND
# True if the CxxTest framework was found
# CXXTEST_INCLUDE_DIR
# Where to find the CxxTest include directory
# CXXTEST_PERL_TESTGEN_EXECUTABLE
# The perl-based test generator.
# CXXTEST_PYTHON_TESTGEN_EXECUTABLE
# The python-based test generator.
#
# MACROS for optional use by CMake users:
#
# CXXTEST_ADD_TEST(<test_name> <gen_source_file> <input_files_to_testgen...>)
# Creates a CxxTest runner and adds it to the CTest testing suite
# Parameters:
# test_name The name of the test
# input_files_to_testgen The list of header files containing the
# CxxTest::TestSuite's to be included in this runner
#
# The variable TESTHELPER_SRCS can be used to pass in extra (non-test) source files
# that should be included in the test executable.
#
# #==============
# Example Usage:
#
# find_package(CxxTest)
# if(CXXTEST_FOUND)
# include_directories(${CXXTEST_INCLUDE_DIR})
# enable_testing()
#
# set(TESTHELPER_SRCS HelperClass1.cc HelperClass2.cc)
# CXXTEST_ADD_TEST(unittest_foo foo_test.cc
# ${CMAKE_CURRENT_SOURCE_DIR}/foo_test.h)
# target_link_libraries(unittest_foo foo) # as needed
# endif()
#
# This will (if CxxTest is found):
# 1. Invoke the testgen executable to autogenerate foo_test.cc in the
# binary tree from "foo_test.h" in the current source directory.
# 2. Create an executable and test called unittest_foo.
# 3. Files specified in TESTHELPER_SRCS will also be compiled and linked in.
#
# #=============
# Example foo_test.h:
#
# #include <cxxtest/TestSuite.h>
#
# class MyTestSuite : public CxxTest::TestSuite
# {
# public:
# void testAddition( void )
# {
# TS_ASSERT( 1 + 1 > 1 );
# TS_ASSERT_EQUALS( 1 + 1, 2 );
# }
# };
#
#=============================================================================
# Copyright 2008-2009 Kitware, Inc.
# Copyright 2008-2009 Philip Lowman <philip@yhbt.com>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distributed this file outside of CMake, substitute the full
# License text for the above reference.)
# Version 1.2 (3/2/08)
# Included patch from Tyler Roscoe to have the perl & python binaries
# detected based on CXXTEST_INCLUDE_DIR
# Version 1.1 (2/9/08)
# Clarified example to illustrate need to call target_link_libraries()
# Changed commands to lowercase
# Added licensing info
# Version 1.0 (1/8/08)
# Fixed CXXTEST_INCLUDE_DIRS so it will work properly
# Eliminated superfluous CXXTEST_FOUND assignment
# Cleaned up and added more documentation
include ( PrecompiledHeaderCommands )
#=============================================================
# CXXTEST_ADD_TEST (public macro to add unit tests)
#=============================================================
macro(CXXTEST_ADD_TEST _cxxtest_testname)
# determine the cpp filename
set(_cxxtest_real_outfname ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_testname}_runner.cpp)
add_custom_command(
OUTPUT ${_cxxtest_real_outfname}
DEPENDS ${PATH_FILES}
COMMAND ${PYTHON_EXECUTABLE} ${CXXTEST_TESTGEN_EXECUTABLE} --root
--xunit-printer --world ${_cxxtest_testname} -o ${_cxxtest_real_outfname}
)
set_source_files_properties(${_cxxtest_real_outfname} PROPERTIES GENERATED true)
# convert the header files to have full path
set (_cxxtest_cpp_files ${_cxxtest_real_outfname} )
set (_cxxtest_h_files )
foreach (part ${ARGN})
get_filename_component(_cxxtest_cpp ${part} NAME)
string ( REPLACE ".h" ".cpp" _cxxtest_cpp ${_cxxtest_cpp} )
set ( _cxxtest_cpp "${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_cpp}" )
set ( _cxxtest_h "${CMAKE_CURRENT_SOURCE_DIR}/${part}" )
add_custom_command(
OUTPUT ${_cxxtest_cpp}
DEPENDS ${_cxxtest_h}
COMMAND ${PYTHON_EXECUTABLE} ${CXXTEST_TESTGEN_EXECUTABLE} --part
--world ${_cxxtest_testname} -o ${_cxxtest_cpp} ${_cxxtest_h}
)
set_source_files_properties(${_cxxtest_cpp} PROPERTIES GENERATED true)
set (_cxxtest_cpp_files ${_cxxtest_cpp} ${_cxxtest_cpp_files})
set (_cxxtest_h_files ${part} ${_cxxtest_h_files})
endforeach (part ${ARGN})
set ( _test_dir ${CMAKE_CURRENT_SOURCE_DIR} )
if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_test_dir}/PrecompiledHeader.h )
ADD_PRECOMPILED_HEADER( ${_test_dir}/PrecompiledHeader.h ${CMAKE_CURRENT_SOURCE_DIR}/${_test_dir} ${CMAKE_CURRENT_SOURCE_DIR}/${_test_dir}/PrecompiledHeader.cpp _cxxtest_cpp_files _cxxtest_h_files)
ENDIF ()
# define the test executable and exclude it from the all target
# The TESTHELPER_SRCS variable can be set outside the macro and used to pass in test helper classes
add_executable(${_cxxtest_testname} EXCLUDE_FROM_ALL ${_cxxtest_cpp_files} ${_cxxtest_h_files} ${TESTHELPER_SRCS} )
# only the package wide test is added to check
add_dependencies(check ${_cxxtest_testname})
if (CXXTEST_SINGLE_LOGFILE)
# add the whole suite as a single test so the output xml doesn't overwrite itself
add_test ( NAME ${_cxxtest_testname}
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_BINARY_DIR}/bin/Testing"
$<TARGET_FILE:${_cxxtest_testname}> )
else (CXXTEST_SINGLE_LOGFILE)
# THE FOLLOWING DESTROYS THE OUTPUT XML FILE
# add each separate test to ctest
foreach ( part ${ARGN} )
# The filename without extension = The suite name.
get_filename_component(_suitename ${part} NAME_WE )
set( _cxxtest_separate_name "${_cxxtest_testname}_${_suitename}")
add_test ( NAME ${_cxxtest_separate_name}
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_BINARY_DIR}/bin/Testing"
$<TARGET_FILE:${_cxxtest_testname}> ${_suitename} )
set_tests_properties ( ${_cxxtest_separate_name} PROPERTIES
TIMEOUT ${TESTING_TIMEOUT} )
if (CXXTEST_ADD_PERFORMANCE)
# ------ Performance test version -------
# Name of the possibly-existing Performance test suite
set( _performance_suite_name "${_suitename}Performance" )
# Read the contents of the header file
FILE( READ ${part} _file_contents )
# Is that suite defined in there at all?
STRING(REGEX MATCH ${_performance_suite_name} _search_res ${_file_contents} )
if (NOT "${_search_res}" STREQUAL "")
#MESSAGE( "${_performance_suite_name} Found: ${_search_res}" )
set( _cxxtest_separate_name "${_cxxtest_testname}_${_performance_suite_name}")
add_test ( NAME ${_cxxtest_separate_name}
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_BINARY_DIR}/bin/Testing"
$<TARGET_FILE:${_cxxtest_testname}> ${_performance_suite_name} )
set_tests_properties ( ${_cxxtest_separate_name} PROPERTIES
TIMEOUT ${TESTING_TIMEOUT} )
endif ()
endif ()
endforeach ( part ${ARGN} )
endif (CXXTEST_SINGLE_LOGFILE)
endmacro(CXXTEST_ADD_TEST)
#=============================================================
# main()
#=============================================================
find_path(CXXTEST_INCLUDE_DIR cxxtest/TestSuite.h
PATHS ${PROJECT_SOURCE_DIR}/TestingTools/cxxtest
${PROJECT_SOURCE_DIR}/../TestingTools/cxxtest )
find_program(CXXTEST_TESTGEN_EXECUTABLE python/scripts/cxxtestgen
PATHS ${CXXTEST_INCLUDE_DIR})
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(CxxTest DEFAULT_MSG CXXTEST_INCLUDE_DIR)
set(CXXTEST_INCLUDE_DIRS ${CXXTEST_INCLUDE_DIR})
mark_as_advanced ( CXXTEST_INCLUDE_DIR CXXTEST_TESTGEN_EXECUTABLE )