TRIBITS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})


# test
SET(Intrepid2_TEST_ETI_FILE "test_01")

# value types
SET(Intrepid2_TEST_ETI_VALUETYPE_NAME "")
SET(Intrepid2_TEST_ETI_VALUETYPE "")
SET(Intrepid2_TEST_ETI_SACADO "")

LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "DOUBLE_DOUBLE")
LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "double,double")
LIST(APPEND Intrepid2_TEST_ETI_SACADO         "0")

# 
# 0 - no fad, 1 - sfad, 2 - slfad, 3 - dfad 
#
IF (HAVE_INTREPID2_SACADO) 
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "SFAD_SFAD")
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "Sacado::Fad::SFad<double,10>,Sacado::Fad::SFad<double,10> ")
  LIST(APPEND Intrepid2_TEST_ETI_SACADO         "11")

  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "DFAD_DFAD")
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "Sacado::Fad::DFad<double>,Sacado::Fad::DFad<double> ")
  LIST(APPEND Intrepid2_TEST_ETI_SACADO         "33")

  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "SLFAD_DFAD")
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "Sacado::Fad::SLFad<double,10>,Sacado::Fad::DFad<double> ")
  LIST(APPEND Intrepid2_TEST_ETI_SACADO         "23")

  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "SLFAD_DOUBLE")
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "Sacado::Fad::SLFad<double,10>,double ")
  LIST(APPEND Intrepid2_TEST_ETI_SACADO         "20")
ENDIF()

LIST(LENGTH Intrepid2_TEST_ETI_VALUETYPE_NAME ETI_VALUETYPE_COUNT)
MATH(EXPR ETI_VALUETYPE_COUNT "${ETI_VALUETYPE_COUNT}-1")

# device
SET(Intrepid2_TEST_ETI_DEVICE_NAME "")
SET(Intrepid2_TEST_ETI_DEVICE "")
IF(Kokkos_ENABLE_SERIAL)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "Serial")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::Serial,Kokkos::HostSpace>")
ENDIF()
IF(Kokkos_ENABLE_OPENMP)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "OpenMP")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::OpenMP,Kokkos::HostSpace>")
ENDIF()
IF(Kokkos_ENABLE_CUDA)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "CUDA")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::Cuda,Kokkos::CudaSpace>")
ENDIF()
IF(Kokkos_ENABLE_HIP)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "HIP")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::HIP,Kokkos::HIPSpace>")
ENDIF()

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

FOREACH(I RANGE ${ETI_DEVICE_COUNT})
  LIST(GET Intrepid2_TEST_ETI_DEVICE_NAME ${I} ETI_DEVICE_NAME)
  LIST(GET Intrepid2_TEST_ETI_DEVICE      ${I} ETI_DEVICE)
  #MESSAGE(STATUS "Generating TEST HGRAD_HEX_Cn_FEM for ${ETI_DEVICE_NAME} with ${ETI_DEVICE}")
  FOREACH(J RANGE ${ETI_VALUETYPE_COUNT})
    LIST(GET Intrepid2_TEST_ETI_VALUETYPE_NAME ${J} ETI_VALUETYPE_NAME)
    LIST(GET Intrepid2_TEST_ETI_VALUETYPE      ${J} ETI_VALUETYPE)
    LIST(GET Intrepid2_TEST_ETI_SACADO         ${J} ETI_SACADO)
    FOREACH(ETI_FILE IN LISTS Intrepid2_TEST_ETI_FILE)
      SET(ETI_NAME "${ETI_FILE}_${ETI_DEVICE_NAME}_${ETI_VALUETYPE_NAME}")
      MESSAGE(STATUS "Generating TEST: HGRAD_HEX_Cn_FEM ${ETI_NAME}.cpp")
      CONFIGURE_FILE(eti/${ETI_FILE}_ETI.in ${ETI_NAME}.cpp)

      TRIBITS_ADD_EXECUTABLE_AND_TEST(
        ${ETI_NAME}
        SOURCES ${ETI_NAME}.cpp 
        ARGS PrintItAll
        NUM_MPI_PROCS 1
        PASS_REGULAR_EXPRESSION "TEST PASSED"
        ADD_DIR_TO_NAME
      )

    ENDFOREACH()
  ENDFOREACH()
ENDFOREACH()




# test
SET(Intrepid2_TEST_ETI_FILE "test_02")

