From bd80f78ff7e5519363e186b8fc2bbedb7783b002 Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:12:26 +0800 Subject: [PATCH 1/8] TST: init gtest --- .gitignore | 2 ++ CMakeLists.txt | 11 +++++++++++ tests/CMakeLists.txt | 16 ++++++++++++++++ tests/airy.cpp | 5 +++++ 4 files changed, 34 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 tests/CMakeLists.txt create mode 100644 tests/airy.cpp diff --git a/.gitignore b/.gitignore index 259148f..c3b5630 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +build/ + # Prerequisites *.d diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f90249d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.14) +project(xsf) + +# Scipy requ C++17 +# https://docs.scipy.org/doc/scipy/dev/toolchain.html#c-language-standards +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Tests +enable_testing() +add_subdirectory(tests) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..d4bf667 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,16 @@ +# Get googletest +# https://google.github.io/googletest/quickstart-cmake.html +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/releases/download/v1.15.2/googletest-1.15.2.tar.gz +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) +include(GoogleTest) + +# Add Tests +add_executable(airy airy.cpp) +target_link_libraries(airy GTest::gtest_main) +gtest_discover_tests(airy) diff --git a/tests/airy.cpp b/tests/airy.cpp new file mode 100644 index 0000000..015e84f --- /dev/null +++ b/tests/airy.cpp @@ -0,0 +1,5 @@ +#include + +TEST(Airy, BasicAssertions) { + EXPECT_EQ(7 * 6, 42); +} From 26e41a43a3487983cdb087cb47f82e455a6a7c23 Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:13:20 +0800 Subject: [PATCH 2/8] TST: add cmake function `add_gtest` --- tests/CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d4bf667..34f3769 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,6 +11,10 @@ FetchContent_MakeAvailable(googletest) include(GoogleTest) # Add Tests -add_executable(airy airy.cpp) -target_link_libraries(airy GTest::gtest_main) -gtest_discover_tests(airy) +function(add_gtest test_name) + add_executable(${test_name} ${test_name}.cpp) + target_link_libraries(${test_name} GTest::gtest_main) + gtest_discover_tests(${test_name}) +endfunction() + +add_gtest(airy) From 9e96f693209912361c283523b676dac7af321461 Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:14:18 +0800 Subject: [PATCH 3/8] TST: init Airy test --- CMakeLists.txt | 2 ++ tests/airy.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f90249d..efb3f61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,8 @@ project(xsf) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +include_directories(${CMAKE_SOURCE_DIR}/include) + # Tests enable_testing() add_subdirectory(tests) diff --git a/tests/airy.cpp b/tests/airy.cpp index 015e84f..143a0c2 100644 --- a/tests/airy.cpp +++ b/tests/airy.cpp @@ -1,5 +1,46 @@ +#include +#include #include +#include TEST(Airy, BasicAssertions) { - EXPECT_EQ(7 * 6, 42); + const double nan64 = std::numeric_limits::quiet_NaN(); + const std::complex nan64c(std::nan(""), std::nan("")); + double x, ai, aip, bi, bip; + + x = 0.0; + xsf::airy(x, ai, aip, bi, bip); + EXPECT_NE(ai, nan64); + EXPECT_NE(aip, nan64); + EXPECT_NE(bi, nan64); + EXPECT_NE(bip, nan64); + + xsf::airye(x, ai, aip, bi, bip); + EXPECT_NE(ai, nan64); + EXPECT_NE(aip, nan64); + EXPECT_NE(bi, nan64); + EXPECT_NE(bip, nan64); + + double apt, bpt, ant, bnt; + x = 1.0; + xsf::itairy(x, apt, bpt, ant, bnt); + EXPECT_NE(apt, nan64); + EXPECT_NE(bpt, nan64); + EXPECT_NE(ant, nan64); + EXPECT_NE(bnt, nan64); + + // std::complex + std::complex z, cai, caip, cbi, cbip; + z = 0.0; + xsf::airy(z, cai, caip, cbi, cbip); + EXPECT_NE(cai, nan64c); + EXPECT_NE(caip, nan64c); + EXPECT_NE(cbi, nan64c); + EXPECT_NE(cbip, nan64c); + + xsf::airye(z, cai, caip, cbi, cbip); + EXPECT_NE(cai, nan64c); + EXPECT_NE(caip, nan64c); + EXPECT_NE(cbi, nan64c); + EXPECT_NE(cbip, nan64c); } From 71f30840af1ecdf7dc3d82166ccac046823e353a Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:29:11 +0800 Subject: [PATCH 4/8] TST: Generating coverage report --- tests/CMakeLists.txt | 2 ++ tests/Coverage.cmake | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 tests/Coverage.cmake diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 34f3769..a35314b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,7 +8,9 @@ FetchContent_Declare( # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) + include(GoogleTest) +include(${CMAKE_SOURCE_DIR}/tests/Coverage.cmake) # Add Tests function(add_gtest test_name) diff --git a/tests/Coverage.cmake b/tests/Coverage.cmake new file mode 100644 index 0000000..b8c31fe --- /dev/null +++ b/tests/Coverage.cmake @@ -0,0 +1,30 @@ +if(CMAKE_BUILD_TYPE STREQUAL "Coverage") + +# Enable coverage compilation option +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage") +endif() +if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /coverage") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /coverage") +endif() + +# Add custom targets for generating coverage reports +add_custom_target(coverage + COMMAND /usr/bin/lcov --capture --directory . --output-file coverage.info + COMMAND /usr/bin/lcov --output-file coverage.info --extract coverage.info '*/include/xsf/*' + COMMAND /usr/bin/lcov --list coverage.info + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating coverage report" +) + +# Generate coverage reports in HTML format +add_custom_target(coverage_html + COMMAND genhtml --demangle-cpp --legend coverage.info --output-directory coverage_report + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating HTML coverage report" +) +add_dependencies(coverage_html coverage) + +endif() # CMAKE_BUILD_TYPE=Coverage \ No newline at end of file From 850bb58c02e8ad7739171175960c6f2fe30b74f0 Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:34:09 +0800 Subject: [PATCH 5/8] DEV/TST: setup coverage workflow --- .github/workflows/coverage.yml | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/coverage.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..9030efe --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,36 @@ +name: Coverage + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read # to fetch code (actions/checkout) + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + codecov: + runs-on: ubuntu-latest + strategy: + fail-fast: false + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Install packages + run: sudo apt-get install -y lcov + + - name: Configure + run: cmake -DCMAKE_BUILD_TYPE=Coverage -S . -B build + - name: Build + run: cmake --build build + - name: Run Tests + working-directory: build + run: ctest + - name: Generating coverage report + run: cmake --build build --target coverage + From a93a0b054b39b09737cb184b156de3dbda4e32fa Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:36:29 +0800 Subject: [PATCH 6/8] DEV: Upload HTML coverage report --- .github/workflows/coverage.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 9030efe..05fb869 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -32,5 +32,11 @@ jobs: working-directory: build run: ctest - name: Generating coverage report - run: cmake --build build --target coverage + run: cmake --build build --target coverage_html + + - name: Upload HTML coverage report + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + with: + name: cov-html + path: build/coverage_report/** From 0e01e583cf3cf9898d09b508f9762345f829b277 Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Wed, 13 Nov 2024 17:57:03 +0800 Subject: [PATCH 7/8] DEV: Do not specify a full path to lcov --- tests/Coverage.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Coverage.cmake b/tests/Coverage.cmake index b8c31fe..b12e021 100644 --- a/tests/Coverage.cmake +++ b/tests/Coverage.cmake @@ -12,9 +12,9 @@ endif() # Add custom targets for generating coverage reports add_custom_target(coverage - COMMAND /usr/bin/lcov --capture --directory . --output-file coverage.info - COMMAND /usr/bin/lcov --output-file coverage.info --extract coverage.info '*/include/xsf/*' - COMMAND /usr/bin/lcov --list coverage.info + COMMAND lcov --capture --directory . --output-file coverage.info + COMMAND lcov --output-file coverage.info --extract coverage.info '*/include/xsf/*' + COMMAND lcov --list coverage.info WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Generating coverage report" ) From bcac6e0d60ee492b31bce1b827f48a56155dfade Mon Sep 17 00:00:00 2001 From: Chengyu HAN Date: Fri, 15 Nov 2024 22:43:51 +0800 Subject: [PATCH 8/8] DEV: fix cmake warning CMP0135 --- tests/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a35314b..3018d1a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,7 +3,8 @@ include(FetchContent) FetchContent_Declare( googletest - URL https://github.com/google/googletest/releases/download/v1.15.2/googletest-1.15.2.tar.gz + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG b514bdc898e2951020cbdca1304b75f5950d1f59 # v1.15.2 ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)