Add CMake files for the unit tests

- Building unit tests is optional, disabled by default to prevent
  the library clients from pulling the dependency on boost
- Add the unit tests to the Github Actions.
- Use boost::filesystem to manipulate paths for better portability
This commit is contained in:
Pierre Dejoue 2020-07-14 18:16:18 +02:00
parent a269fb4743
commit 7125fdb13b
6 changed files with 61 additions and 7 deletions

View File

@ -13,12 +13,13 @@ jobs:
image: fedora:32 image: fedora:32
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Install dependencies - name: Install dependencies
run: dnf install -yq cmake ninja-build gcc-c++ clang-tools-extra python3-PyYAML run: dnf install -yq cmake ninja-build gcc-c++ clang-tools-extra python3-PyYAML boost-devel
- name: Build with GCC - name: Build with GCC
run: | run: |
cmake -Bbuild -GNinja cmake -Bbuild -GNinja -DP2T_BUILD_TESTS=ON
cmake --build build cmake --build build
- name: Build with Clang - name: Build with Clang
@ -28,3 +29,6 @@ jobs:
- name: Lint with clang-tidy - name: Lint with clang-tidy
run: python3 /usr/share/clang/run-clang-tidy.py -header-filter=poly2tri -p=build-clang run: python3 /usr/share/clang/run-clang-tidy.py -header-filter=poly2tri -p=build-clang
- name: Unit tests
run: cd build && ctest --output-on-failure

View File

@ -1,8 +1,15 @@
cmake_minimum_required(VERSION 3.6) cmake_minimum_required(VERSION 3.12)
project(poly2tri LANGUAGES CXX) project(poly2tri LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
option(P2T_BUILD_TESTS "Build tests" OFF)
file(GLOB SOURCES poly2tri/common/*.cc poly2tri/sweep/*.cc) file(GLOB SOURCES poly2tri/common/*.cc poly2tri/sweep/*.cc)
add_library(poly2tri ${SOURCES}) add_library(poly2tri ${SOURCES})
target_include_directories(poly2tri INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(poly2tri INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
if(P2T_BUILD_TESTS)
enable_testing()
add_subdirectory(unittest)
endif()

View File

@ -10,7 +10,7 @@ lib = static_library('poly2tri', sources : [
]) ])
thread_dep = dependency('threads') thread_dep = dependency('threads')
boost_test_dep = dependency('boost', modules : [ 'unit_test_framework' ], required : false) boost_test_dep = dependency('boost', modules : [ 'filesystem', 'unit_test_framework' ], required : false)
if boost_test_dep.found() if boost_test_dep.found()
test('Unit Test', executable('unittest', [ test('Unit Test', executable('unittest', [
'unittest/main.cpp', 'unittest/main.cpp',

32
unittest/CMakeLists.txt Normal file
View File

@ -0,0 +1,32 @@
# Dependencies
if (WIN32)
set(Boost_USE_STATIC_LIBS ON)
endif()
find_package(Boost 1.69 REQUIRED COMPONENTS
filesystem
unit_test_framework
)
# Build Unit Tests
add_executable(test_poly2tri
main.cpp
TriangleTest.cpp
)
target_include_directories(test_poly2tri
PRIVATE
${Boost_INCLUDE_DIRS}
)
target_compile_definitions(test_poly2tri
PRIVATE
P2T_BASE_DIR="${PROJECT_SOURCE_DIR}"
)
target_link_libraries(test_poly2tri
PRIVATE
poly2tri
${Boost_LIBRARIES}
)
add_test(NAME poly2tri COMMAND test_poly2tri)

View File

@ -1,3 +1,6 @@
#ifndef WIN32
#define BOOST_TEST_DYN_LINK
#endif
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
#include <poly2tri/common/shapes.h> #include <poly2tri/common/shapes.h>

View File

@ -1,5 +1,9 @@
#ifndef WIN32
#define BOOST_TEST_DYN_LINK #define BOOST_TEST_DYN_LINK
#endif
#define BOOST_TEST_MODULE Poly2triTest #define BOOST_TEST_MODULE Poly2triTest
#include <boost/filesystem/path.hpp>
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
#include <poly2tri/poly2tri.h> #include <poly2tri/poly2tri.h>
#include <fstream> #include <fstream>
@ -64,9 +68,13 @@ BOOST_AUTO_TEST_CASE(TestbedFilesTest)
// Load pointset from file // Load pointset from file
// Parse and tokenize data file // Parse and tokenize data file
std::string line; std::string line;
const std::string src(__FILE__); // ../unittest/main.cpp #ifndef P2T_BASE_DIR
auto folder = src.substr(0, src.find_last_of('/')) + "/../testbed/data/"; const auto basedir = boost::filesystem::path(__FILE__).remove_filename().parent_path();
std::ifstream myfile(folder + filename); #else
const auto basedir = boost::filesystem::path(P2T_BASE_DIR);
#endif
const auto datafile = basedir / boost::filesystem::path("testbed/data") / boost::filesystem::path(filename);
std::ifstream myfile(datafile.string());
BOOST_REQUIRE(myfile.is_open()); BOOST_REQUIRE(myfile.is_open());
while (!myfile.eof()) { while (!myfile.eof()) {
getline(myfile, line); getline(myfile, line);