if(NOT BUILD_TESTING)
  return()
endif()

# Inspired by https://eb2.co/blog/2015/06/driving-boost.test-with-cmake
function(gather_boost_tests SOURCE_FILE_NAME)

    file(READ "${SOURCE_FILE_NAME}" SOURCE_FILE_CONTENTS)
    string(REGEX MATCHALL "BOOST_(AUTO|FIXTURE|DATA)_TEST_CASE\\([^,\\)]+"
           FOUND_TESTS ${SOURCE_FILE_CONTENTS})

    list(TRANSFORM FOUND_TESTS REPLACE ".*\\(([^,\\)]+).*" "\\1")

    # BOOST_DATA_TEST_CASE_F has the order of fixture and test case reversed
    string(REGEX MATCHALL "BOOST_DATA_TEST_CASE_F\\([^,\\)]+,[^,\\)]+"
           FOUND_TESTS_DATA_F ${SOURCE_FILE_CONTENTS})

    list(TRANSFORM FOUND_TESTS_DATA_F REPLACE ".*\\(([^,\\)]+),([^,\\)]+).*" "\\2")

    # concatenate
    set(FOUND_TESTS_ALL "${FOUND_TESTS};${FOUND_TESTS_DATA_F}")

    list(TRANSFORM FOUND_TESTS_ALL STRIP)

    list(REMOVE_DUPLICATES FOUND_TESTS_ALL)

    set(ALL_TEST_CASES ${FOUND_TESTS_ALL} PARENT_SCOPE)
endfunction()

find_package(Boost CONFIG REQUIRED unit_test_framework)

add_executable(db_test test/test.cpp ../SecureString.cpp)
target_include_directories(db_test PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

target_include_directories(db_test PUBLIC ${Boost_INCLUDE_DIRS})
target_compile_options(db_test PUBLIC -Wall -Wextra -pedantic)
target_link_libraries(db_test ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} Tango::Tango)

configure_file(test/start_tdb.sh.in start_tdb.sh @ONLY)
configure_file(test/stop_tdb.sh.in stop_tdb.sh @ONLY)

gather_boost_tests("test/test.cpp")

# not using cmake FIXTURES_SETUP/FIXTURES_CLEANUP as these are not called per test case

message(STATUS "Found test cases: ${ALL_TEST_CASES}")

foreach(TEST_CASE IN LISTS ALL_TEST_CASES)
  add_test(NAME ${TEST_CASE} COMMAND db_test --log_level=all --logger=JUNIT,message,JU_${TEST_CASE}.xml:HRF,message,stdout --run_test=*/${TEST_CASE} --catch_system_error=yes)
  # don't allow parallel runs
  set_tests_properties(${TEST_CASE} PROPERTIES RESOURCE_LOCK Database)
endforeach()
