1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5FindCxxTest
6-----------
7
8Find CxxTest unit testing framework.
9
10Find the CxxTest suite and declare a helper macro for creating unit
11tests and integrating them with CTest.  For more details on CxxTest
12see http://cxxtest.tigris.org
13
14INPUT Variables
15
16::
17
18   CXXTEST_USE_PYTHON [deprecated since 1.3]
19       Only used in the case both Python & Perl
20       are detected on the system to control
21       which CxxTest code generator is used.
22       Valid only for CxxTest version 3.
23
24
25
26::
27
28       NOTE: In older versions of this Find Module,
29       this variable controlled if the Python test
30       generator was used instead of the Perl one,
31       regardless of which scripting language the
32       user had installed.
33
34
35
36::
37
38   CXXTEST_TESTGEN_ARGS (since CMake 2.8.3)
39       Specify a list of options to pass to the CxxTest code
40       generator.  If not defined, --error-printer is
41       passed.
42
43
44
45OUTPUT Variables
46
47::
48
49   CXXTEST_FOUND
50       True if the CxxTest framework was found
51   CXXTEST_INCLUDE_DIRS
52       Where to find the CxxTest include directory
53   CXXTEST_PERL_TESTGEN_EXECUTABLE
54       The perl-based test generator
55   CXXTEST_PYTHON_TESTGEN_EXECUTABLE
56       The python-based test generator
57   CXXTEST_TESTGEN_EXECUTABLE (since CMake 2.8.3)
58       The test generator that is actually used (chosen using user preferences
59       and interpreters found in the system)
60   CXXTEST_TESTGEN_INTERPRETER (since CMake 2.8.3)
61       The full path to the Perl or Python executable on the system, on
62       platforms where the script cannot be executed using its shebang line.
63
64
65
66MACROS for optional use by CMake users:
67
68::
69
70    CXXTEST_ADD_TEST(<test_name> <gen_source_file> <input_files_to_testgen...>)
71       Creates a CxxTest runner and adds it to the CTest testing suite
72       Parameters:
73           test_name               The name of the test
74           gen_source_file         The generated source filename to be
75                                   generated by CxxTest
76           input_files_to_testgen  The list of header files containing the
77                                   CxxTest::TestSuite's to be included in
78                                   this runner
79
80
81
82::
83
84       #==============
85       Example Usage:
86
87
88
89::
90
91           find_package(CxxTest)
92           if(CXXTEST_FOUND)
93               include_directories(${CXXTEST_INCLUDE_DIR})
94               enable_testing()
95
96
97
98::
99
100               CXXTEST_ADD_TEST(unittest_foo foo_test.cc
101                                 ${CMAKE_CURRENT_SOURCE_DIR}/foo_test.h)
102               target_link_libraries(unittest_foo foo) # as needed
103           endif()
104
105
106
107::
108
109              This will (if CxxTest is found):
110              1. Invoke the testgen executable to autogenerate foo_test.cc in the
111                 binary tree from "foo_test.h" in the current source directory.
112              2. Create an executable and test called unittest_foo.
113
114
115
116::
117
118      #=============
119      Example foo_test.h:
120
121
122
123::
124
125          #include <cxxtest/TestSuite.h>
126
127
128
129::
130
131          class MyTestSuite : public CxxTest::TestSuite
132          {
133          public:
134             void testAddition( void )
135             {
136                TS_ASSERT( 1 + 1 > 1 );
137                TS_ASSERT_EQUALS( 1 + 1, 2 );
138             }
139          };
140#]=======================================================================]
141
142# Version 1.4 (11/18/10) (CMake 2.8.4)
143#     Issue 11384: Added support to the CXX_ADD_TEST macro so header
144#                  files (containing the tests themselves) show up in
145#                  Visual Studio and other IDEs.
146#
147# Version 1.3 (8/19/10) (CMake 2.8.3)
148#     Included patch by Simone Rossetto to check if either Python or Perl
149#     are present in the system.  Whichever interpreter that is detected
150#     is now used to run the test generator program.  If both interpreters
151#     are detected, the CXXTEST_USE_PYTHON variable is obeyed.
152#
153#     Also added support for CXXTEST_TESTGEN_ARGS, for manually specifying
154#     options to the CxxTest code generator.
155# Version 1.2 (3/2/08)
156#     Included patch from Tyler Roscoe to have the perl & python binaries
157#     detected based on CXXTEST_INCLUDE_DIR
158# Version 1.1 (2/9/08)
159#     Clarified example to illustrate need to call target_link_libraries()
160#     Changed commands to lowercase
161#     Added licensing info
162# Version 1.0 (1/8/08)
163#     Fixed CXXTEST_INCLUDE_DIRS so it will work properly
164#     Eliminated superfluous CXXTEST_FOUND assignment
165#     Cleaned up and added more documentation
166
167#=============================================================
168# CXXTEST_ADD_TEST (public macro)
169#=============================================================
170macro(CXXTEST_ADD_TEST _cxxtest_testname _cxxtest_outfname)
171    set(_cxxtest_real_outfname ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_outfname})
172
173    add_custom_command(
174        OUTPUT  ${_cxxtest_real_outfname}
175        DEPENDS ${ARGN}
176        COMMAND ${CXXTEST_TESTGEN_INTERPRETER}
177        ${CXXTEST_TESTGEN_EXECUTABLE} ${CXXTEST_TESTGEN_ARGS} -o ${_cxxtest_real_outfname} ${ARGN}
178    )
179
180    set_source_files_properties(${_cxxtest_real_outfname} PROPERTIES GENERATED true)
181    add_executable(${_cxxtest_testname} ${_cxxtest_real_outfname} ${ARGN})
182
183    if(CMAKE_RUNTIME_OUTPUT_DIRECTORY)
184        add_test(${_cxxtest_testname} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_cxxtest_testname})
185    elseif(EXECUTABLE_OUTPUT_PATH)
186        add_test(${_cxxtest_testname} ${EXECUTABLE_OUTPUT_PATH}/${_cxxtest_testname})
187    else()
188        add_test(${_cxxtest_testname} ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_testname})
189    endif()
190
191endmacro()
192
193#=============================================================
194# main()
195#=============================================================
196if(NOT DEFINED CXXTEST_TESTGEN_ARGS)
197  set(CXXTEST_TESTGEN_ARGS --error-printer)
198endif()
199
200find_package(Python QUIET)
201find_package(Perl QUIET)
202
203find_path(CXXTEST_INCLUDE_DIR cxxtest/TestSuite.h)
204find_program(CXXTEST_PYTHON_TESTGEN_EXECUTABLE
205         NAMES cxxtestgen cxxtestgen.py
206         PATHS ${CXXTEST_INCLUDE_DIR})
207find_program(CXXTEST_PERL_TESTGEN_EXECUTABLE cxxtestgen.pl
208         PATHS ${CXXTEST_INCLUDE_DIR})
209
210if(PYTHON_FOUND OR PERL_FOUND)
211  include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
212
213  if(PYTHON_FOUND AND (CXXTEST_USE_PYTHON OR NOT PERL_FOUND OR NOT DEFINED CXXTEST_USE_PYTHON))
214    set(CXXTEST_TESTGEN_EXECUTABLE ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE})
215    execute_process(COMMAND ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE} --version
216      OUTPUT_VARIABLE _CXXTEST_OUT ERROR_VARIABLE _CXXTEST_OUT RESULT_VARIABLE _CXXTEST_RESULT)
217    if(_CXXTEST_RESULT EQUAL 0)
218      set(CXXTEST_TESTGEN_INTERPRETER "")
219    else()
220      set(CXXTEST_TESTGEN_INTERPRETER ${Python_EXECUTABLE})
221    endif()
222    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CxxTest DEFAULT_MSG
223        CXXTEST_INCLUDE_DIR CXXTEST_PYTHON_TESTGEN_EXECUTABLE)
224
225  elseif(PERL_FOUND)
226    set(CXXTEST_TESTGEN_EXECUTABLE ${CXXTEST_PERL_TESTGEN_EXECUTABLE})
227    set(CXXTEST_TESTGEN_INTERPRETER ${PERL_EXECUTABLE})
228    FIND_PACKAGE_HANDLE_STANDARD_ARGS(CxxTest DEFAULT_MSG
229        CXXTEST_INCLUDE_DIR CXXTEST_PERL_TESTGEN_EXECUTABLE)
230  endif()
231
232  if(CXXTEST_FOUND)
233    set(CXXTEST_INCLUDE_DIRS ${CXXTEST_INCLUDE_DIR})
234  endif()
235
236else()
237
238  set(CXXTEST_FOUND false)
239  if(NOT CxxTest_FIND_QUIETLY)
240    if(CxxTest_FIND_REQUIRED)
241      message(FATAL_ERROR "Neither Python nor Perl found, cannot use CxxTest, aborting!")
242    else()
243      message(STATUS "Neither Python nor Perl found, CxxTest will not be used.")
244    endif()
245  endif()
246
247endif()
248