TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})

TRIBITS_COPY_FILES_TO_BINARY_DIR(
        Tacho_UnitTest_SparseMatrixFile
        SOURCE_FILES test_double.mtx test_dcomplex.mtx
        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
        DEST_DIR ${CMAKE_CURRENT_BINARY_DIR}
)

#
# gtest library
#

# Set some variables controlling the internal googletest package
SET(INSTALL_GTEST OFF CACHE BOOL "Install GTest")

TRIBITS_INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/googletest")
TRIBITS_INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/googletest/include")

TRIBITS_ADD_LIBRARY(
  tacho-gtest
  SOURCES googletest/src/gtest-all.cc
  TESTONLY
  NO_INSTALL_LIB_OR_HEADERS
)

TRIBITS_ADD_EXECUTABLE_AND_TEST(
  Tacho_Test_Util.x
  NOEXESUFFIX
  NOEXEPREFIX
  SOURCES Tacho_TestUtil.cpp
  TESTONLYLIBS tacho-gtest
  ARGS PrintItAll
  NUM_MPI_PROCS 1
  FAIL_REGULAR_EXPRESSION "  FAILED  "
)

SET(TACHO_ETI_FILE "Tacho_Test")
SET(TACHO_ETI_DEVICE_NAME "")
SET(TACHO_ETI_DEVICE_TYPE "")
SET(TACHO_ETI_WITH_TASK "")

IF (Kokkos_ENABLE_SERIAL)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "Serial")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::Serial,Kokkos::HostSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()
IF (Kokkos_ENABLE_OPENMP)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "OpenMP")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::OpenMP,Kokkos::HostSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "1")
ENDIF()
IF (Kokkos_ENABLE_CUDA)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "CUDA")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::Cuda,Kokkos::CudaSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()
IF (Kokkos_ENABLE_HIP)
  LIST(APPEND TACHO_ETI_DEVICE_NAME "HIP")
  LIST(APPEND TACHO_ETI_DEVICE_TYPE "Kokkos::Device<Kokkos::Experimental::HIP,Kokkos::Experimental::HIPSpace>")
  LIST(APPEND TACHO_ETI_WITH_TASK "0")
ENDIF()

LIST(LENGTH TACHO_ETI_DEVICE_NAME ETI_DEVICE_COUNT)
MATH(EXPR ETI_DEVICE_COUNT "${ETI_DEVICE_COUNT}-1")

SET(TACHO_ETI_VALUE_NAME "")
SET(TACHO_ETI_VALUE_TYPE "")

LIST(APPEND TACHO_ETI_VALUE_NAME "double")
LIST(APPEND TACHO_ETI_VALUE_TYPE "double")

LIST(APPEND TACHO_ETI_VALUE_NAME "float")
LIST(APPEND TACHO_ETI_VALUE_TYPE "float")

LIST(APPEND TACHO_ETI_VALUE_NAME "complex_double")
LIST(APPEND TACHO_ETI_VALUE_TYPE "Kokkos::complex<double>")

LIST(APPEND TACHO_ETI_VALUE_NAME "complex_float")
LIST(APPEND TACHO_ETI_VALUE_TYPE "Kokkos::complex<float>")

LIST(LENGTH TACHO_ETI_VALUE_NAME ETI_VALUE_COUNT)
MATH(EXPR ETI_VALUE_COUNT "${ETI_VALUE_COUNT}-1")

FOREACH(I RANGE ${ETI_DEVICE_COUNT})
  LIST(GET TACHO_ETI_DEVICE_NAME ${I} ETI_DEVICE_NAME)
  LIST(GET TACHO_ETI_DEVICE_TYPE ${I} ETI_DEVICE_TYPE)
  LIST(GET TACHO_ETI_WITH_TASK   ${I} ETI_WITH_TASK)

  FOREACH(J RANGE ${ETI_VALUE_COUNT})
    LIST(GET TACHO_ETI_VALUE_NAME ${J} ETI_VALUE_NAME)
    LIST(GET TACHO_ETI_VALUE_TYPE ${J} ETI_VALUE_TYPE)

    FOREACH(ETI_FILE IN LISTS TACHO_ETI_FILE)
      SET(ETI_NAME "${ETI_FILE}_ETI_${ETI_VALUE_NAME}_${ETI_DEVICE_NAME}")
      MESSAGE(STATUS "Generating ETI: ${ETI_NAME}.cpp")
      CONFIGURE_FILE(eti/${ETI_FILE}_ETI.in eti/${ETI_NAME}.cpp)

    TRIBITS_ADD_EXECUTABLE_AND_TEST(
      ${ETI_NAME}.x
      NOEXESUFFIX
      NOEXEPREFIX
      SOURCES eti/${ETI_NAME}.cpp
      TESTONLYLIBS tacho-gtest
      ARGS PrintItAll
      NUM_MPI_PROCS 1
      FAIL_REGULAR_EXPRESSION "  FAILED  "
    )
    ENDFOREACH()
  ENDFOREACH()
ENDFOREACH()
