cmake_minimum_required(VERSION 3.0)
project (FreeDATA)
include(CTest)
enable_testing()

# Find codec2
if(CODEC2_BUILD_DIR)
    find_package(codec2 REQUIRED
        PATHS ${CODEC2_BUILD_DIR}
        NO_DEFAULT_PATH
        CONFIGS codec2.cmake
    )
    if(codec2_FOUND)
        message(STATUS "Codec2 library found in build tree.")
    endif()
else()
    find_package(codec2 REQUIRED)
endif()

# test variables
set(FRAMESPERBURST 3)
set(BURSTS 1)
set(TESTFRAMES 3)

add_test(NAME audio_buffer
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_audiobuffer.py")
         set_tests_properties(audio_buffer PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

add_test(NAME resampler
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_resample_48_8.py")
        set_tests_properties(resampler PROPERTIES PASS_REGULAR_EXPRESSION "PASS")

add_test(NAME tnc_state_machine
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_tnc_states.py")
         set_tests_properties(tnc_state_machine PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

add_test(NAME tnc_irs_iss
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_tnc.py")
         set_tests_properties(tnc_irs_iss PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

# disabled this test as its actually broken since we entroduced session IDs
#add_test(NAME chat_text
#         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
#                        export PYTHONPATH=../tnc;
#                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
#                        python3 test_chat_text.py")
#         set_tests_properties(chat_text PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

add_test(NAME datac0_frames
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_datac0.py")
         set_tests_properties(datac0_frames PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

add_test(NAME datac0_frames_negative
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_datac0_negative.py")
         set_tests_properties(datac0_frames_negative PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

add_test(NAME helper_routines
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_helpers.py")
         set_tests_properties(helper_routines PROPERTIES PASS_REGULAR_EXPRESSION "errors: 0")

add_test(NAME py_highsnr_stdio_P_P_multi
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        export BURSTS=${BURSTS};
                        export FRAMESPERBURST=${FRAMESPERBURST};
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_highsnr_stdio_P_P_multi.py")
        set_tests_properties(py_highsnr_stdio_P_P_multi PROPERTIES PASS_REGULAR_EXPRESSION "DATAC0: ${BURSTS}/${FRAMESPERBURST} DATAC1: ${BURSTS}/${FRAMESPERBURST} DATAC3: ${BURSTS}/${FRAMESPERBURST}")

add_test(NAME py_highsnr_stdio_P_P_datacx
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        export BURSTS=${BURSTS};
                        export FRAMESPERBURST=${FRAMESPERBURST};
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_highsnr_stdio_P_P_datacx.py")
        set_tests_properties(py_highsnr_stdio_P_P_datacx PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: ${BURSTS} RECEIVED FRAMES: ${FRAMESPERBURST}")

add_test(NAME py_highsnr_stdio_P_C_datacx
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        export BURSTS=${BURSTS};
                        export FRAMESPERBURST=${FRAMESPERBURST};
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_highsnr_stdio_P_C_datacx.py")
        set_tests_properties(py_highsnr_stdio_P_C_datacx PROPERTIES PASS_REGULAR_EXPRESSION "HELLO WORLD")

add_test(NAME py_highsnr_stdio_C_P_datacx
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        export PYTHONPATH=../tnc;
                        export BURSTS=${BURSTS};
                        export FRAMESPERBURST=${FRAMESPERBURST};
                        export TESTFRAMES=${TESTFRAMES};
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 test_highsnr_stdio_C_P_datacx.py")
        set_tests_properties(py_highsnr_stdio_C_P_datacx PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: ${BURSTS} RECEIVED FRAMES: ${FRAMESPERBURST}")

add_test(NAME highsnr_stdio_P_C_single
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 util_tx.py --mode datac0 --delay 500 --framesperburst ${FRAMESPERBURST} --bursts ${BURSTS} |
                        sox -t .s16 -r 48000 -c 1 - -t .s16 -r 8000 -c 1 - |
                        freedv_data_raw_rx datac0 - - --framesperburst ${FRAMESPERBURST} | hexdump -C")
        set_tests_properties(highsnr_stdio_P_C_single PROPERTIES PASS_REGULAR_EXPRESSION "HELLO WORLD")

add_test(NAME highsnr_stdio_C_P_single
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        freedv_data_raw_tx datac0 --testframes ${TESTFRAMES} --bursts ${BURSTS} --framesperburst ${FRAMESPERBURST} /dev/zero - |
                        sox -t .s16 -r 8000 -c 1 - -t .s16 -r 48000 -c 1 - |
                        python3 util_rx.py --mode datac0 --framesperburst ${FRAMESPERBURST} --bursts ${BURSTS}")
        set_tests_properties(highsnr_stdio_C_P_single PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: ${BURSTS} RECEIVED FRAMES: ${FRAMESPERBURST}")

add_test(NAME highsnr_stdio_P_P_single
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 util_tx.py --mode datac0 --delay 500 --framesperburst ${FRAMESPERBURST} --bursts ${BURSTS} |
                        python3 util_rx.py --debug --mode datac0 --framesperburst ${FRAMESPERBURST} --bursts ${BURSTS}")
        set_tests_properties(highsnr_stdio_P_P_single PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: ${BURSTS} RECEIVED FRAMES: ${FRAMESPERBURST}")

add_test(NAME highsnr_stdio_P_P_multi
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        python3 util_multimode_tx.py --delay 500 --framesperburst ${FRAMESPERBURST} --bursts ${BURSTS} |
                        python3 util_multimode_rx.py --framesperburst ${FRAMESPERBURST} --bursts ${BURSTS} --timeout 20")
        set_tests_properties(highsnr_stdio_P_P_multi PROPERTIES PASS_REGULAR_EXPRESSION "DATAC0: ${BURSTS}/${FRAMESPERBURST} DATAC1: ${BURSTS}/${FRAMESPERBURST} DATAC3: ${BURSTS}/${FRAMESPERBURST}")

# These tests can't run on GitHub actions as we don't have a virtual sound card
if(NOT DEFINED ENV{GITHUB_RUN_ID})

# uses aplay/arecord then pipe to Python
add_test(NAME highsnr_virtual1_P_P_single_alsa
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual1.sh")
       set_tests_properties(highsnr_virtual1_P_P_single_alsa PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: 5 RECEIVED FRAMES: 10 RX_ERRORS: 0")

# let Python do audio I/O
add_test(NAME highsnr_virtual2_P_P_single
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual2.sh")
       set_tests_properties(highsnr_virtual2_P_P_single PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: 3 RECEIVED FRAMES: 6 RX_ERRORS: 0")

# Multimode test with Python I/O
add_test(NAME highsnr_virtual3_P_P_multi
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual_mm.sh")
       set_tests_properties(highsnr_virtual3_P_P_multi PROPERTIES PASS_REGULAR_EXPRESSION "DATAC0: 2/4 DATAC1: 2/4 DATAC3: 2/4")

# let Python do audio I/O via pyaudio callback mode
add_test(NAME highsnr_virtual4_P_P_single_callback
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual3a.sh")
       set_tests_properties(highsnr_virtual4_P_P_single_callback PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: 3 RECEIVED FRAMES: 6 RX_ERRORS: 0")

# let Python do audio I/O via pyaudio callback mode with code outside of callback
add_test(NAME highsnr_virtual4_P_P_single_callback_outside
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual3b.sh")
       set_tests_properties(highsnr_virtual4_P_P_single_callback_outside PROPERTIES PASS_REGULAR_EXPRESSION "RECEIVED BURSTS: 3 RECEIVED FRAMES: 6 RX_ERRORS: 0")

# let Python do audio I/O via pyaudio callback mode with code outside of callback
add_test(NAME highsnr_virtual5_P_P_multi_callback
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual4a.sh")
       set_tests_properties(highsnr_virtual5_P_P_multi_callback PROPERTIES PASS_REGULAR_EXPRESSION "DATAC0: 2/4 DATAC1: 2/4 DATAC3: 2/4")

# let Python do audio I/O via pyaudio callback mode with code outside of callback
add_test(NAME highsnr_virtual5_P_P_multi_callback_outside
         COMMAND sh -c "export LD_LIBRARY_PATH=${CODEC2_BUILD_DIR}/src;
                        PATH=$PATH:${CODEC2_BUILD_DIR}/src;
                        cd ${CMAKE_CURRENT_SOURCE_DIR}/test;
                        ./test_virtual4b.sh")
       set_tests_properties(highsnr_virtual5_P_P_multi_callback_outside PROPERTIES PASS_REGULAR_EXPRESSION "DATAC0: 2/4 DATAC1: 2/4 DATAC3: 2/4")

endif()

