message(STATUS "Building tests")

# enable ctest
enable_testing()

include(FetchContent)

# Prevent GoogleTest from using system-installed gtest
set(CMAKE_DISABLE_FIND_PACKAGE_GTest TRUE)

FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG v1.15.2
)
# Disable gmock build to avoid compatibility issues with LLVM 20
set(BUILD_GMOCK OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

# Force fetched googletest headers to be used before system headers
include_directories(BEFORE SYSTEM
    ${googletest_SOURCE_DIR}/googletest/include
    ${googletest_SOURCE_DIR}/googlemock/include
)

include(GoogleTest)

# ----------------------------
# CONFIG TESTS
# ----------------------------
FILE(GLOB TEST_SOURCES_CONFIG "./config/*.cpp")
add_executable(genogrove_config_tests ${TEST_SOURCES_CONFIG})
target_include_directories(
        genogrove_config_tests
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/../include
        ${CMAKE_CURRENT_BINARY_DIR}/../include # important as we configure the version in the build tree
)
target_link_libraries(genogrove_config_tests gtest gtest_main)
target_compile_definitions(
        genogrove_config_tests
        PRIVATE
        EXPECTED_VERSION_MAJOR=${genogrove_VERSION_MAJOR}
        EXPECTED_VERSION_MINOR=${genogrove_VERSION_MINOR}
        EXPECTED_VERSION_PATCH=${genogrove_VERSION_PATCH}
)
set_target_properties(genogrove_config_tests PROPERTIES
    BUILD_RPATH "${HTSLIB_LIBRARY_DIRS}"
    INSTALL_RPATH "${HTSLIB_LIBRARY_DIRS}"
)
gtest_discover_tests(genogrove_config_tests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# ----------------------------
# DATA_TYPE TESTS
# ----------------------------
FILE(GLOB_RECURSE TEST_SOURCES_DATA_TYPE "./data_type/*.cpp")
add_executable(genogrove_data_type_tests ${TEST_SOURCES_DATA_TYPE})
target_include_directories(
        genogrove_data_type_tests
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/../include
)
target_link_libraries(genogrove_data_type_tests genogrove gtest gtest_main)
set_target_properties(genogrove_data_type_tests PROPERTIES
        BUILD_RPATH "${HTSLIB_LIBRARY_DIRS}"
        INSTALL_RPATH "${HTSLIB_LIBRARY_DIRS}"
)
gtest_discover_tests(genogrove_data_type_tests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# ----------------------------
# UTILITY TESTS
# ----------------------------
FILE(GLOB TEST_SOURCES_UTILITY "./utility/*.cpp")
add_executable(genogrove_utility_tests ${TEST_SOURCES_UTILITY})
target_include_directories(
        genogrove_utility_tests
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/../include
)
target_link_libraries(genogrove_utility_tests genogrove gtest gtest_main)
set_target_properties(genogrove_utility_tests PROPERTIES
        BUILD_RPATH "${HTSLIB_LIBRARY_DIRS}"
        INSTALL_RPATH "${HTSLIB_LIBRARY_DIRS}"
)
gtest_discover_tests(genogrove_utility_tests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# ----------------------------
# STRUCTURE TESTS
# ----------------------------
FILE(GLOB TEST_SOURCES_STRUCTURE "./structure/*.cpp")
add_executable(genogrove_structure_tests ${TEST_SOURCES_STRUCTURE})
target_include_directories(
        genogrove_structure_tests
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/../include
)
target_link_libraries(genogrove_structure_tests genogrove gtest gtest_main)
set_target_properties(genogrove_structure_tests PROPERTIES
        BUILD_RPATH "${HTSLIB_LIBRARY_DIRS}"
        INSTALL_RPATH "${HTSLIB_LIBRARY_DIRS}"
)
gtest_discover_tests(genogrove_structure_tests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# ----------------------------
# IO TESTS
# ----------------------------
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/io/data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/io)
FILE(GLOB TEST_SOURCES_IO "./io/*.cpp")
add_executable(genogrove_io_tests ${TEST_SOURCES_IO})
target_include_directories(
        genogrove_io_tests
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/../include
)
target_link_libraries(genogrove_io_tests genogrove gtest gtest_main)
set_target_properties(genogrove_io_tests PROPERTIES
    BUILD_RPATH "${HTSLIB_LIBRARY_DIRS}"
    INSTALL_RPATH "${HTSLIB_LIBRARY_DIRS}"
)
gtest_discover_tests(genogrove_io_tests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# ----------------------------
# CLI TESTS
# ----------------------------
if(BUILD_CLI)
    message(STATUS "Building CLI tests")
    file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cli/data DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/cli)
    FILE(GLOB TEST_SOURCES_CLI "./cli/*.cpp")
    set(CLI_HANDLER_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/../cli/src/handlers/bed.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/../cli/src/handlers/gff.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/../cli/src/handlers/links.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/../cli/src/intersect.cpp
    )
    add_executable(genogrove_cli_tests ${TEST_SOURCES_CLI} ${CLI_HANDLER_SOURCES})
    target_include_directories(
            genogrove_cli_tests
            PUBLIC
            ${CMAKE_CURRENT_SOURCE_DIR}/../include
            ${CMAKE_CURRENT_SOURCE_DIR}/../cli/include
            ${cxxopts_SOURCE_DIR}/include
    )
    target_compile_definitions(
            genogrove_cli_tests
            PRIVATE
            GENOGROVE_CLI_PATH="${CMAKE_BINARY_DIR}/bin/genogrove"
    )
    target_link_libraries(genogrove_cli_tests genogrove gtest gtest_main)
    set_target_properties(genogrove_cli_tests PROPERTIES
        BUILD_RPATH "${HTSLIB_LIBRARY_DIRS}"
        INSTALL_RPATH "${HTSLIB_LIBRARY_DIRS}"
    )
    # Ensure the CLI binary is built before running e2e tests
    add_dependencies(genogrove_cli_tests genogrove-cli)
    gtest_discover_tests(genogrove_cli_tests WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endif()
