Reputation: 5389
I have a project structured like:
|--assets/
|--core/
|--deps/
|--Catch2/
|--win32/
|--# Have Catch2 library installed here
|--include/
|--# Nothing here
|--src/
|--sample.cpp # No content in this file
|--tests/
|--test.cpp
|--CMakeLists.txt
|--main.cpp
|--CMakeLists.txt
The top level CMakeLists.txt content is:
cmake_minimum_required (VERSION 3.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
project("My.Project")
add_executable(MyProject main.cpp)
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR>)
endforeach()
else(APPLE)
endif()
add_subdirectory(core)
target_link_libraries(MyProject MyLib)
The CMakeLists.txt file in the "core" folder is:
file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp")
add_library(MyLib ${HEADER_FILES} ${SOURCE_FILES} ${TEST_FILES})
target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR_CORE POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR_CORE>)
endforeach()
else(APPLE)
endif()
# Catch2 stuff:
if(WIN32)
find_package(Catch2 REQUIRED PATHS "${CMAKE_CURRENT_SOURCE_DIR}/deps/catch2/win32")
target_link_libraries(MyLib Catch2::Catch2)
endif()
include(CTest)
include(Catch)
catch_discover_tests(MyLib)
My test.cpp
content (from Catch2 documentation and this test should fail):
#define CATCH_CONFIG_MAIN
#include "catch2/catch.hpp"
unsigned int Factorial(unsigned int number)
{
return number <= 1 ? number : Factorial(number - 1)*number;
}
TEST_CASE("Factorials are computed", "[factorial]")
{
REQUIRE(Factorial(1) == 2); // Should fail here.
REQUIRE(Factorial(2) == 2);
REQUIRE(Factorial(3) == 6);
REQUIRE(Factorial(10) == 3628800);
}
When I generate the Visual Studio files using cmake -G "Visual Studio 15" . -B .\build
, usually, when the tests are discovered, I see a project grouped under "CMakePredefinedTargets" called "RUN_TESTS". However, I can't see this project anymore.
Also, when I build the project (using Visual Studio 2017), the tests are not running. Please help. Thanks.
Upvotes: 3
Views: 4008
Reputation: 5389
Based on the comments by @Stephen Newell and @ squareskittles, my final modified working CMakeLists.txt files are as follows.
I added enable_testing()
to the root file. This makes the RUN_TESTS project visible in Visual Studio. I build this project when I want to run the tests:
cmake_minimum_required (VERSION 3.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
project("My.Project")
enable_testing()
add_executable(MyProject main.cpp)
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR>)
endforeach()
else(APPLE)
endif()
add_subdirectory(core)
target_link_libraries(MyProject MyLib)
However, just adding this line still left with the issue that, even though the RUN_TESTS was there, it was not discovering the unit tests because the CMake-Catch2 integration expects an executable, not a library to run the tests. So, I added a separate target like in CMakeLists.txt file in the core folder:
file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(MyLib ${HEADER_FILES} ${SOURCE_FILES})
target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR_CORE POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR_CORE>)
endforeach()
else(APPLE)
endif()
# Catch2 stuff:
file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp")
add_executable(MyLibTests ${TEST_FILES})
if(WIN32)
find_package(Catch2 REQUIRED PATHS "${CMAKE_CURRENT_SOURCE_DIR}/deps/catch2/win32")
target_link_libraries(MyLibTests Catch2::Catch2)
endif()
include(CTest)
include(Catch)
catch_discover_tests(MyLibTests)
Since the example given in the Catch2 documentation is fairly minimal hope this will help someone trying to integrate Catch2 with a more complex project structure. Thanks for all the help from the commentators.
Upvotes: 2