set(MOCK_GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/mocks")
file(MAKE_DIRECTORY "${MOCK_GEN_DIR}")

function(cmock_generate_mock target header)
    cmake_parse_arguments(ARG "" "" "CONFIG" ${ARGN})
    if (NOT RUBY_EXECUTABLE)
        message(FATAL_ERROR "Ruby is required for CMock generation")
    endif()
    get_filename_component(name "${header}" NAME_WE)
    get_filename_component(header_dir "${header}" DIRECTORY)
    set(mock_src "${MOCK_GEN_DIR}/Mock${name}.c")
    set(mock_hdr "${MOCK_GEN_DIR}/Mock${name}.h")
    if (ARG_CONFIG)
        set(CMOCK_CONFIG_FLAG "-o${ARG_CONFIG}")
        set(CMOCK_CONFIG_DEPENDS "${ARG_CONFIG}")
    endif()
    add_custom_command(
        OUTPUT  "${mock_src}" "${mock_hdr}"
        COMMAND "${RUBY_EXECUTABLE}" "${CMOCK_SCRIPT}"
                ${CMOCK_CONFIG_FLAG}
                "--mock_path=${MOCK_GEN_DIR}"
                "${header}"
        DEPENDS "${header}" ${CMOCK_CONFIG_DEPENDS}
        COMMENT "CMock: generating Mock${name}"
        VERBATIM
    )
    target_sources("${target}" PRIVATE "${mock_src}")
    target_include_directories("${target}" PRIVATE "${MOCK_GEN_DIR}" "${header_dir}")
endfunction()

set(TEST_TARGETS "")

find_package(asio REQUIRED)

add_executable(test_example test_example.cpp)
target_include_directories(test_example PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_example PRIVATE Unity::Unity)
target_compile_features(test_example PRIVATE cxx_std_23)
add_test(NAME test_example COMMAND test_example)
list(APPEND TEST_TARGETS test_example)

add_custom_target(check
    COMMAND ${CMAKE_CTEST_COMMAND}
            --test-dir "${CMAKE_BINARY_DIR}"
            --output-on-failure
            --progress
    WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
    USES_TERMINAL
    DEPENDS ${TEST_TARGETS}
)
