list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package(Threads)
find_package(GTest REQUIRED)
find_package(GMock REQUIRED)
if(BUILD_FORTRAN_API)
  find_package(PFUNIT 4.4 REQUIRED)
  include(add_pfunit_mpmd_ctest)
endif()

include(setup_tests)

add_custom_target(tests COMMENT "Builds all tests.")
add_custom_command(
  OUTPUT requests_test.cpp
  DEPENDS ${CMAKE_SOURCE_DIR}/src/generate_requests.py ${CMAKE_SOURCE_DIR}/src/REQUESTS
  COMMAND ${Python_EXECUTABLE} ${CMAKE_SOURCE_DIR}/src/generate_requests.py
                               ${CMAKE_SOURCE_DIR}/src/REQUESTS
                               "test"
  COMMENT "Generating request test source code"
)

function(add_mcl_test target_name target_file)
  set(opt FORTRAN C)
  set(optN NPROC)
  cmake_parse_arguments(MCL_TEST "${opt}" "" "${optN}" ${ARGN})
  list(LENGTH MCL_TEST_NPROC num_program)
    
  if(MCL_TEST_FORTRAN)
    setup_pfunit_test(${target_name} ${target_file})
  elseif(MCL_TEST_C)
    setup_c_test(${target_name} ${target_file})
  else()
    setup_gtest_test(${target_name} ${target_file})
  endif()

  if(${num_program} MATCHES "3")
    run_mpmd(${target_name} ${MCL_TEST_NPROC})
  elseif(${num_program} MATCHES "1")
    run_mpi(${target_name} ${MCL_TEST_NPROC})
  else()
    run_single(${target_name})
  endif()

  add_dependencies (tests ${target_name})
endfunction()

# unit
add_mcl_test(env_controls env_controls_test.cpp)
add_mcl_test(error_print error_print_test.cpp)
add_mcl_test(transfer_logger transfer_logger_test.cpp)
add_mcl_test(endpoint endpoints_test.cpp)
add_mcl_test(main_class main_class_test.cpp)
add_mcl_test(mpi_mpmd_transport
  mpi_mpmd_transport_test.cpp
  NPROC 3 2 2
)
add_mcl_test(mpi_port_transport
  mpi_port_transport_test.cpp
  NPROC 7
)
add_mcl_test(stub_transport
  stub_transport_test.cpp
  NPROC 3
)
add_mcl_test(requests ${CMAKE_CURRENT_BINARY_DIR}/requests_test.cpp)

# integration
add_mcl_test(api_cpp
  api_cpp_test.cpp
  NPROC 3 2 2
)
add_mcl_test(api_c
  api_c_test.c
  NPROC 3 2 2
  C
)

if(BUILD_FORTRAN_API)
  add_pfunit_mpmd_ctest(
    api_fortran
    TEST_SOURCES api_fortran_test.pf
    LINK_LIBRARIES mclf mcl stdc++
    MAX_PES 2
  )
  set_target_properties(
    api_fortran
    PROPERTIES
    LINKER_LANGUAGE Fortran
  )
endif()
