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

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

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

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/graph)
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)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/../test_common)
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 ${${PARENT_PACKAGE_NAME}_SOURCE_DIR}/../kokkos/tpls/gtest)
INCLUDE_DIRECTORIES(${GTEST_SOURCE_DIR})

INCLUDE_DIRECTORIES(${GTEST_SOURCE_DIR})
TRIBITS_ADD_LIBRARY(
  kokkoskernels_gtest
  HEADERS ${GTEST_SOURCE_DIR}/gtest/gtest.h
  SOURCES ${GTEST_SOURCE_DIR}/gtest/gtest-all.cc
  TESTONLY
  )


IF (Kokkos_ENABLE_Cuda)
  INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/cuda)
  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)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    blas_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_BLAS_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
    )
    
  APPEND_GLOB(CUDA_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Sparse*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    sparse_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_SPARSE_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  APPEND_GLOB(CUDA_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/cuda/Test_Cuda_Graph*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    graph_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_GRAPH_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  #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_ArithTraits.cpp)
  

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    common_cuda
    SOURCES
      Test_Main.cpp
      ${CUDA_COMMON_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
ENDIF ()

IF (Kokkos_ENABLE_OpenMP)
  INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/openmp)
  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()

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    blas_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_BLAS_SOURCES}
    ARGS ${DISABLE_SLOW_DGEMM_DOUBLE_TEST}
    COMM serial mpi
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
    )
    
        
  APPEND_GLOB(OPENMP_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Sparse*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    sparse_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_SPARSE_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  APPEND_GLOB(OPENMP_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Graph*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    graph_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_GRAPH_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  APPEND_GLOB(OPENMP_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/openmp/Test_OpenMP_Common_ArithTraits.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    common_openmp
    SOURCES
      Test_Main.cpp
      ${OPENMP_COMMON_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
ENDIF ()

IF (Kokkos_ENABLE_Serial)
  INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/serial)
  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()

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    blas_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_BLAS_SOURCES}
    ARGS ${DISABLE_SLOW_DGEMM_DOUBLE_TEST}
    COMM serial mpi
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
    )
    
   APPEND_GLOB(SERIAL_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Sparse*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    sparse_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_SPARSE_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  APPEND_GLOB(SERIAL_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Graph*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    graph_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_GRAPH_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  APPEND_GLOB(SERIAL_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/serial/Test_Serial_Common_ArithTraits.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    common_serial
    SOURCES
      Test_Main.cpp
      ${SERIAL_COMMON_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
ENDIF ()

IF (Kokkos_ENABLE_Pthread)
  INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/threads)
  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)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    blas_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_BLAS_SOURCES}
    COMM serial mpi
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
    )
    
  APPEND_GLOB(THREADS_SPARSE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Sparse*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    sparse_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_SPARSE_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  APPEND_GLOB(THREADS_GRAPH_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Graph*.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    graph_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_GRAPH_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
  
  
  APPEND_GLOB(THREADS_COMMON_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/threads/Test_Threads_Common_ArithTraits.cpp)

  TRIBITS_ADD_EXECUTABLE_AND_TEST(
    common_threads
    SOURCES
      Test_Main.cpp
      ${THREADS_COMMON_SOURCES}
    NUM_MPI_PROCS 1
    TESTONLYLIBS kokkoskernels_gtest
  )
ENDIF ()


 
