# Copyright 2024-2025 Andrey Semashev
#
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt

include(BoostTest OPTIONAL RESULT_VARIABLE HAVE_BOOST_TEST)

if (NOT HAVE_BOOST_TEST)
    return()
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR})

set(BOOST_TEST_COMPILE_FEATURES cxx_std_11)

set(BOOST_TEST_LINK_LIBRARIES
    Boost::atomic
    Boost::config
    Boost::core
    Boost::detail
    Boost::type_traits
)

if (WIN32)
    set(BOOST_TEST_COMPILE_DEFINITIONS
        "_CRT_SECURE_NO_WARNINGS"
        "_CRT_SECURE_NO_DEPRECATE"
        "BOOST_USE_WINDOWS_H"
    )
    list(APPEND BOOST_TEST_LINK_LIBRARIES
        Boost::winapi
    )
    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
        list(APPEND BOOST_TEST_LINK_LIBRARIES
            kernel32
        )
    endif()
endif()

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
    set(BOOST_TEST_COMPILE_OPTIONS "-Wall" "-Wextra" "-Werror")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    set(BOOST_TEST_COMPILE_OPTIONS "/W4" "/WX")
endif()

boost_test(TYPE run SOURCES atomic_api.cpp)
boost_test(TYPE run SOURCES atomic_ref_api.cpp)
boost_test(TYPE run SOURCES atomic_api.cpp COMPILE_DEFINITIONS BOOST_ATOMIC_FORCE_FALLBACK NAME fallback_atomic_api)
boost_test(TYPE run SOURCES atomic_ref_api.cpp COMPILE_DEFINITIONS BOOST_ATOMIC_FORCE_FALLBACK NAME fallback_atomic_ref_api)
boost_test(TYPE run SOURCES wait_api.cpp)
boost_test(TYPE run SOURCES wait_ref_api.cpp)
boost_test(TYPE run SOURCES wait_api.cpp COMPILE_DEFINITIONS BOOST_ATOMIC_FORCE_FALLBACK NAME fallback_wait_api)
boost_test(TYPE run SOURCES wait_ref_api.cpp COMPILE_DEFINITIONS BOOST_ATOMIC_FORCE_FALLBACK NAME fallback_wait_ref_api)
boost_test(TYPE run SOURCES wait_fuzz.cpp)
boost_test(TYPE run SOURCES wait_fuzz.cpp COMPILE_DEFINITIONS BOOST_ATOMIC_FORCE_FALLBACK NAME fallback_wait_fuzz)
boost_test(TYPE run SOURCES ipc_atomic_api.cpp)
boost_test(TYPE run SOURCES ipc_atomic_ref_api.cpp)
boost_test(TYPE run SOURCES ipc_wait_api.cpp)
boost_test(TYPE run SOURCES ipc_wait_ref_api.cpp)
boost_test(TYPE run SOURCES atomicity.cpp)
boost_test(TYPE run SOURCES atomicity_ref.cpp)
boost_test(TYPE run SOURCES ordering.cpp)
boost_test(TYPE run SOURCES ordering_ref.cpp)
boost_test(TYPE run SOURCES lockfree.cpp)

unset(BOOST_TEST_COMPILE_OPTIONS)

boost_test(TYPE compile-fail SOURCES cf_arith_void_ptr.cpp)
boost_test(TYPE compile-fail SOURCES cf_arith_func_ptr.cpp)
boost_test(TYPE compile-fail SOURCES cf_arith_mem_ptr.cpp)

boost_test(TYPE compile SOURCES c_implicit_ctor.cpp)
