function(lsqpack_add_test TARGET)
    add_executable(test_${TARGET} "")
    target_sources(test_${TARGET} PRIVATE test_${TARGET}.c)
    target_link_libraries(test_${TARGET} ls-qpack)

    if(WIN32)
        target_include_directories(test_${TARGET} PRIVATE ../wincompat)
        target_link_libraries(test_${TARGET} ${GETOPT_LIB})
    else()
        target_link_libraries(test_${TARGET} m)
    endif()

    add_test(${TARGET} test_${TARGET})
endfunction()

lsqpack_add_test(int)
lsqpack_add_test(enc_str)
lsqpack_add_test(huff_dec)
lsqpack_add_test(read_enc_stream)
lsqpack_add_test(qpack)
lsqpack_add_test(circ_list)
lsqpack_add_test(dec_crash_case)
lsqpack_add_test(dyn_table_cap_mismatch)

if(WIN32)
    message(WARNING "Scenario tests are disabled on Windows (TODO)")
else()
    file(GLOB SCENARIOS scenarios/*.sce)
    foreach(SCENARIO ${SCENARIOS})
        get_filename_component(TEST_NAME ${SCENARIO} NAME)
        add_test(
            NAME scenario-${TEST_NAME}
            COMMAND bash run-scenario.sh ${SCENARIO}
            WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/test
        )
        set_tests_properties(scenario-${TEST_NAME} PROPERTIES
            ENVIRONMENT "PATH=$ENV{PATH}:${PROJECT_BINARY_DIR}/bin:${PROJECT_SOURCE_DIR}/tools"
        )
    endforeach()
endif()

find_package(Perl)

if(PERL_FOUND)
    message(STATUS "Found Perl interpreter: ${PERL_EXECUTABLE}")
    file(GLOB QIFS qifs/*.qif)
    
    foreach(QIF ${QIFS})
        get_filename_component(FILE_NAME ${QIF} NAME)
        
        foreach(TABLE_SIZE 0 256 512 1024 4096)
            foreach(RISKED_STREAMS 0 100)
                foreach(IMMEDIATE_ACK 0 1)
                    foreach(AGGRESSIVE 0 1)
                        set(TEST_NAME qif-${FILE_NAME}-t${TABLE_SIZE}-s${RISKED_STREAMS}-a${IMMEDIATE_ACK}-A${AGGRESSIVE})
                        
                        add_test(
                            NAME ${TEST_NAME}
                            COMMAND ${PERL_EXECUTABLE} run-qif.pl --table-size ${TABLE_SIZE} --risked-streams ${RISKED_STREAMS} --immed-ack ${IMMEDIATE_ACK} --aggressive ${AGGRESSIVE} ${QIF}
                            WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/test
                        )
                        
                        if(NOT WIN32)
                            set_tests_properties(${TEST_NAME} PROPERTIES
                                ENVIRONMENT "PATH=$ENV{PATH}:${PROJECT_BINARY_DIR}/bin:${PROJECT_SOURCE_DIR}/tools"
                            )
                        endif()
                    endforeach()
                endforeach()
            endforeach()
        endforeach()
    endforeach()
else()
    message(WARNING "Perl not found: QIF tests won't be run")
endif()
