# define unit-tests

# Headless chart abstraction tests (links opendigitizer-uilib for shared TestSinks.hpp)
add_executable(qa_SignalSink qa_SignalSink.cpp)
target_link_libraries(qa_SignalSink PRIVATE ut opendigitizer-uilib)
target_include_directories(qa_SignalSink PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
add_test(NAME qa_SignalSink COMMAND qa_SignalSink)

# Chart abstraction tests for SignalSink/SinkRegistry/Chart mixin APIs Note: links opendigitizer-uilib because Chart.hpp
# menu helpers reference LookAndFeel
add_executable(qa_ChartAbstraction qa_ChartAbstraction.cpp)
target_link_libraries(qa_ChartAbstraction PRIVATE ut opendigitizer-uilib)
target_include_directories(qa_ChartAbstraction PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
add_test(NAME qa_ChartAbstraction COMMAND qa_ChartAbstraction)

add_executable(qa_TestSpectrumGenerator qa_TestSpectrumGenerator.cpp)
target_link_libraries(qa_TestSpectrumGenerator PRIVATE ut gnuradio-core gnuradio-blocklib-core)
target_include_directories(qa_TestSpectrumGenerator PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..
                                                            ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/include)
add_test(NAME qa_TestSpectrumGenerator COMMAND qa_TestSpectrumGenerator)

add_executable(qa_play_stop_bar qa_play_stop_bar.cpp)
target_include_directories(qa_play_stop_bar INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/>
                                                      $<INSTALL_INTERFACE:include/>)
target_link_libraries(
  qa_play_stop_bar
  PRIVATE ut
          core
          gnuradio-core
          gnuradio-meta
          gnuradio-algorithm
          implot
          implot3d
          imgui-node-editor
          services
          stb
          ui_assets
          fonts
          sample_dashboards
          client
          plf_colony)
# workaround for getting out of source tree dependencies, should be modelled as proper targets
target_include_directories(qa_play_stop_bar PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../acquisition) # for daq_api.hpp
target_include_directories(qa_play_stop_bar PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../utils/include)

add_test(NAME qa_play_stop_bar COMMAND qa_play_stop_bar)

if(ENABLE_IMGUI_TEST_ENGINE)

  cmrc_add_resource_library(
    ui_test_assets
    NAMESPACE
    ui_test_assets
    examples/fg_dipole_intensity_ramp.grc
    examples/qa_layout.grc)

  # Code shared between all tests
  add_library(imgui_tests_common STATIC ImGuiTestApp.cpp)
  target_link_libraries(
    imgui_tests_common
    PUBLIC opendigitizer-uilib
           raii_wrapper
           ui_assets
           ui_test_assets)

  target_compile_definitions(imgui_tests_common PUBLIC IMGUI_DEFINE_MATH_OPERATORS OPENDIGITIZER_TEST
                                                       OPENDIGITIZER_BUILD_DIRECTORY="${CMAKE_BINARY_DIR}")

  target_include_directories(imgui_tests_common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)

  function(add_imgui_test NAME)
    add_executable(${NAME} ${NAME}.cpp)
    target_link_libraries(
      ${NAME}
      PRIVATE opendigitizer-uilib
              ut
              imgui_tests_common
              gnuradio-blocklib-core
              GrBasicBlocksShared
              GrTestingBlocksShared
              GrFourierBlocksShared)
    add_test(NAME ${NAME} COMMAND ${NAME})
  endfunction()

  add_imgui_test(qa_popup_menu)
  add_imgui_test(qa_dialog)
  add_imgui_test(qa_filtercomboboxes)
  add_imgui_test(qa_keypad)
  add_imgui_test(qa_chart)
  add_imgui_test(qa_chart_compatibility)
  add_imgui_test(qa_blockneighbourspreview)
  add_imgui_test(qa_chart_fgdipole)
  add_imgui_test(qa_docking)
  add_imgui_test(qa_FramePacer)
  add_imgui_test(qa_layout)
  add_imgui_test(qa_ColourManager)
  add_imgui_test(qa_flowgraph)
endif()
