if(BUILD_TESTING)
    enable_testing()

    # find python3 for test suite
    find_package(Python3 COMPONENTS Interpreter)
    if(Python3_FOUND)
        message(STATUS "Found Python3 for testing: ${Python3_EXECUTABLE}")
    endif()

    # find numdiff for test suite
    if(WITH_NUMDIFF)
        find_program(NUMDIFF_EXECUTABLE numdiff
                     DOC "Path to the numdiff program for use in the test suite.")
        if(NUMDIFF_EXECUTABLE)
            message(STATUS "Found numdiff: ${NUMDIFF_EXECUTABLE}")
        else()
            message(FATAL_ERROR "Numdiff requested but not found!")
        endif()
    else()
        unset(NUMDIFF_EXECUTABLE CACHE)
    endif()
endif()

# -------------------------------------------------------------------------------------------------------#
# Helper macro for addition of tests                                                                     #
# -------------------------------------------------------------------------------------------------------#

macro(ukrmolout_add_test testname)
    if(NOT "-Dusempi" IN_LIST GBTOlib_Fortran_FLAGS)
        # add serial test for not MPI-enabled executables
        add_test(NAME "ukrmolout_${testname}_serial"
                 COMMAND cmake -D "SWINTERF_PROGRAM=$<TARGET_FILE:swinterf>"
                               -D "RSOLVE_PROGRAM=$<TARGET_FILE:rsolve>"
                               -D "EIGENP_PROGRAM=$<TARGET_FILE:eigenp>"
                               -D "TMATRX_PROGRAM=$<TARGET_FILE:tmatrx>"
                               -D "IXSECS_PROGRAM=$<TARGET_FILE:ixsecs>"
                               -D "RESON_PROGRAM=$<TARGET_FILE:reson>"
                               -D "RMT_INTERFACE_PROGRAM=$<TARGET_FILE:rmt_interface>"
                               -D "DIPELM_PROGRAM=$<TARGET_FILE:dipelm>"
                               -D "PYTHON_EXECUTABLE=${Python3_EXECUTABLE}"
                               -D "NUMDIFF_EXECUTABLE=${NUMDIFF_EXECUTABLE}"
                               -D "PROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}"
                               -D "UKRmolOut_TEST_SRC=${CMAKE_CURRENT_LIST_DIR}/${testname}"
                               -D "UKRmolOut_TEST_TGT=${CMAKE_BINARY_DIR}/Testing/${testname}_serial"
                               -P "${CMAKE_CURRENT_LIST_DIR}/TestDriver.cmake")
        set_property(TEST "ukrmolout_${testname}_serial"
                     APPEND PROPERTY DEPENDS "ukrmolin_${testname}_serial")
    else()
        # add serial & parallel test for MPI-enabled executables
        add_test(NAME "ukrmolout_${testname}_serial"
                 COMMAND cmake -D "SWINTERF_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:swinterf>;${MPIEXEC_POSTFLAGS}"
                               -D "RSOLVE_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:rsolve>;${MPIEXEC_POSTFLAGS}"
                               -D "EIGENP_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:eigenp>;${MPIEXEC_POSTFLAGS}"
                               -D "TMATRX_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:tmatrx>;${MPIEXEC_POSTFLAGS}"
                               -D "IXSECS_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:ixsecs>;${MPIEXEC_POSTFLAGS}"
                               -D "RESON_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:reson>;${MPIEXEC_POSTFLAGS}"
                               -D "RMT_INTERFACE_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:rmt_interface>;${MPIEXEC_POSTFLAGS}"
                               -D "DIPELM_PROGRAM=$<TARGET_FILE:dipelm>"
                               -D "PYTHON_EXECUTABLE=${Python3_EXECUTABLE}"
                               -D "NUMDIFF_EXECUTABLE=${NUMDIFF_EXECUTABLE}"
                               -D "PROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}"
                               -D "UKRmolOut_TEST_SRC=${CMAKE_CURRENT_LIST_DIR}/${testname}"
                               -D "UKRmolOut_TEST_TGT=${CMAKE_BINARY_DIR}/Testing/${testname}_serial"
                               -P "${CMAKE_CURRENT_LIST_DIR}/TestDriver.cmake")
        add_test(NAME "ukrmolout_${testname}_parallel"
                 COMMAND cmake -D "SWINTERF_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:swinterf>;${MPIEXEC_POSTFLAGS}"
                               -D "RSOLVE_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};2;${MPIEXEC_PREFLAGS};$<TARGET_FILE:mpi_rsolve>;${MPIEXEC_POSTFLAGS}"
                               -D "EIGENP_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:eigenp>;${MPIEXEC_POSTFLAGS}"
                               -D "TMATRX_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:tmatrx>;${MPIEXEC_POSTFLAGS}"
                               -D "IXSECS_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:ixsecs>;${MPIEXEC_POSTFLAGS}"
                               -D "RESON_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:reson>;${MPIEXEC_POSTFLAGS}"
                               -D "RMT_INTERFACE_PROGRAM=${MPIEXEC_EXECUTABLE};${MPIEXEC_NUMPROC_FLAG};1;${MPIEXEC_PREFLAGS};$<TARGET_FILE:rmt_interface>;${MPIEXEC_POSTFLAGS}"
                               -D "DIPELM_PROGRAM=$<TARGET_FILE:dipelm>"
                               -D "PYTHON_EXECUTABLE=${Python3_EXECUTABLE}"
                               -D "NUMDIFF_EXECUTABLE=${NUMDIFF_EXECUTABLE}"
                               -D "PROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR}"
                               -D "UKRmolOut_TEST_SRC=${CMAKE_CURRENT_LIST_DIR}/${testname}"
                               -D "UKRmolOut_TEST_TGT=${CMAKE_BINARY_DIR}/Testing/${testname}_parallel"
                               -P "${CMAKE_CURRENT_LIST_DIR}/TestDriver.cmake")
        set_property(TEST "ukrmolout_${testname}_parallel"
                     APPEND PROPERTY DEPENDS "ukrmolin_${testname}_parallel")
    endif()
endmacro()

# -------------------------------------------------------------------------------------------------------#
# Basic scattering test suite                                                                            #
# -------------------------------------------------------------------------------------------------------#

foreach(group C1 Cs Ci C2 C2v C2h D2h)
    foreach(model SEP CC)
        ukrmolout_add_test(${group}_scattering_${model})
    endforeach()
endforeach()

# -------------------------------------------------------------------------------------------------------#
# Additional feature tests                                                                               #
# -------------------------------------------------------------------------------------------------------#

ukrmolout_add_test(C2v_scattering_PCCHF_A)
ukrmolout_add_test(C2v_scattering_PCCHF_B)
ukrmolout_add_test(C2v_photoionization_PCCHF_A)
ukrmolout_add_test(C2v_photoionization_PCCHF_B)
ukrmolout_add_test(C2v_photoionization_CC_GTO)
ukrmolout_add_test(C2v_photoionization_CC_Mixed)
ukrmolout_add_test(D2h_photoionization_CC)
ukrmolout_add_test(D2h_photoionization_CC_atomic)
ukrmolout_add_test(D2h_rmt_data_CC)
ukrmolout_add_test(D2h_scattering_ECP)
ukrmolout_add_test(D2h_scattering_ECP_atomic_BTO)
ukrmolout_add_test(D2h_scattering_Positron)
ukrmolout_add_test(D2h_scattering_Positron_PCO)
ukrmolout_add_test(C2v_scattering_PCO)
