
KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR})

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/blas)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/blas)

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/sparse)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/sparse)

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/graph)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/graph)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/batched)
INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/batched)

KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/../test_common)
KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/../test_common)

# Kyungjoo: when kokkoskernels and kokkos are symbolic link and their src directories are overrided
#           the following relative path does not work or users should put kokkoskernels and kokkos
#           at the same place
SET(GTEST_SOURCE_DIR ${PACKAGE_SOURCE_DIR}/tpls/gtest)

KOKKOSKERNELS_ADD_TEST_LIBRARY(
  kokkoskernels_gtest
  HEADERS ${GTEST_SOURCE_DIR}/gtest/gtest.h
  SOURCES ${GTEST_SOURCE_DIR}/gtest/gtest-all.cc
  )
# Disables pthreads, this is a problem for serial builds in Trilinos & Sierra if it's enabled.
TARGET_COMPILE_DEFINITIONS(kokkoskernels_gtest PUBLIC "-DGTEST_HAS_PTHREAD=0")
TARGET_INCLUDE_DIRECTORIES(kokkoskernels_gtest PUBLIC $<BUILD_INTERFACE:${GTEST_SOURCE_DIR}>)

#Gtest minimally requires C++11
TARGET_COMPILE_FEATURES(kokkoskernels_gtest PUBLIC cxx_std_11)

IF (KOKKOS_ENABLE_CUDA)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/cuda)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/cuda)

  APPEND_GLOB(CUDA_BLAS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Blas*.cpp)
  KOKKOSKERNELS_ADD_UNIT_TEST(
    blas_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_BLAS_SOURCES}
    COMPONENTS blas
    )

  APPEND_GLOB(CUDA_BATCHED_DLA_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Batched*.cpp)
  KOKKOSKERNELS_ADD_UNIT_TEST(
    batched_dla_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_BATCHED_DLA_SOURCES}
    COMPONENTS batched
    )
    
  APPEND_GLOB(CUDA_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Sparse*.cpp)
  IF (NOT KOKKOS_ENABLE_CUDA_UVM)
    LIST(REMOVE_ITEM CUDA_SPARSE_SOURCES
      "${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Sparse_findRelOffset.cpp")
    LIST(REMOVE_ITEM CUDA_SPARSE_SOURCES
      "${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Sparse_trsv.cpp")
  ENDIF()
  IF (NOT KOKKOSKERNELS_ENABLE_TPL_CUSPARSE)
    LIST(REMOVE_ITEM CUDA_SPARSE_SOURCES
         "${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Sparse_Utils_cusparse.cpp")
  ENDIF()

  KOKKOSKERNELS_ADD_UNIT_TEST(
    sparse_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_SPARSE_SOURCES}
    COMPONENTS sparse
  )
  
  APPEND_GLOB(CUDA_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Graph*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    graph_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_GRAPH_SOURCES}
    COMPONENTS graph
  )
  
  #currently float 128 test is not working. So common tests are explicitly added.  
  APPEND_GLOB(CUDA_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Common*.cpp)
  

  KOKKOSKERNELS_ADD_UNIT_TEST(
    common_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_COMMON_SOURCES}
  )
ENDIF ()

IF (KOKKOS_ENABLE_HIP)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/hip)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/hip)

  APPEND_GLOB(HIP_BLAS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Blas*.cpp)
  KOKKOSKERNELS_ADD_UNIT_TEST(
    blas_hip
    SOURCES
      Test_Main.cpp
      ${HIP_BLAS_SOURCES}
    COMPONENTS blas
    )

  # APPEND_GLOB(HIP_BATCHED_DLA_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Batched*.cpp)
  # KOKKOSKERNELS_ADD_UNIT_TEST(
  #   batched_dla_hip
  #   SOURCES
  #     Test_Main.cpp
  #     ${HIP_BATCHED_DLA_SOURCES}
  #   COMPONENTS batched
  #   )
    
  # APPEND_GLOB(HIP_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Sparse*.cpp)
  # # HIP does not provide UVM, these two tests are henced remove permanently
  # # IF (NOT KOKKOS_ENABLE_CUDA_UVM)
  #   LIST(REMOVE_ITEM HIP_SPARSE_SOURCES
  #     "${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Sparse_findRelOffset.cpp")
  #   LIST(REMOVE_ITEM HIP_SPARSE_SOURCES
  #     "${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Sparse_trsv.cpp")
  # # ENDIF()

  # KOKKOSKERNELS_ADD_UNIT_TEST(
  #   sparse_hip
  #   SOURCES
  #     Test_Main.cpp
  #     ${HIP_SPARSE_SOURCES}
  #   COMPONENTS sparse
  # )
  
  # APPEND_GLOB(HIP_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Graph*.cpp)
  # KOKKOSKERNELS_ADD_UNIT_TEST(
  #   graph_hip
  #   SOURCES
  #     Test_Main.cpp
  #     ${HIP_GRAPH_SOURCES}
  #   COMPONENTS graph
  # )
  
  #currently float 128 test is not working. So common tests are explicitly added.  
  APPEND_GLOB(HIP_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/hip/Test_HIP_Common*.cpp)
  KOKKOSKERNELS_ADD_UNIT_TEST(
    common_hip
    SOURCES
      Test_Main.cpp
      ${HIP_COMMON_SOURCES}
  )
