cmake_minimum_required(VERSION 3.15)

#
# Project details
#

project(${CMAKE_PROJECT_NAME}Tests LANGUAGES CXX)

message("Adding tests under ${CMAKE_PROJECT_NAME}Tests...")

foreach(file ${test_sources})
  message("Handling TEST file ${file}")
  string(REGEX REPLACE "(.*/)([a-zA-Z0-9_ ]+)(\.cpp)" "\\2" test_name ${file})
  add_executable(${test_name}_Tests ${file} "src/helpers.cpp")
  message("Target ${test_name}_Tests for file ${file}")

  message("Include ${CMAKE_SOURCE_DIR}/include and ${CMAKE_SOURCE_DIR}/src")

  #
  # Set the compiler standard
  #

  target_compile_features(${test_name}_Tests PUBLIC cxx_std_17)

  #
  # Setup code coverage if enabled
  #

  if(${CMAKE_PROJECT_NAME}_ENABLE_CODE_COVERAGE)
    target_compile_options(${CMAKE_PROJECT_NAME} PUBLIC -O0 -g -fprofile-arcs
                                                        -ftest-coverage)
    target_link_options(${CMAKE_PROJECT_NAME} PUBLIC -fprofile-arcs
                        -ftest-coverage)
    verbose_message("Code coverage is enabled and provided with GCC.")
  endif()

  #
  # Load the desired unit testing framework
  #
  # Currently supported: GoogleTest (and GoogleMock), Catch2.

  if(${CMAKE_PROJECT_NAME}_BUILD_EXECUTABLE)
    set(${CMAKE_PROJECT_NAME}_TEST_LIB ${CMAKE_PROJECT_NAME}_LIB)
  else()
    set(${CMAKE_PROJECT_NAME}_TEST_LIB ${CMAKE_PROJECT_NAME})
  endif()

  if(${CMAKE_PROJECT_NAME}_USE_GTEST)
    find_package(GTest REQUIRED)

    if(${CMAKE_PROJECT_NAME}_USE_GOOGLE_MOCK)
      set(GOOGLE_MOCK_LIBRARIES GTest::gmock GTest::gmock_main)
    endif()

    target_link_libraries(
      ${test_name}_Tests
      PUBLIC GTest::GTest GTest::Main ${GOOGLE_MOCK_LIBRARIES}
             ${${CMAKE_PROJECT_NAME}_TEST_LIB})
  elseif(${CMAKE_PROJECT_NAME}_USE_CATCH2)
    find_package(Catch2 REQUIRED)
    target_link_libraries(
      ${test_name}_Tests PUBLIC Catch2::Catch2
                                ${${CMAKE_PROJECT_NAME}_TEST_LIB})
  else()
    message(
      FATAL_ERROR
        "Unknown testing library. Please setup your desired unit testing library by using `target_link_libraries`."
    )
  endif()

  #
  # Add the unit tests
  #

  add_test(NAME ${test_name} COMMAND ${test_name}_Tests)
endforeach()

message("Finished adding unit tests for ${CMAKE_PROJECT_NAME}.")
