
# Common utilities
add_library(boost_redis_project_options INTERFACE)
target_link_libraries(boost_redis_project_options INTERFACE boost_redis)
if (MSVC)
  # C4459: name hides outer scope variable is issued by Asio
  target_compile_options(boost_redis_project_options INTERFACE /bigobj /W4 /wd4459)
  target_compile_definitions(boost_redis_project_options INTERFACE _WIN32_WINNT=0x0601 _CRT_SECURE_NO_WARNINGS=1)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  target_compile_options(boost_redis_project_options INTERFACE -Wall -Wextra)
endif()

add_library(boost_redis_src STATIC boost_redis.cpp)
target_link_libraries(boost_redis_src PRIVATE boost_redis_project_options)

# Test utils
add_library(boost_redis_tests_common STATIC common.cpp sansio_utils.cpp)
target_link_libraries(boost_redis_tests_common PUBLIC boost_redis_project_options boost_redis_src)
target_compile_definitions(boost_redis_tests_common INTERFACE BOOST_ALLOW_DEPRECATED=1) # we need to still test deprecated fns

function(boost_redis_make_test TEST_NAME)
  set(EXE_NAME "boost_redis_${TEST_NAME}")
  add_executable(${EXE_NAME} ${TEST_NAME}.cpp)
  target_link_libraries(${EXE_NAME} PRIVATE boost_redis_tests_common)
  add_test(NAME ${EXE_NAME} COMMAND ${EXE_NAME})
  add_dependencies(tests ${EXE_NAME})
endfunction()

# Unit tests
boost_redis_make_test(test_low_level)
boost_redis_make_test(test_request)
boost_redis_make_test(test_serialization)
boost_redis_make_test(test_low_level_sync_sans_io)
boost_redis_make_test(test_any_adapter)
boost_redis_make_test(test_log_to_file)
boost_redis_make_test(test_conn_logging)
boost_redis_make_test(test_exec_fsm)
boost_redis_make_test(test_exec_one_fsm)
boost_redis_make_test(test_writer_fsm)
boost_redis_make_test(test_reader_fsm)
boost_redis_make_test(test_connect_fsm)
boost_redis_make_test(test_sentinel_resolve_fsm)
boost_redis_make_test(test_receive_fsm)
boost_redis_make_test(test_run_fsm)
boost_redis_make_test(test_compose_setup_request)
boost_redis_make_test(test_setup_adapter)
boost_redis_make_test(test_multiplexer)
boost_redis_make_test(test_parse_sentinel_response)
boost_redis_make_test(test_update_sentinel_list)
boost_redis_make_test(test_flat_tree)
boost_redis_make_test(test_generic_flat_response)
boost_redis_make_test(test_read_buffer)
boost_redis_make_test(test_subscription_tracker)
boost_redis_make_test(test_push_parser)

# Tests that require a real Redis server
if (BOOST_REDIS_INTEGRATION_TESTS)
  boost_redis_make_test(test_conn_quit)
  boost_redis_make_test(test_conn_exec_retry)
  boost_redis_make_test(test_conn_exec_error)
  boost_redis_make_test(test_run)
  boost_redis_make_test(test_conn_run_cancel)
  boost_redis_make_test(test_conn_check_health)
  boost_redis_make_test(test_conn_exec)
  boost_redis_make_test(test_conn_push)
  boost_redis_make_test(test_conn_push2)
  boost_redis_make_test(test_conn_monitor)
  boost_redis_make_test(test_conn_reconnect)
  boost_redis_make_test(test_conn_exec_cancel)
  boost_redis_make_test(test_conn_echo_stress)
  boost_redis_make_test(test_conn_move)
  boost_redis_make_test(test_conn_setup)
  boost_redis_make_test(test_issue_50)
  boost_redis_make_test(test_conversions)
  boost_redis_make_test(test_conn_tls)
  boost_redis_make_test(test_unix_sockets)
  boost_redis_make_test(test_conn_cancel_after)
  boost_redis_make_test(test_conn_sentinel)
endif()