# Тесты ядра. Структура зеркалит src: tests/ayla — протоколная часть,
# tests/aircon — конверсии/шаблоны (появятся в M3).
#
# Тесты собираются с исключениями (фреймворк), сама библиотека — без.

include(FetchContent)
FetchContent_Declare(
  doctest
  GIT_REPOSITORY https://github.com/doctest/doctest.git
  GIT_TAG v2.4.12
  GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(doctest)

function(fgl_add_test name)
  add_executable(test_${name} ${ARGN})
  target_compile_features(test_${name} PRIVATE cxx_std_20)
  target_link_libraries(test_${name} PRIVATE fgl-aircon doctest_with_main)
  target_include_directories(test_${name} PRIVATE "${CMAKE_SOURCE_DIR}/src")
  add_test(NAME ${name} COMMAND test_${name})
endfunction()

# Раннер сессии — не тест, приложение для интеграционных сценариев
# (запускается tests/ayla/test_session_mock.py через ctest).
add_executable(session_runner ayla/session_runner.cpp)
target_compile_features(session_runner PRIVATE cxx_std_20)
target_link_libraries(session_runner PRIVATE fgl-aircon)
target_include_directories(session_runner PRIVATE "${CMAKE_SOURCE_DIR}/src")

fgl_add_test(ayla_platform ayla/test_platform.cpp)
fgl_add_test(ayla_httpd ayla/test_httpd.cpp)
fgl_add_test(ayla_crypto ayla/test_crypto.cpp)
fgl_add_test(ayla_envelope ayla/test_envelope.cpp)
fgl_add_test(ayla_json ayla/test_json.cpp)
fgl_add_test(ayla_httpc ayla/test_httpc.cpp)

# Интеграционные сценарии с mock-модулем (python, stdlib-only).
find_package(Python3 COMPONENTS Interpreter REQUIRED)
add_test(NAME ayla_session_mock
  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/ayla/test_session_mock.py
          $<TARGET_FILE:session_runner> ${CMAKE_CURRENT_SOURCE_DIR}/ayla/mock_ac.py)
set_tests_properties(ayla_session_mock PROPERTIES TIMEOUT 180)