ENDIF ()

IF (KOKKOS_ENABLE_OPENMP)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/openmp)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/openmp)
  
  APPEND_GLOB(OPENMP_BLAS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Blas*.cpp)

  # IF (KOKKOS_ENABLE_DEBUG)
  #   SET(DISABLE_SLOW_DGEMM_DOUBLE_TEST "--gtest_filter=-openmp.gemm_double")
  # ENDIF()

  KOKKOSKERNELS_ADD_UNIT_TEST(
    blas_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_BLAS_SOURCES}
    COMPONENTS blas
  )

  APPEND_GLOB(OPENMP_BATCHED_DLA_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Batched*.cpp)
  KOKKOSKERNELS_ADD_UNIT_TEST(
    batched_dla_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_BATCHED_DLA_SOURCES}
    COMPONENTS batched
  )
        
  APPEND_GLOB(OPENMP_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Sparse*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    sparse_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_SPARSE_SOURCES}
    COMPONENTS sparse
  )
  
  APPEND_GLOB(OPENMP_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Graph*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    graph_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_GRAPH_SOURCES}
    COMPONENTS graph
  )
  
  APPEND_GLOB(OPENMP_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Common*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    common_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_COMMON_SOURCES}
  )
ENDIF ()

IF (KOKKOS_ENABLE_SERIAL)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/serial)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/serial)
  
  APPEND_GLOB(SERIAL_BLAS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Blas*.cpp)

  # IF (KOKKOS_ENABLE_DEBUG)
  #   SET(DISABLE_SLOW_DGEMM_DOUBLE_TEST "--gtest_filter=-serial.gemm_double")
  # ENDIF()

  KOKKOSKERNELS_ADD_UNIT_TEST(
    blas_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_BLAS_SOURCES}
#    ARGS ${DISABLE_SLOW_DGEMM_DOUBLE_TEST}
    COMPONENTS blas
    )
    
  APPEND_GLOB(SERIAL_BATCHED_DLA_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Batched*.cpp)
  KOKKOSKERNELS_ADD_UNIT_TEST(
    batched_dla_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_BATCHED_DLA_SOURCES}
    COMPONENTS batched
    )

   APPEND_GLOB(SERIAL_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Sparse*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    sparse_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_SPARSE_SOURCES}
    COMPONENTS sparse
  )
  
  APPEND_GLOB(SERIAL_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Graph*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    graph_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_GRAPH_SOURCES}
    COMPONENTS graph
  )
  
  APPEND_GLOB(SERIAL_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Common*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    common_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_COMMON_SOURCES}
  )
ENDIF ()

IF (KOKKOS_ENABLE_PTHREAD)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/threads)
  KOKKOSKERNELS_INCLUDE_DIRECTORIES(REQUIRED_DURING_INSTALLATION_TESTING ${CMAKE_CURRENT_SOURCE_DIR}/threads)

  APPEND_GLOB(THREADS_BLAS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Blas*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    blas_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_BLAS_SOURCES}
    COMPONENTS blas
    )
    
  APPEND_GLOB(THREADS_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Sparse*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    sparse_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_SPARSE_SOURCES}
    COMPONENTS sparse
  )
  
  APPEND_GLOB(THREADS_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Graph*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    graph_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_GRAPH_SOURCES}
    COMPONENTS graph
  )
  
  
  APPEND_GLOB(THREADS_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Common*.cpp)

  KOKKOSKERNELS_ADD_UNIT_TEST(
    common_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_COMMON_SOURCES}
  )
ENDIF ()


 
