include(GoogleTest)

if(WIN32)
    add_custom_target(
        fooyin_test_runtime
        COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<TARGET_FILE:Qt6::Test>" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
        COMMENT "Deploying the Qt Test runtime"
    )
endif()

function(fooyin_add_test name)
    add_executable(${name} ${ARGN} testutils.cpp)
    set_property(GLOBAL APPEND PROPERTY FOOYIN_TEST_TARGETS ${name})
    if(WIN32)
        add_dependencies(${name} fooyin_test_runtime)
    endif()
    fooyin_set_rpath(${name} ${LIB_INSTALL_DIR})
    target_include_directories(${name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
    target_include_directories(${name} SYSTEM PRIVATE ${FFMPEG_INCLUDE_DIRS})
    target_compile_definitions(${name} PRIVATE FOOYIN_TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
    target_link_libraries(
        ${name}
        PRIVATE Fooyin::Core
                Fooyin::CorePrivate
                Fooyin::Gui
                Fooyin::GuiPrivate
                Fooyin::Utils
                Qt6::Test
                Taglib::Taglib
                ${FFMPEG_LIBRARIES}
                GTest::gtest_main
    )
    gtest_discover_tests(${name})
endfunction()

fooyin_add_test(test_commandline app/commandlinetest.cpp ${CMAKE_SOURCE_DIR}/src/app/commandline.cpp)
target_include_directories(test_commandline PRIVATE ${CMAKE_SOURCE_DIR}/src/app)
target_link_libraries(test_commandline PRIVATE fooyin_version)
if(WIN32)
    target_include_directories(test_commandline PRIVATE ${GETOPT_INCLUDE_DIR})
    target_link_libraries(test_commandline PRIVATE ${GETOPT_LIBRARY})
endif()

fooyin_add_test(test_audioconverter core/engine/audioconvertertest.cpp)
fooyin_add_test(test_audioclock core/engine/audioclocktest.cpp)
fooyin_add_test(test_conversionpathresolver core/engine/conversion/conversionpathresolvertest.cpp)
fooyin_add_test(test_conversionrunner core/engine/conversion/conversionrunnertest.cpp)
fooyin_add_test(test_accurateripcore core/engine/accurateriptest.cpp)
fooyin_add_test(test_audioverifier core/engine/audioverifiertest.cpp)
fooyin_add_test(test_ffmpegencoder core/engine/ffmpegencodertest.cpp)
fooyin_add_test(test_audioloader core/engine/audioloadertest.cpp)
fooyin_add_test(test_audioengine core/engine/audioenginetest.cpp)
fooyin_add_test(test_visualisationbackend core/engine/visualisationbackendtest.cpp)
fooyin_add_test(test_audiomixer core/engine/audiomixertest.cpp)
if(BUILD_SENSITIVE_TESTING)
    fooyin_add_test(test_audioengine_sensitive core/engine/audioenginetest_sensitive.cpp)
    fooyin_add_test(test_audiopipeline core/engine/audiopipelinetest.cpp)
endif()
fooyin_add_test(test_timedaudiofifo core/engine/timedaudiofifotest.cpp)
fooyin_add_test(test_dspchain core/engine/dspchaintest.cpp)
fooyin_add_test(test_realfft core/engine/realffttest.cpp)
fooyin_add_test(test_enginetaskqueue core/engine/enginetaskqueuetest.cpp)
fooyin_add_test(test_fadecontroller core/engine/fadecontrollertest.cpp)
fooyin_add_test(test_outputfader core/engine/outputfadertest.cpp)
fooyin_add_test(test_lockfreeringbuffer core/engine/lockfreeringbuffertest.cpp)
fooyin_add_test(test_playbackintentreducer core/engine/playbackintentreducertest.cpp)
fooyin_add_test(test_positioncoordinator core/engine/positioncoordinatortest.cpp)
fooyin_add_test(test_playbacktransitioncoordinator core/engine/playbacktransitioncoordinatortest.cpp)
fooyin_add_test(test_replaygainprocessor core/engine/replaygainprocessortest.cpp)
fooyin_add_test(test_seekplanner core/engine/seekplannertest.cpp)
fooyin_add_test(test_trackloadplanner core/engine/trackloadplannertest.cpp)
fooyin_add_test(test_networkstreamdevice core/network/networkstreamdevicetest.cpp networktestutils.h)
fooyin_add_test(test_remoteioservice core/network/remoteioservicetest.cpp networktestutils.h)

fooyin_add_test(test_playbackcursor core/playback/playbackcursortest.cpp)
fooyin_add_test(test_playbackprogresstracker core/playback/playbackprogresstrackertest.cpp)
fooyin_add_test(test_playbackqueue core/playback/playbackqueuetest.cpp)
fooyin_add_test(test_playbacksession core/playback/playbacksessiontest.cpp)
fooyin_add_test(test_playercontroller core/playback/playercontrollertest.cpp)
fooyin_add_test(test_playlistnavigator core/playback/playlistnavigatortest.cpp)

fooyin_add_test(test_cueparser core/playlist/cueparsertest.cpp data/playlists.qrc)
fooyin_add_test(test_m3uparser core/playlist/m3uparsertest.cpp data/playlists.qrc)
fooyin_add_test(test_plsparser core/playlist/plsparsertest.cpp data/playlists.qrc)
fooyin_add_test(test_playlistchangeset core/playlist/playlistchangesettest.cpp)
fooyin_add_test(test_playlisthandler core/playlist/playlisthandlertest.cpp)
fooyin_add_test(test_libraryscanner core/library/libraryscannertest.cpp ${CMAKE_SOURCE_DIR}/data/data.qrc)
fooyin_add_test(test_musiclibraryfilter core/library/musiclibraryfiltertest.cpp)
fooyin_add_test(test_unifiedmusiclibrary core/library/unifiedmusiclibrarytest.cpp ${CMAKE_SOURCE_DIR}/data/data.qrc)

fooyin_add_test(test_scriptparser core/scriptparsertest.cpp)
fooyin_add_test(test_stringpool core/stringpooltest.cpp)
fooyin_add_test(test_track core/tracktest.cpp)

fooyin_add_test(test_tagreader core/tagging/tagreadertest.cpp data/audio.qrc)
target_include_directories(test_tagreader PRIVATE ${FFMPEG_INCLUDE_DIRS})
fooyin_add_test(test_ratingtagpolicy core/tagging/ratingtagpolicytest.cpp)
fooyin_add_test(test_tagwriter core/tagging/tagwritertest.cpp data/audio.qrc)

fooyin_add_test(test_guiutils gui/guiutilstest.cpp)
fooyin_add_test(test_fythemefile gui/fythemefiletest.cpp)
fooyin_add_test(test_fysplitter gui/fysplittertest.cpp)
fooyin_add_test(test_scriptformatter gui/scriptformattertest.cpp)
fooyin_add_test(test_filtercontroller gui/filters/filtercontrollertest.cpp)
fooyin_add_test(test_filterpipeline gui/filters/filterpipelinetest.cpp)

fooyin_add_test(test_helpers utils/helperstest.cpp)

if(TARGET fileops)
    set(FILEOPS_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src/plugins/fileops)
    fooyin_add_test(test_fileopsworker plugins/fileops/fileopsworkertest.cpp ${FILEOPS_SOURCE_DIR}/fileopsworker.cpp)
    target_include_directories(test_fileopsworker PRIVATE ${FILEOPS_SOURCE_DIR})
endif()

if(TARGET tageditor)
    fooyin_add_test(
        test_tagfillpattern
        plugins/tageditor/tagfillpatterntest.cpp ${CMAKE_SOURCE_DIR}/src/plugins/tageditor/tagfillpattern.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/tageditor/tageditorsettings.cpp
    )
endif()

if(TARGET lyrics)
    fooyin_add_test(
        test_lyricsparser plugins/lyrics/lyricsparsertest.cpp ${CMAKE_SOURCE_DIR}/src/plugins/lyrics/lyricsparser.cpp
    )
    target_include_directories(test_lyricsparser PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/lyrics)
endif()

fooyin_add_test(test_metadatamatcher gui/metadatalookup/metadatamatchertest.cpp)
fooyin_add_test(test_metadataapply gui/metadatalookup/metadataapplytest.cpp)

if(TARGET cdda)
    fooyin_add_test(
        test_cddadomain plugins/cdda/cddadomaintest.cpp ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddatoc.cpp
                        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddaurl.cpp
    )
    target_include_directories(test_cddadomain PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)

    fooyin_add_test(
        test_accuraterip plugins/cdda/accurateriptest.cpp ${CMAKE_SOURCE_DIR}/src/plugins/cdda/accuraterip.cpp
                         ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddatoc.cpp
    )
    target_include_directories(test_accuraterip PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)

    fooyin_add_test(
        test_cddrivebackend plugins/cdda/cddrivebackendtest.cpp
                            ${CMAKE_SOURCE_DIR}/src/plugins/cdda/drive/cddrivebackend.cpp
    )
    target_include_directories(test_cddrivebackend PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)

    fooyin_add_test(
        test_cddasectorreader
        plugins/cdda/cddasectorreadertest.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddasectorreader.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddatoc.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/drive/cddrivebackend.cpp
    )
    target_include_directories(test_cddasectorreader PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)

    fooyin_add_test(
        test_cddrivemanager
        plugins/cdda/cddadrivemanagertest.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddadrivemanager.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddatoc.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddaurl.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/drive/cddrivebackend.cpp
    )
    target_include_directories(test_cddrivemanager PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)

    fooyin_add_test(
        test_cddareader
        plugins/cdda/cddareadertest.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddareader.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddadrivemanager.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddatoc.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddaurl.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/drive/cddrivebackend.cpp
    )
    target_include_directories(test_cddareader PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)

    fooyin_add_test(
        test_cddadecoder
        plugins/cdda/cddadecodertest.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddadecoder.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddadrivesettings.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddadrivemanager.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddasectorreader.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddatoc.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/cddaurl.cpp
        ${CMAKE_SOURCE_DIR}/src/plugins/cdda/drive/cddrivebackend.cpp
    )
    target_include_directories(test_cddadecoder PRIVATE ${CMAKE_SOURCE_DIR}/src/plugins/cdda)
endif()
