cmake_minimum_required(VERSION 3.20)
project(RageModernAssetContract LANGUAGES C)
enable_testing()
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
option(RAGE_ASSET_SANITIZERS "Instrument asset lifecycle and supporting C modules" OFF)
if(RAGE_ASSET_SANITIZERS)
    if(MSVC)
        message(FATAL_ERROR "ASan/UBSan contract requires a Unix compiler")
    endif()
    add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer)
    add_link_options(-fsanitize=address,undefined)
endif()
find_package(SDL3 CONFIG REQUIRED)
get_filename_component(ROOT "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
add_library(asset_support STATIC)
foreach(name asset_id car_paint authored_car_surface mod_manifest mod_selection
        mod_provider mod_file_snapshot mod_file_policy asset_path render_material
        texture_mipmap rmesh rmesh_replace rmesh_index rmesh_cache render_world)
    target_sources(asset_support PRIVATE "${ROOT}/src/render/${name}.c")
endforeach()
target_include_directories(asset_support PUBLIC "${ROOT}/src")
add_library(json STATIC "${ROOT}/external/yyjson/yyjson.c")
target_include_directories(json PUBLIC "${ROOT}/external/yyjson")
set(MINIZ "${ROOT}/external/libchdr/deps/miniz-3.1.2")
add_library(miniz STATIC "${MINIZ}/miniz.c")
target_include_directories(miniz PUBLIC "${MINIZ}")
target_compile_definitions(miniz PUBLIC MINIZ_NO_ARCHIVE_APIS MINIZ_NO_DEFLATE_APIS MINIZ_NO_STDIO MINIZ_NO_TIME)
add_executable(modern_assets_retry_tests "${ROOT}/tests/render/modern_assets_retry_tests.c")
foreach(name platform_paths runtime_config runtime_parse mod_assets texture_patch
        track_asset_identity sky_panorama_layout native_asset_importer_stubs modern/modern_assets
        modern/modern_prepared_materials modern/modern_png)
    target_sources(modern_assets_retry_tests PRIVATE "${ROOT}/src/port/${name}.c")
endforeach()
target_include_directories(modern_assets_retry_tests PRIVATE
    "${ROOT}/src" "${ROOT}/src/port" "${ROOT}/src/port/include" "${ROOT}/include")
target_compile_definitions(modern_assets_retry_tests PRIVATE RAGE_HAS_AUTHORED_CARS=0)
target_link_libraries(modern_assets_retry_tests PRIVATE asset_support json miniz SDL3::SDL3)
if(NOT MSVC)
    target_link_libraries(modern_assets_retry_tests PRIVATE m)
endif()
add_test(NAME modern_assets_retry COMMAND ${CMAKE_COMMAND} -E env
    --unset=RAGE_PORT_MODERN_ASSETS $<TARGET_FILE:modern_assets_retry_tests>
    "${CMAKE_CURRENT_BINARY_DIR}/fixture")
set_tests_properties(modern_assets_retry PROPERTIES TIMEOUT 30)