# value types
SET(Intrepid2_TEST_ETI_VALUETYPE_NAME "")
SET(Intrepid2_TEST_ETI_VALUETYPE "")
SET(Intrepid2_TEST_ETI_SACADO "")

LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "DOUBLE_DOUBLE")
LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "double,double")
LIST(APPEND Intrepid2_TEST_ETI_SACADO         "0")

IF (HAVE_INTREPID2_SACADO) 
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE_NAME "DFAD_DFAD")
  LIST(APPEND Intrepid2_TEST_ETI_VALUETYPE      "Sacado::Fad::DFad<double>,Sacado::Fad::DFad<double> ")
  LIST(APPEND Intrepid2_TEST_ETI_SACADO         "33")
ENDIF()

LIST(LENGTH Intrepid2_TEST_ETI_VALUETYPE_NAME ETI_VALUETYPE_COUNT)
MATH(EXPR ETI_VALUETYPE_COUNT "${ETI_VALUETYPE_COUNT}-1")

# device
SET(Intrepid2_TEST_ETI_DEVICE_NAME "")
SET(Intrepid2_TEST_ETI_DEVICE "")
IF(Kokkos_ENABLE_SERIAL)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "Serial")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::Serial,Kokkos::HostSpace>")
ENDIF()
IF(Kokkos_ENABLE_OPENMP)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "OpenMP")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::OpenMP,Kokkos::HostSpace>")
ENDIF()
IF(Kokkos_ENABLE_CUDA)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "CUDA")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::Cuda,Kokkos::CudaSpace>")
ENDIF()
IF(Kokkos_ENABLE_HIP)
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE_NAME "HIP")
  LIST(APPEND Intrepid2_TEST_ETI_DEVICE      "Kokkos::Device<Kokkos::HIP,Kokkos::HIPSpace>")
ENDIF()

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

FOREACH(I RANGE ${ETI_DEVICE_COUNT})
  LIST(GET Intrepid2_TEST_ETI_DEVICE_NAME ${I} ETI_DEVICE_NAME)
  LIST(GET Intrepid2_TEST_ETI_DEVICE      ${I} ETI_DEVICE)
  #MESSAGE(STATUS "Generating TEST HGRAD_HEX_Cn_FEM for ${ETI_DEVICE_NAME} with ${ETI_DEVICE}")
  FOREACH(J RANGE ${ETI_VALUETYPE_COUNT})
    LIST(GET Intrepid2_TEST_ETI_VALUETYPE_NAME ${J} ETI_VALUETYPE_NAME)
    LIST(GET Intrepid2_TEST_ETI_VALUETYPE      ${J} ETI_VALUETYPE)
    LIST(GET Intrepid2_TEST_ETI_SACADO         ${J} ETI_SACADO)
    FOREACH(ETI_FILE IN LISTS Intrepid2_TEST_ETI_FILE)
      SET(ETI_NAME "${ETI_FILE}_${ETI_DEVICE_NAME}_${ETI_VALUETYPE_NAME}")

      IF(${ETI_NAME} STREQUAL "test_02_CUDA_DOUBLE_DOUBLE")
        IF(${CUDAToolkit_VERSION_MAJOR} LESS "12")
          MESSAGE(STATUS "Skipping TEST: HGRAD_HEX_Cn_FEM ${ETI_NAME}.cpp for CUDA <12 (known compile issue)")
          CONTINUE()
        ENDIF()
      ENDIF()

      MESSAGE(STATUS "Generating TEST: HGRAD_HEX_Cn_FEM ${ETI_NAME}.cpp")
      CONFIGURE_FILE(eti/${ETI_FILE}_ETI.in ${ETI_NAME}.cpp)

      TRIBITS_ADD_EXECUTABLE_AND_TEST(
        ${ETI_NAME}
        SOURCES ${ETI_NAME}.cpp 
        ARGS PrintItAll
        NUM_MPI_PROCS 1
        PASS_REGULAR_EXPRESSION "TEST PASSED"
        ADD_DIR_TO_NAME
      )

    ENDFOREACH()
  ENDFOREACH()
ENDFOREACH()


TRIBITS_COPY_FILES_TO_BINARY_DIR(HGRAD_HEX_CnTestDataCopy
  SOURCE_FILES
    HEX_C2_D2Vals.dat
    HEX_C2_D3Vals.dat
    HEX_C2_D4Vals.dat
    HEX_C2_GradVals.dat
  SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/testdata"
  DEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/testdata"
)

