# Unit Tests CMakeLists.txt

include_directories(
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/include/mvgal
    ${CMAKE_SOURCE_DIR}/src/userspace
    ${CMAKE_SOURCE_DIR}/src/userspace/api
    ${CMAKE_SOURCE_DIR}/src/userspace/daemon
    ${CMAKE_SOURCE_DIR}/src/userspace/memory
    ${CMAKE_SOURCE_DIR}/src/userspace/scheduler
)

link_directories(
    ${CMAKE_BINARY_DIR}
)

# =============================================================================
# GPU Detection Tests
# =============================================================================

add_executable(test_gpu_detection
    test_gpu_detection.c
)

target_link_libraries(test_gpu_detection
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_gpu_detection COMMAND test_gpu_detection)

# =============================================================================
# Memory Management Tests
# =============================================================================

add_executable(test_memory
    test_memory.c
)

target_link_libraries(test_memory
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_memory COMMAND test_memory)

# =============================================================================
# Scheduler Tests
# =============================================================================

add_executable(test_scheduler
    test_scheduler.c
)

target_link_libraries(test_scheduler
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_scheduler COMMAND test_scheduler)

# =============================================================================
# Core API Tests
# =============================================================================

add_executable(test_core_api
    test_core_api.c
)

target_link_libraries(test_core_api
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_core_api COMMAND test_core_api)

# =============================================================================
# Execution Tests
# =============================================================================

add_executable(test_execution
    test_execution.c
)

target_link_libraries(test_execution
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_execution COMMAND test_execution)

# =============================================================================
# Configuration Tests
# =============================================================================

add_executable(test_config
    test_config.c
)

target_link_libraries(test_config
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_config COMMAND test_config)

# =============================================================================
# WoW64 Thunk Tests
# =============================================================================

add_executable(test_wow64
    test_wow64.c
)

target_include_directories(test_wow64
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/win32
)

target_link_libraries(test_wow64
    mvgal_wow64
    mvgal_core
    Threads::Threads
    dl
    m
)

add_test(NAME test_wow64 COMMAND test_wow64)

# =============================================================================
# SPIR-V Translation Tests
# =============================================================================

add_executable(test_spirv
    test_spirv.c
)

target_include_directories(test_spirv
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/intercept/vulkan
)

if(MVGAL_ENABLE_SPIRV_OPT)
  target_compile_definitions(test_spirv
        PRIVATE
            MVGAL_ENABLE_SPIRV_OPT
    )
endif()

target_link_libraries(test_spirv
    mvgal_vulkan_layer
    Threads::Threads
    m
)

add_test(NAME test_spirv COMMAND test_spirv)

# =============================================================================
# Barrier Translation Tests
# =============================================================================

add_executable(test_barrier_translate
    test_barrier_translate.c
)

target_include_directories(test_barrier_translate
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/intercept/vulkan
)

target_link_libraries(test_barrier_translate
    mvgal_vulkan_layer
    Threads::Threads
    m
)

add_test(NAME test_barrier_translate COMMAND test_barrier_translate)

# =============================================================================
# Command Buffer DAG Tests
# =============================================================================

add_executable(test_cmd_dag
    test_cmd_dag.c
)

target_include_directories(test_cmd_dag
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/intercept/vulkan
)

target_link_libraries(test_cmd_dag
    mvgal_vulkan_layer
    Threads::Threads
    m
)

add_test(NAME test_cmd_dag COMMAND test_cmd_dag)

# =============================================================================
# Shader Backend Tests
# =============================================================================

add_executable(test_shader_backend
    test_shader_backend.c
)

target_include_directories(test_shader_backend
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/intercept/vulkan
)

target_link_libraries(test_shader_backend
    mvgal_vulkan_layer
    Threads::Threads
    m
)

add_test(NAME test_shader_backend COMMAND test_shader_backend)

# =============================================================================
# Unified Heap Tests
# =============================================================================

add_executable(test_unified_heap
    test_unified_heap.c
)

target_link_libraries(test_unified_heap
    mvgal_core
    Threads::Threads
    m
)

add_test(NAME test_unified_heap COMMAND test_unified_heap)

# =============================================================================
# Cross-Vendor P2P DMA Tests
# =============================================================================

add_executable(test_p2p_cross_vendor
    test_p2p_cross_vendor.c
)

target_link_libraries(test_p2p_cross_vendor
    mvgal_core
    Threads::Threads
    ${DRM_IMPORTED_TARGET}
    ${PCI_IMPORTED_TARGET}
    ${UDEV_IMPORTED_TARGET}
    m
)

add_test(NAME test_p2p_cross_vendor COMMAND test_p2p_cross_vendor)
