set(UNIT_TEST_BINARY_DIR ${CMAKE_BINARY_DIR}/test/unit)

add_custom_target(run-unit-test
  COMMAND ${CMAKE_CTEST_COMMAND}
  DEPENDS unit-test
  WORKING_DIRECTORY ${UNIT_TEST_BINARY_DIR}
  COMMENT "Build and run the unit tests"
)

# Helper macro that adds a unit test executable to CTest and links the
# dependencies for the custom build targets
macro(add_unit_test test)
  cmake_parse_arguments(
    PARSED_ARGS
    ""
    ""
    "SOURCES;LINK_LIBRARIES"
    ${ARGN}
  )

  if(NOT DEFINED PARSED_ARGS_SOURCES)
    message(FATAL_ERROR "Must specify at least one source file (SOURCES)")
  endif()

  add_executable(${test} ${PARSED_ARGS_SOURCES})
  target_link_libraries(${test} ${PARSED_ARGS_LINK_LIBRARIES})
  
  message("add_unit_test: ${test} is linking libraries ${PARSED_ARGS_LINK_LIBRARIES}")
  
  add_test(
    NAME ${test}
    COMMAND $<TARGET_FILE:${test}> --gtest_output=xml:${UNIT_TEST_BINARY_DIR}/$<TARGET_FILE_NAME:${test}>.xml
    WORKING_DIRECTORY $<TARGET_FILE_DIR:${test}>
  )
  set_folder_property(${test})

  foreach (_src ${PARSED_ARGS_SOURCES})
    if(${_src} MATCHES "test_platform")
      set(USRCS "${USRCS};${_src}")
    else()
      set(USRCS "${USRCS};${CMAKE_CURRENT_SOURCE_DIR}/${_src}")
    endif()
  endforeach()
  set(UNIT_TEST_SRCS ${UNIT_TEST_SRCS};${USRCS} PARENT_SCOPE)
endmacro()

add_subdirectory(mock)

add_unit_test(unit_test_main
SOURCES
    main.cpp
LINK_LIBRARIES
    gtest
    gmock
    mock
    testenv
    testutil
)
set_folder_property(unit_test_main)
target_include_directories(unit_test_main PUBLIC $<TARGET_PROPERTY:gmock,INCLUDE_DIRECTORIES>)
target_include_directories(unit_test_main PRIVATE $<TARGET_PROPERTY:testenv,INCLUDE_DIRECTORIES>)
#Copy test files to binary directory
add_custom_command(TARGET unit_test_main PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_CURRENT_SOURCE_DIR}/hls/samples $<TARGET_FILE_DIR:unit_test_main>/samples)

set(UNIT_TEST_SRCS ${UNIT_TEST_SRCS} PARENT_SCOPE)

