find_package(MPI 2.0 REQUIRED)
find_package(OpenMP 3.0 REQUIRED)

if(SIONlib_SIONfwd)
  set(SIONfwd_TESTS
    sfwd___1
    sfwd___2
  )
endif()
if(SIONlib_IME_NATIVE)
  set(IME_NATIVE_TESTS
    simple_3
    simple_4
  )
endif()

if(TARGET SIONlib::mpi_mt)
  set(MPI_TESTS
    param__1
    simple_2
    get_info
    seek___1
    multi__2
    buffer_1
    coll___1
    hints__1
    reinit_1
    mapped_1
    keyval_1
    keyval_2
    ${SIONfwd_TESTS}
    ${IME_NATIVE_TESTS}
  )

  set(MPI_GENERIC_TESTS
    genapi_1
    genapi_2
    genapi_3
    genapi_4
  )

  set(MPI_SERIAL_TESTS
    simple_1
    multi__1
    multi__3
    buddy__1
    buddy__2
    fitest_1
    fitest_2
  )
endif()

if(TARGET SIONlib::omp_mt)
  set(OPENMP_TESTS
    omp____1
    lock___1
    ompcol_1
  )
endif()

if(TARGET SIONlib::ompi_mt)
  set(HYBRID_TESTS
    ompi___1
    ompicol1
    ompicol2
    ompimrg1
  )
endif()

foreach(test IN LISTS MPI_TESTS MPI_GENERIC_TESTS MPI_SERIAL_TESTS OPENMP_TESTS HYBRID_TESTS)
  add_executable(test_parallel_${test}
    test_${test}.c
  )
  set_target_properties(test_parallel_${test} PROPERTIES
    OUTPUT_NAME test_${test}
  )
  add_custom_target(copy_test_parallel_${test}_aux ALL
    COMMAND ${CMAKE_COMMAND} -E copy
      ${CMAKE_CURRENT_SOURCE_DIR}/test_${test}.run.sh
      ${CMAKE_CURRENT_BINARY_DIR}/test_${test}.run.sh
    COMMAND ${CMAKE_COMMAND} -E copy
      ${CMAKE_CURRENT_SOURCE_DIR}/test_${test}_stdout_0.log
      ${CMAKE_CURRENT_BINARY_DIR}/test_${test}_stdout_0.log
    COMMAND ${CMAKE_COMMAND} -E copy
      ${CMAKE_CURRENT_SOURCE_DIR}/test_${test}_stderr_0.log
      ${CMAKE_CURRENT_BINARY_DIR}/test_${test}_stderr_0.log
  )
  add_test(NAME test_parallel_${test}
    COMMAND test_${test}.run.sh
  )
endforeach()

foreach(test IN LISTS MPI_TESTS)
  target_link_libraries(test_parallel_${test}
    PRIVATE
    MPI::MPI_C
    SIONlib::mpi_mt
  )
endforeach()

foreach(test IN LISTS MPI_GENERIC_TESTS)
  target_link_libraries(test_parallel_${test}
    PRIVATE
    MPI::MPI_C
    SIONlib::generic_mt
  )
endforeach()

foreach(test IN LISTS MPI_SERIAL_TESTS)
  target_link_libraries(test_parallel_${test}
    PRIVATE
    MPI::MPI_C
    SIONlib::serial_mt
    SIONlib::mpi_mt
  )
endforeach()

foreach(test IN LISTS OPENMP_TESTS)
  target_link_libraries(test_parallel_${test}
    PRIVATE
    OpenMP::OpenMP_C
    SIONlib::omp_mt
  )
endforeach()

foreach(test IN LISTS HYBRID_TESTS)
  target_link_libraries(test_parallel_${test}
    PRIVATE
    MPI::MPI_C
    OpenMP::OpenMP_C
    SIONlib::ompi_mt
  )
endforeach()

configure_file(
  mpirun.defs.in
  mpirun.defs
  @ONLY
)

add_custom_target(copy_aux_test_parallel ALL
  COMMAND ${CMAKE_COMMAND} -E copy
    $<TARGET_FILE:SIONlib::dump>
    ${CMAKE_CURRENT_BINARY_DIR}/siondump
  COMMAND ${CMAKE_COMMAND} -E copy
    ${CMAKE_CURRENT_SOURCE_DIR}/test_parallel.sh
    ${CMAKE_CURRENT_BINARY_DIR}/test_parallel.sh
)
