option(ENABLE_REGRESSION_TESTING "Build and copy regression testing stuff" OFF)
add_feature_info(ENABLE_REGRESSION_TESTING ENABLE_REGRESSION_TESTING "Enable regression tests")
if(ENABLE_REGRESSION_TESTING)
  if(NOT BUILD_TESTING)
    message(FATAL_ERROR "ENABLE_REGRESSION_TESTING needs BUILD_TESTING to be on")
  endif()
  option(ENABLE_EXPERIMENTAL_TESTS "Run more unstable regression tests as well" OFF)
  add_feature_info(ENABLE_EXPERIMENTAL_TESTS ENABLE_EXPERIMENTAL_TESTS "Enable experimental regression tests")
  find_package(LMP)
  set_package_properties(LMP PROPERTIES TYPE OPTIONAL PURPOSE "Lammps binary needed to run lammps regression tests")
  find_package(MDRUN_MPI)
  set_package_properties(MDRUN_MPI PROPERTIES TYPE OPTIONAL PURPOSE "gromacs mpi binary needed to run parallel gromacs regression tests")
  if(MDRUN_MPI_FOUND)
    find_package(MPI)
    set_package_properties(MPI PROPERTIES TYPE OPTIONAL PURPOSE "mpiexec binary needed to run parallel gromacs regression tests")
    set(NPROCS 4 CACHE STRING "# processes for testing")
    if(DEFINED MPIEXEC_MAX_NUMPROCS AND NPROCS GREATER MPIEXEC_MAX_NUMPROCS)
       message(WARNING "NPROCS(${NPROCS}) bigger than MPIEXEC_MAX_NUMPROCS(${MPIEXEC_MAX_NUMPROCS}) appending '--oversubscribe'")
       set(MPIEXEC_PREFLAGS "${MPIEXEC_PREFLAGS} --oversubscribe")
    endif()
  endif()
  find_package(ESPRESSO)
  set_package_properties(ESPRESSO PROPERTIES TYPE OPTIONAL PURPOSE "ESPResSo MD python module needed to run ESPResSo MD regression tests")
  find_package(ESPRESSOPP)
  set_package_properties(ESPRESSOPP PROPERTIES TYPE OPTIONAL PURPOSE "ESPResSo++ MD python module needed to run ESPResSo++ MD regression tests")
  find_package(CMA)
  set_package_properties(CMA PROPERTIES TYPE OPTIONAL PURPOSE "CMA python module needed to run CMA regression tests")
  find_package(Gnuplot)
  set_package_properties(Gnuplot PROPERTIES TYPE OPTIONAL PURPOSE "gnuplot needed to run CMA/simplex regression tests")
  # all gmx test use tabulated interactions, which is only supported in
  # gmx-2019
  if(GROMACS_FOUND AND DEFINED GROMACS_VERSION AND GROMACS_VERSION VERSION_GREATER_EQUAL "2020")
    unset(GROMACS_FOUND)
  endif()
  get_target_property(VOTCA_PATH VOTCA::csg_call VOTCA_PATH)
  # GROMACS_PATH is used with BUILD_OWN_GROMACS, to have binaries during
  # compile time
  if(TARGET Gromacs::libgromacs)
    get_target_property(GROMACS_PATH Gromacs::libgromacs GROMACS_PATH)
    if(GROMACS_PATH)
      set(VOTCA_PATH "${VOTCA_PATH}:${GROMACS_PATH}")
    endif()
  endif()
  get_target_property(VOTCA_SHARE VOTCA::csg_call VOTCASHARE)
  get_target_property(VOTCA_CSG_DEFAULTS VOTCA::csg_inverse VOTCA_CSG_DEFAULTS)
  file(GLOB_RECURSE FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} settings.xml)
  foreach(DIR ${FILES})
    if(DIR MATCHES "(dlpoly|hoomd|atomistic|single_chain)")
      continue()
    elseif(DIR MATCHES "gromacs-(multi|remd)")
      if(NOT MDRUN_MPI_FOUND OR NOT MPIEXEC OR NOT GROMACS_FOUND)
        continue()
      endif()
    elseif(DIR MATCHES "lammps")
      if(NOT LMP_FOUND)
        continue()
      elseif(DIR MATCHES "realtime" AND NOT Gnuplot_FOUND)
        continue()
      endif()
    elseif(DIR MATCHES "espresso/")
      if(NOT ESPRESSO_FOUND)
        continue()
      endif()
    elseif(DIR MATCHES "espressopp/")
      if(NOT ESPRESSOPP_FOUND)
        continue()
      endif()
    elseif(DIR MATCHES "cma/")
      if(NOT CMA_FOUND OR NOT Gnuplot_FOUND OR NOT GROMACS_FOUND)
        continue()
      endif()
    elseif(DIR MATCHES "(simplex|realtime)")
      if(NOT Gnuplot_FOUND OR NOT GROMACS_FOUND)
        continue()
      endif()
    elseif(DIR MATCHES "some/broken/test")
      if(NOT ENABLE_EXPERIMENTAL_TESTS)
        continue()
      endif()
    elseif(NOT GROMACS_FOUND)
      continue()
    endif()
    string(REGEX MATCH ^.*/ DIR ${DIR})
    list(APPEND DIRS ${DIR})
  endforeach(DIR)
  list(REMOVE_DUPLICATES DIRS)
  foreach(DIR ${DIRS})
    if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
      file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${DIR})
      # not recursive to avoid copying in-place step_* dir
      file(GLOB FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${DIR}/*)
      foreach(FILE ${FILES})
        if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${FILE})
          continue()
        endif()
        execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} ${CMAKE_CURRENT_BINARY_DIR}/${FILE})
      endforeach(FILE ${FILES})
    endif (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
    string(REGEX REPLACE "/$" "" DIR "${DIR}")
    string(REPLACE / _ TESTNAME "regression_${DIR}")
    add_test(NAME ${TESTNAME} COMMAND $<TARGET_FILE:VOTCA::csg_inverse> --options settings.xml --do-iterations 1 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${DIR})
    set(CSG_MDRUN_STEPS 500)
    if(DIR MATCHES "/imc($|_)")
      set(CSG_MDRUN_STEPS 5000)
    elseif(DIR MATCHES "spec/cma/simple")
      set(CSG_MDRUN_STEPS 10000)
    elseif(DIR MATCHES "/cma/")
      set(CSG_MDRUN_STEPS 7500)
    elseif(DIR MATCHES "/(re|simplex)($|_)")
      set(CSG_MDRUN_STEPS 2500)
    endif()
    if(DIR MATCHES "gromacs-(multi|remd)")
      set_property(TEST ${TESTNAME} PROPERTY ENVIRONMENT
        "CSG_RUNTEST=yes;VOTCASHARE=${VOTCA_SHARE};CSG_MDRUN_STEPS=${CSG_MDRUN_STEPS};PATH=${VOTCA_PATH}:$ENV{PATH};VOTCA_CSG_DEFAULTS=${VOTCA_CSG_DEFAULTS}"
        "CSG_MDRUN_CMD=${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${NPROCS} ${MPIEXEC_PREFLAGS} ${MDRUN_MPI_EXECUTABLE} ${MPIEXEC_POSTFLAGS}")
    else()
      set_property(TEST ${TESTNAME} PROPERTY ENVIRONMENT "CSG_RUNTEST=yes;VOTCASHARE=${VOTCA_SHARE};CSG_MDRUN_STEPS=${CSG_MDRUN_STEPS};PATH=${VOTCA_PATH}:$ENV{PATH};VOTCA_CSG_DEFAULTS=${VOTCA_CSG_DEFAULTS}")
    endif()
  endforeach(DIR ${DIRS})
  message(STATUS "Use VOTCASHARE=${VOTCA_SHARE} PATH=${VOTCA_PATH}:\$PATH VOTCA_CSG_DEFAULTS=${VOTCA_CSG_DEFAULTS} for out-of-cmake testing")
endif()

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${CMAKE_INSTALL_DATADIR}/votca/csg-tutorials USE_SOURCE_PERMISSIONS
	PATTERN ".git*" EXCLUDE PATTERN "step_*" EXCLUDE
	PATTERN "CMake*" EXCLUDE PATTERN "cmake_install.cmake" EXCLUDE
	PATTERN "install_manifest.txt" EXCLUDE PATTERN "*~" EXCLUDE
	PATTERN "inverse.log" EXCLUDE)
