cmake_minimum_required(VERSION 3.20)
project(LoOptiscalerLoaderTests LANGUAGES CXX)
enable_testing()
get_filename_component(REPO_ROOT "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE)
add_executable(LoOptiscalerLoaderTest loader_test.cpp
    "${REPO_ROOT}/LostOdysseyRecomp/gpu/optiscaler_loader.cpp")
target_include_directories(LoOptiscalerLoaderTest PRIVATE "${REPO_ROOT}/LostOdysseyRecomp")
target_compile_features(LoOptiscalerLoaderTest PRIVATE cxx_std_20)
set_target_properties(LoOptiscalerLoaderTest PROPERTIES CXX_SCAN_FOR_MODULES OFF)
if(MSVC)
    target_compile_options(LoOptiscalerLoaderTest PRIVATE /W4 /utf-8)
else()
    target_compile_options(LoOptiscalerLoaderTest PRIVATE -Wall -Wextra -Werror -pedantic)
endif()

if(WIN32)
    add_library(LoOptiscalerLoaderFixture SHARED loader_fixture.cpp)
    set_target_properties(LoOptiscalerLoaderFixture PROPERTIES PREFIX "" OUTPUT_NAME OptiScaler CXX_SCAN_FOR_MODULES OFF)
    add_dependencies(LoOptiscalerLoaderTest LoOptiscalerLoaderFixture)
    if(MINGW)
        target_link_options(LoOptiscalerLoaderTest PRIVATE -municode)
    endif()
    # The timeout turns a loader regression that brings back a modal Windows
    # error dialog into a quick failure instead of ctest's 1500 s default.
    foreach(scenario IN ITEMS disabled no-sdk conflict relative wrong-name missing invalid-dll loaded)
        add_test(NAME optiscaler_${scenario} COMMAND LoOptiscalerLoaderTest
            ${scenario} "$<TARGET_FILE:LoOptiscalerLoaderFixture>")
        set_tests_properties(optiscaler_${scenario} PROPERTIES TIMEOUT 60)
    endforeach()
else()
    foreach(scenario IN ITEMS disabled native-platform)
        add_test(NAME optiscaler_${scenario} COMMAND LoOptiscalerLoaderTest ${scenario})
        set_tests_properties(optiscaler_${scenario} PROPERTIES TIMEOUT 60)
    endforeach()
endif()
