# Initialize ######################################################################################

Include                             ( cotire      OPTIONAL RESULT_VARIABLE HAS_COTIRE )
Include                             ( pedantic    OPTIONAL RESULT_VARIABLE HAS_PEDANTIC )
Include                             ( cmake_tests OPTIONAL RESULT_VARIABLE HAS_CMAKE_TESTS )

Find_Package                        ( Sanitizers QUIET )

# Test ############################################################################################

Find_Package                        ( GTest )
If                                  ( NOT "${GTest_FOUND}" )
    Return                              ( )
EndIf                               ( )

File                                ( GLOB_RECURSE ASYNCPP_TEST_HEADER_FILES
                                      ${CMAKE_CURRENT_SOURCE_DIR}/*.h )
File                                ( GLOB_RECURSE ASYNCPP_TEST_INLINE_FILES
                                      ${CMAKE_CURRENT_SOURCE_DIR}/*.inl )
File                                ( GLOB_RECURSE ASYNCPP_TEST_SOURCE_FILES
                                      RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
                                      ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp )

ForEach                             ( FILE IN LISTS ASYNCPP_TEST_SOURCE_FILES )
    # add test
    Get_Filename_Component              ( TEST_DIR  ${FILE} DIRECTORY )
    Get_Filename_Component              ( TEST_NAME ${FILE} NAME_WE )
    Set                                 ( TEST_NAME "${TEST_DIR}/${TEST_NAME}"  )
    String                              ( REPLACE "\\" "-" TEST_NAME "${TEST_NAME}" )
    String                              ( REPLACE "/" "-" TEST_NAME "${TEST_NAME}" )
    String                              ( REPLACE "_" "-" TEST_NAME "${TEST_NAME}" )
    Set                                 ( TEST_NAME "test-${TEST_NAME}" )
    Add_Executable                      ( ${TEST_NAME}
                                          EXCLUDE_FROM_ALL
                                          ${ASYNCPP_TEST_HEADER_FILES}
                                          ${ASYNCPP_TEST_INLINE_FILES}
                                          ${FILE} )
    Target_Link_Libraries               ( ${TEST_NAME}
                                          PUBLIC
                                            asyncpp
                                            GMock::Main )

    # Sanitizers
    If                                  ( Sanitizers_FOUND )
        Add_Sanitizers                      ( ${TEST_NAME} )
    EndIf                               ( )

    # pedantic
    If                                  ( HAS_PEDANTIC )
        Pedantic_Apply_Flags_Target         ( ${TEST_NAME} ALL )
    EndIf                               ( )

    # test
    If                                  ( HAS_CMAKE_TESTS )
        Add_CMake_Test                      ( NAME ${TEST_NAME} TARGET ${TEST_NAME} GROUP asyncpp )
    Else                                ( )
        Add_Test                            ( NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
    EndIf                               ( )
EndForEach                          ( )
