project(biscuit_tests)

add_executable(${PROJECT_NAME}
    src/assembler_bfloat_tests.cpp
    src/assembler_branch_tests.cpp
    src/assembler_cmo_tests.cpp
    src/assembler_privileged_tests.cpp
    src/assembler_rv32i_tests.cpp
    src/assembler_rv64i_tests.cpp
    src/assembler_rva_tests.cpp
    src/assembler_rvb_tests.cpp
    src/assembler_rvc_tests.cpp
    src/assembler_rvd_tests.cpp
    src/assembler_rvf_tests.cpp
    src/assembler_rvk_tests.cpp
    src/assembler_rvm_tests.cpp
    src/assembler_rvq_tests.cpp
    src/assembler_rvv_tests.cpp
    src/assembler_vector_crypto_tests.cpp
    src/assembler_zacas_tests.cpp
    src/assembler_zawrs_tests.cpp
    src/assembler_zc_tests.cpp
    src/assembler_zfa_tests.cpp
    src/assembler_zicond_tests.cpp
    src/assembler_zicsr_tests.cpp
    src/assembler_zihintntl_tests.cpp
    src/main.cpp

    src/assembler_test_utils.hpp
)

target_include_directories(${PROJECT_NAME}
PRIVATE
    externals/
)

target_link_libraries(${PROJECT_NAME}
PRIVATE
    biscuit
)

target_compile_features(${PROJECT_NAME}
PRIVATE
    cxx_std_20
)

if (MSVC)
    target_compile_options(${PROJECT_NAME}
    PRIVATE
        /MP
        /Zi
        /Zo
        /permissive-
        /EHsc
        /utf-8
        /volatile:iso
        /Zc:externConstexpr
        /Zc:inline
        /Zc:throwingNew

        # Warnings
        /W4
        /we4062 # enumerator 'identifier' in a switch of enum 'enumeration' is not handled
        /we4101 # 'identifier': unreferenced local variable
        /we4265 # 'class': class has virtual functions, but destructor is not virtual
        /we4388 # signed/unsigned mismatch
        /we4547 # 'operator' : operator before comma has no effect; expected operator with side-effect
        /we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'?
        /we4555 # Expression has no effect; expected expression with side-effect
        /we4715 # 'function': not all control paths return a value
        /we4834 # Discarding return value of function with 'nodiscard' attribute
        /we5038 # data member 'member1' will be initialized after data member 'member2'
    )
endif()

add_test(biscuit_tests_ctest ${PROJECT_NAME})