Skip to content

Commit 26f0e5a

Browse files
committed
Add test coverage
1 parent 531c5d1 commit 26f0e5a

File tree

4 files changed

+47
-46
lines changed

4 files changed

+47
-46
lines changed

.cmake-format.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{
2+
"format": {
3+
"line_width": 100
4+
},
25
"lint": {
36
"disabled_codes": ["C0113"],
47
"global_var_pattern": "^[A-Z][0-9A-Z_]+$|^gtest_force_shared_crt$"

CMakeLists.txt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ add_library(traits INTERFACE)
99
add_library(Traits::traits ALIAS traits)
1010

1111
target_compile_features(traits INTERFACE cxx_std_20)
12-
target_sources(
13-
traits
14-
INTERFACE FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include"
15-
FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/traits.h")
12+
target_sources(traits INTERFACE FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include"
13+
FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/traits.h")
1614

1715
# only proceed if we are building the library directly
1816

19-
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
17+
if(NOT CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
2018
return()
2119
endif()
2220

2321
option(TRAITS_BUILD_EXAMPLES "whether or not examples should be built" ON)
2422
option(TRAITS_BUILD_TESTS "whether or not tests should be built" ON)
23+
option(TRAITS_TEST_COVERAGE "whether or not test coverage should be generated" OFF)
24+
2525
set(TRAITS_PACKAGE_NAME
2626
"${PROJECT_NAME}.zip"
2727
CACHE FILEPATH "name of package file")
@@ -42,26 +42,22 @@ install(
4242
NAMESPACE Traits::
4343
FILE "traits-targets.cmake"
4444
DESTINATION "lib/cmake/traits-${PROJECT_VERSION}")
45-
install(FILES "cmake/traits-config.cmake"
46-
"${CMAKE_CURRENT_BINARY_DIR}/traits-config-version.cmake"
45+
install(FILES "cmake/traits-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/traits-config-version.cmake"
4746
DESTINATION "lib/cmake/traits-${PROJECT_VERSION}")
4847

4948
# downloadable package for fetch content
5049

5150
add_custom_command(
5251
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${TRAITS_PACKAGE_NAME}"
53-
COMMAND
54-
${CMAKE_COMMAND} -E tar c
55-
"${CMAKE_CURRENT_BINARY_DIR}/${TRAITS_PACKAGE_NAME}" --format=zip -- cmake/
56-
examples/ include/ tests/ CMakeLists.txt LICENSE README.md
52+
COMMAND ${CMAKE_COMMAND} -E tar c "${CMAKE_CURRENT_BINARY_DIR}/${TRAITS_PACKAGE_NAME}"
53+
--format=zip -- cmake/ examples/ include/ tests/ CMakeLists.txt LICENSE README.md
5754
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
5855
add_custom_command(
5956
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/package_name"
6057
COMMAND ${CMAKE_COMMAND} -E echo "name=${TRAITS_PACKAGE_NAME}" >
6158
"${CMAKE_CURRENT_BINARY_DIR}/package_name")
62-
add_custom_target(
63-
package DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TRAITS_PACKAGE_NAME}"
64-
"${CMAKE_CURRENT_BINARY_DIR}/package_name")
59+
add_custom_target(package DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${TRAITS_PACKAGE_NAME}"
60+
"${CMAKE_CURRENT_BINARY_DIR}/package_name")
6561

6662
# optional examples
6763

tests/CMakeLists.txt

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
include(FetchContent)
22
include(GoogleTest)
33

4-
FetchContent_Declare(
5-
googletest
6-
URL https://github.com/google/googletest/archive/refs/tags/v1.15.2.zip)
4+
FetchContent_Declare(googletest
5+
URL https://github.com/google/googletest/archive/refs/tags/v1.15.2.zip)
76

87
set(gtest_force_shared_crt
98
ON
@@ -21,8 +20,8 @@ foreach(test IN LISTS tests)
2120
gtest_discover_tests(${test})
2221
endforeach()
2322

24-
# Add the deployment test, which checks that we can indeed install traits and
25-
# then use `find_package` to depend on it from another CMake project.
23+
# Add the deployment test, which checks that we can indeed install traits and then use
24+
# `find_package` to depend on it from another CMake project.
2625
include(ExternalProject)
2726
set(FAKE_INSTALL_DIR "${PROJECT_BINARY_DIR}/fakeroot")
2827
ExternalProject_Add(
@@ -31,47 +30,53 @@ ExternalProject_Add(
3130
EXCLUDE_FROM_ALL TRUE
3231
BUILD_ALWAYS TRUE
3332
INSTALL_DIR "${FAKE_INSTALL_DIR}"
34-
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
35-
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
36-
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
37-
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
33+
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
34+
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH} -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
3835
TEST_COMMAND "" # Disable test step
3936
UPDATE_COMMAND "" # Disable source work-tree update
4037
)
4138

4239
add_custom_target(
4340
test.deploy
4441
DEPENDS test.deploy.fakeroot
45-
COMMAND ${CMAKE_COMMAND} -E remove_directory
46-
"${CMAKE_CURRENT_BINARY_DIR}/deploy"
47-
COMMAND ${CMAKE_COMMAND} -E make_directory
48-
"${CMAKE_CURRENT_BINARY_DIR}/deploy"
42+
COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/deploy"
43+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/deploy"
4944
COMMAND
50-
${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/deploy"
51-
${CMAKE_COMMAND} "${CMAKE_CURRENT_SOURCE_DIR}/deploy"
52-
-DCMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
45+
${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/deploy" ${CMAKE_COMMAND}
46+
"${CMAKE_CURRENT_SOURCE_DIR}/deploy" -DCMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
5347
-DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}\;${FAKE_INSTALL_DIR}"
5448
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
5549
COMMAND ${CMAKE_COMMAND} --build "${CMAKE_CURRENT_BINARY_DIR}/deploy")
56-
add_test(NAME test.deploy COMMAND ${CMAKE_COMMAND} --build
57-
"${PROJECT_BINARY_DIR}" --target test.deploy)
50+
add_test(NAME test.deploy COMMAND ${CMAKE_COMMAND} --build "${PROJECT_BINARY_DIR}" --target
51+
test.deploy)
5852

59-
# Add the fetch test, which checks that we can indeed use fetch content from
60-
# another CMake project.
53+
# Add the fetch test, which checks that we can indeed use fetch content from another CMake project.
6154

6255
add_custom_target(
6356
test.fetch
6457
DEPENDS package
65-
COMMAND ${CMAKE_COMMAND} -E remove_directory
66-
"${CMAKE_CURRENT_BINARY_DIR}/fetch"
58+
COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/fetch"
6759
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/fetch"
6860
COMMAND
69-
${CMAKE_COMMAND} -S "${CMAKE_CURRENT_SOURCE_DIR}/fetch" -B
70-
"${CMAKE_CURRENT_BINARY_DIR}/fetch"
61+
${CMAKE_COMMAND} -S "${CMAKE_CURRENT_SOURCE_DIR}/fetch" -B "${CMAKE_CURRENT_BINARY_DIR}/fetch"
7162
-DPACKAGE_PATH="${CMAKE_CURRENT_BINARY_DIR}/../${TRAITS_PACKAGE_NAME}"
72-
-DCMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}"
73-
-DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}"
63+
-DCMAKE_CXX_COMPILER="${CMAKE_CXX_COMPILER}" -DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}"
7464
-DCMAKE_TOOLCHAIN_FILE="${CMAKE_TOOLCHAIN_FILE}"
7565
COMMAND ${CMAKE_COMMAND} --build "${CMAKE_CURRENT_BINARY_DIR}/fetch")
76-
add_test(NAME test.fetch COMMAND ${CMAKE_COMMAND} --build
77-
"${PROJECT_BINARY_DIR}" --target test.fetch)
66+
add_test(NAME test.fetch COMMAND ${CMAKE_COMMAND} --build "${PROJECT_BINARY_DIR}" --target
67+
test.fetch)
68+
69+
if(TRAITS_TEST_COVERAGE)
70+
find_program(LCOV lcov REQUIRED)
71+
find_program(GENHTML genhtml REQUIRED)
72+
73+
set(CMAKE_CXX_FLAGS "-O0 -coverage")
74+
75+
add_custom_target(
76+
coverage
77+
COMMAND "${LCOV}" --capture --directory . --output-file coverage.info
78+
COMMAND "${LCOV}" --remove coverage.info '/usr/*' '*/gtest/*' --output-file coverage.info
79+
COMMAND "${LCOV}" --list coverage.info
80+
COMMAND "${GENHTML}" --demangle-cpp -o coverage coverage.info
81+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
82+
endif()

tests/fetch/CMakeLists.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ cmake_minimum_required(VERSION 3.24)
22
project(fetch CXX)
33

44
if(NOT DEFINED PACKAGE_PATH)
5-
message(
6-
FATAL_ERROR
7-
"PACKAGE_PATH is required. Please set -DPACKAGE_PATH=/path/to/package.zip"
8-
)
5+
message(FATAL_ERROR "PACKAGE_PATH is required. Please set -DPACKAGE_PATH=/path/to/package.zip")
96
endif()
107

118
if(NOT EXISTS "${PACKAGE_PATH}")

0 commit comments

Comments
 (0)