find_package(A2X REQUIRED)

function(configure_test)
    set(options)
    set(oneValueArgs NAME SUBPROJECT)
    set(multiValueArgs WRAPPERS SOURCES INCLUDES LIBRARIES)
    cmake_parse_arguments(CONFIGURE_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    include_directories(
        ${CMOCKA_INCLUDE_DIR}
        ${CONFIGURE_TEST_INCLUDES}
    )
    add_definitions(${CMOCKA_DEFINITIONS})

    set(
        CMAKE_RUNTIME_OUTPUT_DIRECTORY
        ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test/${CONFIGURE_TEST_SUBPROJECT}/${CONFIGURE_TEST_NAME}
    )

    add_executable(${CONFIGURE_TEST_NAME}_test
        ${CMAKE_SOURCE_DIR}/test/util.c
        ${CONFIGURE_TEST_SOURCES}
    )

    list(APPEND CONFIGURE_TEST_WRAPPERS "malloc" "calloc" "realloc" "free")

    list(LENGTH CONFIGURE_TEST_WRAPPERS WRAPPED_COUNT)

    if(NOT ${WRAPPED_COUNT} STREQUAL "0")
        set(WRAPPED "")

        foreach(WRAPPER ${CONFIGURE_TEST_WRAPPERS})
            string(REGEX REPLACE "\\n" "" WRAPPER "${WRAPPER}")
            set(WRAPPED
                "${WRAPPED} \
                -Wl,--wrap=${WRAPPER}"
            )
        endforeach()

        set_target_properties(${CONFIGURE_TEST_NAME}_test
            PROPERTIES
            LINK_FLAGS "${WRAPPED}"
        )
    endif()

    target_link_libraries(${CONFIGURE_TEST_NAME}_test ${CMOCKA_LIBRARIES} ${CONFIGURE_TEST_LIBRARIES})

    set(test_targets ${test_targets} ${CONFIGURE_TEST_NAME}_test PARENT_SCOPE)
endfunction()