##########################################
############## UNIT TESTING ##############
##########################################

find_package(PkgConfig REQUIRED)
pkg_check_modules(Check REQUIRED check)

set(DMR_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(DMR_TEST_SHARED_UTILS_DIR ${DMR_TEST_DIR}/shared_utils)
set(DMR_TEST_RUNNER ${DMR_TEST_DIR}/dmr_test_runner.c)

# === Shared test utilities ===
file(
GLOB
TEST_UTIL_SOURCES
CONFIGURE_DEPENDS
${DMR_TEST_SHARED_UTILS_DIR}/*.c
)
list(REMOVE_ITEM TEST_UTIL_SOURCES ${DMR_TEST_RUNNER})

add_library(unit_test_utils STATIC ${TEST_UTIL_SOURCES})

target_include_directories(
unit_test_utils
PUBLIC
    ${DMR_TEST_SHARED_UTILS_DIR}
    ${DMR_TEST_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${Check_INCLUDE_DIRS}
    ${SLURM_INCLUDE_DIR}
)

target_link_libraries(
unit_test_utils
PRIVATE
dmr
${Check_LIBRARIES}
${SLURM_LIB_DIR}/lib${SLURM_LIB_NAME}.so
m
rt
uuid
)

# === DLB linking ===
if(TALP_ENABLED)
target_include_directories(unit_test_utils PUBLIC ${DLB_INCLUDE_DIR})
target_link_libraries(
    unit_test_utils
    PRIVATE
    ${DLB_LIBRARY_DIR}/libdlb.so
)
endif()

# === Dummy MPI helper used by tests ===
add_executable(
dummy_mpi
${DMR_TEST_SHARED_UTILS_DIR}/dummy_mpi/dummy_mpi.c
)

target_include_directories(
dummy_mpi
PRIVATE
    ${DMR_TEST_SHARED_UTILS_DIR}
    ${DMR_TEST_DIR}
)

# === Individual test sources ===
file(
GLOB
TEST_SOURCES
CONFIGURE_DEPENDS
${DMR_TEST_DIR}/*.c
)
list(REMOVE_ITEM TEST_SOURCES ${DMR_TEST_RUNNER})

# === Single combined executable ===
add_executable(dmr_unit_tests ${DMR_TEST_RUNNER} ${TEST_SOURCES})

target_include_directories(
dmr_unit_tests
PRIVATE
    ${DMR_TEST_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${Check_INCLUDE_DIRS}
    ${SLURM_INCLUDE_DIR}
)

target_link_libraries(
dmr_unit_tests
PRIVATE
    unit_test_utils
    ${Check_LIBRARIES}
    ${SLURM_LIB_DIR}/lib${SLURM_LIB_NAME}.so
)

# Ensure the helper exists when building/running tests
add_dependencies(dmr_unit_tests dummy_mpi)

# Embed path to dummy MPI program to use when testing spawn-based functionality
target_compile_definitions(
dmr_unit_tests
PRIVATE
    DMR_DUMMY_MPI_EXE="$<TARGET_FILE:dummy_mpi>"
)
