# Integration Tests CMakeLists.txt

include_directories(
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/include/mvgal
)

link_directories(
    ${CMAKE_BINARY_DIR}
)

# Multi-GPU validation test
add_executable(test_multi_gpu
    test_multi_gpu_validation.c
)

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

add_test(NAME test_multi_gpu COMMAND test_multi_gpu)

if(WITH_VULKAN AND Vulkan_FOUND)
    add_executable(test_vulkan_layer_submit
        test_vulkan_layer_submit.c
    )

    target_link_libraries(test_vulkan_layer_submit
        PRIVATE
            ${Vulkan_LIBRARIES}
    )

    target_include_directories(test_vulkan_layer_submit
        PRIVATE
            ${Vulkan_INCLUDE_DIRS}
    )

    target_compile_definitions(test_vulkan_layer_submit
        PRIVATE
            MVGAL_TEST_LAYER_DIR="$<TARGET_FILE_DIR:mvgal_vulkan_layer>"
            MVGAL_TEST_VK_ICD_PATH="/usr/share/vulkan/icd.d/lvp_icd.x86_64.json"
    )

    add_test(NAME test_vulkan_layer_submit COMMAND test_vulkan_layer_submit)
endif()

# OpenCL interception test
if(MVGAL_BUILD_API AND OpenCL_FOUND)
    add_executable(test_opencl_intercept
        test_opencl_intercept.c
    )

    target_link_libraries(test_opencl_intercept
        PRIVATE
            mvgal_core
            Threads::Threads
            ${OpenCL_LIBRARIES}
            dl
            m
    )

    target_include_directories(test_opencl_intercept
        PRIVATE
            ${OpenCL_INCLUDE_DIRS}
    )

    add_test(NAME test_opencl_intercept COMMAND test_opencl_intercept)
endif()

# D3D11/D3D12 wrapper interception tests
if(MVGAL_BUILD_API)
    add_executable(test_d3d_wrapper
        test_d3d_wrapper.c
    )

    target_link_libraries(test_d3d_wrapper
        PRIVATE
            mvgal_d3d
            dl
            m
    )

    # Suppress unused variable warnings in test file (mock variables for documentation)
    if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
        target_compile_options(test_d3d_wrapper PRIVATE -Wno-unused-variable -Wno-format-zero-length)
    endif()

    add_test(NAME test_d3d_wrapper COMMAND test_d3d_wrapper)
endif()

# Metal wrapper interception tests
if(MVGAL_BUILD_API)
    add_executable(test_metal_wrapper
        test_metal_wrapper.c
    )

    target_link_libraries(test_metal_wrapper
        PRIVATE
            mvgal_metal
            mvgal_core
            dl
            m
            pthread
    )

    # Suppress unused variable warnings in test file (mock variables for documentation)
    if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
        target_compile_options(test_metal_wrapper PRIVATE -Wno-unused-variable -Wno-format-zero-length)
    endif()

    add_test(NAME test_metal_wrapper COMMAND test_metal_wrapper)
endif()

# ── Transport layer integration test ──────────────────────────────────
add_executable(test_mvgal_transport
    test_mvgal_transport.c
)

target_link_libraries(test_mvgal_transport
    mvgal_core
    Threads::Threads
    m
)

target_include_directories(test_mvgal_transport
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/transport
)

add_test(NAME test_mvgal_transport COMMAND test_mvgal_transport)

# ── AI Features integration test ─────────────────────────────────────
add_executable(test_mvgal_ai_features
    test_mvgal_ai_features.c
)

target_link_libraries(test_mvgal_ai_features
    mvgal_core
    Threads::Threads
    m
)

target_include_directories(test_mvgal_ai_features
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/scheduler
)

add_test(NAME test_mvgal_ai_features COMMAND test_mvgal_ai_features)

# ── DMA-BUF integration test ─────────────────────────────────────
# Tests dmabuf allocate → export → import round-trip via internal API.
# REQUIRES_KERNEL_MODULE in CI (falls back gracefully without /dev/mvgal0).
add_executable(test_dmabuf_integration
    test_dmabuf_integration.c
)

target_link_libraries(test_dmabuf_integration
    mvgal_core
    Threads::Threads
    m
)

target_include_directories(test_dmabuf_integration
    PRIVATE
        ${CMAKE_SOURCE_DIR}/src/userspace/memory
)

add_test(NAME test_dmabuf_integration COMMAND test_dmabuf_integration)

# ── Kernel UAPI probe test ───────────────────────────────────────
add_executable(test_uapi_probe
    test_uapi_probe.c
)

add_test(NAME test_uapi_probe COMMAND test_uapi_probe)

# ── Vulkan layer discovery test ────────────────────────────────
if(WITH_VULKAN AND Vulkan_FOUND)
    add_executable(test_vulkan_layer_discovery
        test_vulkan_layer_discovery.c
    )

    target_link_libraries(test_vulkan_layer_discovery
        PRIVATE
            ${Vulkan_LIBRARIES}
    )

    target_include_directories(test_vulkan_layer_discovery
        PRIVATE
            ${Vulkan_INCLUDE_DIRS}
    )

    target_compile_definitions(test_vulkan_layer_discovery
        PRIVATE
            MVGAL_TEST_LAYER_DIR="$<TARGET_FILE_DIR:mvgal_vulkan_layer>"
            MVGAL_TEST_VK_ICD_PATH="/usr/share/vulkan/icd.d/lvp_icd.x86_64.json"
    )

    add_test(NAME test_vulkan_layer_discovery COMMAND test_vulkan_layer_discovery)
endif()

# WebGPU wrapper interception tests
if(MVGAL_BUILD_API)
    add_executable(test_webgpu_wrapper_synthetic
        test_webgpu_wrapper_synthetic.c
    )

    target_link_libraries(test_webgpu_wrapper_synthetic
        PRIVATE
            mvgal_webgpu
            mvgal_core
            dl
            m
            pthread
    )

    # Suppress unused variable warnings in test file (mock variables for documentation)
    if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
        target_compile_options(test_webgpu_wrapper_synthetic PRIVATE -Wno-unused-variable -Wno-format-zero-length)
    endif()

    add_test(NAME test_webgpu_wrapper_synthetic COMMAND test_webgpu_wrapper_synthetic)
endif()

# ── Hardware Validation Test ─────────────────────────────────────────
# Tests cross-vendor GPU combinations on real hardware
add_executable(test_hardware_validation
    test_hardware_validation.c
)

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

add_test(NAME test_hardware_validation COMMAND test_hardware_validation)

# ── P2P Matrix Test ──────────────────────────────────────────────────
# Tests the P2P connectivity matrix in kernel UAPI
add_executable(test_p2p_matrix
    test_p2p_matrix.c
)

target_link_libraries(test_p2p_matrix
    ${DRM_IMPORTED_TARGET}
)

add_test(NAME test_p2p_matrix COMMAND test_p2p_matrix)
