#
# Testing
#

ENABLE_TESTING()

INCLUDE(FindCUDA)
INCLUDE_DIRECTORIES(${CUDA_TOOLKIT_INCLUDE})

SET(OPENMM_BUILD_CUDA_DOUBLE_PRECISION_TESTS TRUE CACHE BOOL "Whether to build double precision versions of CUDA test cases")

SET( INCLUDE_SERIALIZATION FALSE )
#SET( INCLUDE_SERIALIZATION TRUE )

IF( INCLUDE_SERIALIZATION )
    INCLUDE_DIRECTORIES(${OPENMM_DIR}/serialization/include)
    SET( SHARED_OPENMM_SERIALIZATION "OpenMMSerialization" )
ENDIF( INCLUDE_SERIALIZATION )

# Automatically create tests using files named "Test*.cpp"
FILE(GLOB TEST_PROGS "*Test*.cpp")
FOREACH(TEST_PROG ${TEST_PROGS})
    GET_FILENAME_COMPONENT(TEST_ROOT ${TEST_PROG} NAME_WE)

    # Link with shared library
    ADD_EXECUTABLE(${TEST_ROOT} ${TEST_PROG})
    TARGET_LINK_LIBRARIES(${TEST_ROOT} ${SHARED_TARGET})
    IF (APPLE)
        SET_TARGET_PROPERTIES(${TEST_ROOT} PROPERTIES LINK_FLAGS "${EXTRA_COMPILE_FLAGS} -F/Library/Frameworks -framework CUDA" COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS}")
    ELSE (APPLE)
        SET_TARGET_PROPERTIES(${TEST_ROOT} PROPERTIES LINK_FLAGS "${EXTRA_COMPILE_FLAGS}" COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS}")
    ENDIF (APPLE)

    IF( ${TEST_ROOT} STREQUAL "TestCUDAGBSAOBCForce2" )

        SET(DEFINE_STRING "-DTEST_PLATFORM=1 ")
        IF( INCLUDE_SERIALIZATION )
            SET(DEFINE_STRING "${DEFINE_STRING} -DOPENMM_SERIALIZE ")
        ENDIF( INCLUDE_SERIALIZATION )
    
        # nonbond

        SET(NONBOND_DEFINE_STRING "${DEFINE_STRING} -DIMPLICIT_SOLVENT=0")
        SET(NONBOND_TEST "TestCUDANonbondedForce2")
        ADD_EXECUTABLE(${NONBOND_TEST} ${TEST_PROG})

        SET_TARGET_PROPERTIES(${NONBOND_TEST} PROPERTIES COMPILE_FLAGS ${NONBOND_DEFINE_STRING} )
        ADD_TEST(${NONBOND_TEST} ${EXECUTABLE_OUTPUT_PATH}/${NONBOND_TEST})

        # OBC

        SET(DEFINE_STRING "${DEFINE_STRING} -DIMPLICIT_SOLVENT=1")
        SET_TARGET_PROPERTIES(${TEST_ROOT} PROPERTIES COMPILE_FLAGS ${DEFINE_STRING} )

        IF( INCLUDE_SERIALIZATION )
            TARGET_LINK_LIBRARIES(${NONBOND_TEST} ${SHARED_TARGET} ${SHARED_OPENMM_SERIALIZATION} )
            TARGET_LINK_LIBRARIES(${TEST_ROOT} ${SHARED_TARGET} ${SHARED_OPENMM_SERIALIZATION} )
        ELSE( INCLUDE_SERIALIZATION )
            TARGET_LINK_LIBRARIES(${NONBOND_TEST} ${SHARED_TARGET})
        ENDIF( INCLUDE_SERIALIZATION )

    ENDIF( ${TEST_ROOT} STREQUAL "TestCUDAGBSAOBCForce2" )
    ADD_TEST(${TEST_ROOT}Single ${EXECUTABLE_OUTPUT_PATH}/${TEST_ROOT} single)
    IF (OPENMM_BUILD_CUDA_DOUBLE_PRECISION_TESTS)
        ADD_TEST(${TEST_ROOT}Mixed ${EXECUTABLE_OUTPUT_PATH}/${TEST_ROOT} mixed)
        ADD_TEST(${TEST_ROOT}Double ${EXECUTABLE_OUTPUT_PATH}/${TEST_ROOT} double)
    ENDIF(OPENMM_BUILD_CUDA_DOUBLE_PRECISION_TESTS)

ENDFOREACH(TEST_PROG ${TEST_PROGS})
