function(box64_add_test test_name test_num)
    set(options 32BIT DISABLED_ON_ANDROID)
    set(oneValueArgs REF_NUM ARGS2 ANDROID_REF_NUM)
    set(multiValueArgs ENV)
    cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    if(NOT ARG_REF_NUM)
        set(ARG_REF_NUM ${test_num})
    endif()

    if(ARG_32BIT)
        set(_test_bin "${CMAKE_SOURCE_DIR}/tests32/test${test_num}")
        set(_ref_file "${CMAKE_SOURCE_DIR}/tests32/ref${ARG_REF_NUM}.txt")
        set(_output "tmpfile32_${test_num}.txt")
    else()
        if(ANDROID AND ARG_DISABLED_ON_ANDROID)
            return()
        endif()

        if(ANDROID)
            set(_test_bin "${CMAKE_CURRENT_SOURCE_DIR}/test${test_num}_android")
            if(ARG_ANDROID_REF_NUM)
                set(ARG_REF_NUM "${ARG_ANDROID_REF_NUM}")
            endif()
        else()
            set(_test_bin "${CMAKE_CURRENT_SOURCE_DIR}/test${test_num}")
        endif()

        set(_ref_file "${CMAKE_CURRENT_SOURCE_DIR}/ref${ARG_REF_NUM}.txt")
        set(_output "tmpfile${test_num}.txt")
    endif()

    add_test(NAME ${test_name} COMMAND ${CMAKE_COMMAND}
        -D TEST_PROGRAM=${CMAKE_BINARY_DIR}/${BOX64}
        -D TEST_ARGS=${_test_bin}
        -D TEST_ARGS2=${ARG_ARGS2}
        -D TEST_OUTPUT=${_output}
        -D TEST_REFERENCE=${_ref_file}
        -P ${CMAKE_SOURCE_DIR}/runTest.cmake)

    if(ARG_ENV)
        set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "${ARG_ENV}")
    endif()
endfunction()

box64_add_test(bootSyscall 01)
box64_add_test(bootSyscallC 02)
box64_add_test(printf 03)
box64_add_test(args 04 ARGS2 yeah)
box64_add_test(maths1 05 ARGS2 7)
box64_add_test(threadsStart 06)
box64_add_test(trig 07)
box64_add_test(pi 08)
box64_add_test(fork 09)
box64_add_test(cppThreads_nocosim 10 ENV "BOX64_LD_LIBRARY_PATH=${CMAKE_SOURCE_DIR}/x64lib" DISABLED_ON_ANDROID)
box64_add_test(tlsData 11 DISABLED_ON_ANDROID)
box64_add_test(fpu 12 ANDROID_REF_NUM 12_android)
box64_add_test(contexts 13 DISABLED_ON_ANDROID)
# box64_add_test(conditionalThreads 14)  # disabled: unstable conditional threads test
box64_add_test(linkingIndirectNoversion 15)
box64_add_test(sse_asm 16 ENV "BOX64_DYNAREC_FASTROUND=0" DISABLED_ON_ANDROID)
box64_add_test(sse_intrinsics 17 ENV "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0" DISABLED_ON_ANDROID)
box64_add_test(aes 18)
box64_add_test(backtrace 19 DISABLED_ON_ANDROID)
box64_add_test(irelative_reloc 20)
box64_add_test(longjumpInSignals_nocosim 21 DISABLED_ON_ANDROID)
box64_add_test(x87 22 ENV "BOX64_DYNAREC_FASTROUND=0" ANDROID_REF_NUM 22_android)
box64_add_test(pshufb 23)
box64_add_test(bswap 24)
box64_add_test(x87cache 25)
box64_add_test(feround 26 ENV "BOX64_SYNC_ROUNDING=1")
box64_add_test(sse4_2 27 DISABLED_ON_ANDROID)
box64_add_test(shaext 28)
box64_add_test(lock 29)
box64_add_test(avx_intrinsics 30 ENV "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0;BOX64_AVX=2" DISABLED_ON_ANDROID)
box64_add_test(fpu_rounding 31 ENV "BOX64_DYNAREC_FASTROUND=0" DISABLED_ON_ANDROID)
box64_add_test(x87pc 32 ENV "BOX64_DYNAREC_X87DOUBLE=2" DISABLED_ON_ANDROID)
box64_add_test(Boundary 33 DISABLED_ON_ANDROID)
box64_add_test(mmx 34)
box64_add_test(xsave_xrstor 35 DISABLED_ON_ANDROID)

if(BOX32)
    box64_add_test(bootSyscall_32bits 01 32BIT)
    box64_add_test(bootSyscallC_32bits 02 32BIT)
    box64_add_test(printf_32bits 03 32BIT)
    box64_add_test(args_32bits 04 ARGS2 yeah 32BIT)
    box64_add_test(maths1_32bits 05 ARGS2 7 32BIT)
    box64_add_test(threadsStart_32bits 06 32BIT)
    box64_add_test(trig_32bits 07 32BIT)
    box64_add_test(pi_32bits 08 32BIT)
    box64_add_test(fork_32bits 09 32BIT)
    box64_add_test(cppThreads_32bits_nocosim 10 ENV "BOX64_LD_LIBRARY_PATH=${CMAKE_SOURCE_DIR}/x86lib" 32BIT)
    box64_add_test(tlsData_32bits 11 32BIT)
    box64_add_test(fpu_32bits 12 32BIT)
    box64_add_test(contexts_32bits 13 32BIT)
    if(NOT LD80BITS)
        box64_add_test(conditionalThreads_32bits_nocosim 14 32BIT)
    endif()
    box64_add_test(linkingIndirectNoversion_32bits 15 32BIT)
    box64_add_test(linkingIndirectVersion_32bits 16 32BIT)
    box64_add_test(sse_32bits 17 ENV "BOX64_DYNAREC_FASTNAN=0;BOX64_DYNAREC_FASTROUND=0" 32BIT)
    box64_add_test(longjumpInSignals_32bits_nocosim 18 32BIT)
    box64_add_test(x87_32bits 19 ENV "BOX64_DYNAREC_FASTROUND=0" 32BIT)
    box64_add_test(idiv_32bits 20 32BIT)
    box64_add_test(multiple_dlopen_32bits 21 32BIT)
    box64_add_test(bswap_32bits 23 32BIT)
    box64_add_test(arpl_32bits 27 32BIT)
    box64_add_test(mmx_32bits 28 32BIT)
endif()
