cmake_minimum_required(VERSION 3.20)
project(gpolice_native DESCRIPTION "G-Police: Recommissioned native port" LANGUAGES C)
set(CMAKE_C_STANDARD 11)
set(PCRECOMP "${CMAKE_CURRENT_SOURCE_DIR}/third_party/pcrecomp" CACHE PATH "Pinned pcrecomp checkout")
file(GLOB HLE CONFIGURE_DEPENDS "${PCRECOMP}/runtime/win32hle/*.c")
list(FILTER HLE EXCLUDE REGEX "_selftest\\.c$")
file(GLOB LIFT CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generated/recomp_*.c")
add_library(hle STATIC ${HLE})
target_compile_definitions(hle PUBLIC RECOMP_X87_EXTENDED=1 RECOMP_STRICT_DISPATCH=1)
target_include_directories(hle PUBLIC "${PCRECOMP}/runtime/win32hle" "${PCRECOMP}/runtime/recomp32"
  "/usr/include/SDL2")
target_compile_options(hle PRIVATE -Wno-incompatible-pointer-types)
target_link_libraries(hle PUBLIC -l:libSDL2-2.0.so.0 -l:libSDL2_ttf-2.0.so.0 pthread m)
add_executable(gpolice-native src/control_menu.c src/graphics_settings.c src/graphics_menu.c src/render/native_haze.c src/ship_collisions.c src/main.c src/projection.c src/mouse_menu.c src/config_store.c src/world_options.c src/keyboard_config.c src/diagnostics.c src/config.c src/camera_tools.c src/crash.c src/snapshot.c src/compat.c src/music.c src/dinput.c src/bindings.c src/movie_kernel.c src/controls.c src/controller_weapons.c src/controls_strafe.c ${LIFT})
add_library(native-render STATIC src/crash_context.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c src/render/engine_geometry.c
  src/render/engine_sprite.c src/render/engine_tinted_sprite.c src/render/engine_texture.c src/render/engine_bridge.c
  src/render/oem_resources.c src/render/oem_runtime.c src/render/native_session.c
  src/render/engine_lines.c src/render/engine_line_variants.c src/render/engine_polygon_variants.c
  src/render/engine_aux_primitives.c src/render/engine_quad_family.c src/render/engine_scaled_entry.c src/render/engine_aux_triangle.c
  src/render/engine_general_polygon.c src/render/engine_general_polygon_entry.c
  src/render/shadows/project.c src/render/shadows/mask.c src/render/shadows/receiver-mesh.c
  src/render/shadows/native_shadow_mesh.c src/render/shadows/native_shadow_project.c
  src/render/shadows/native_shadow_collision.c src/render/shadows/native_shadow_live.c src/render/shadows/native_shadow_casters.c
  src/render/shadows/vehicle_shadows.c src/render/shadows/vehicle_sources.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c
  src/render/engine_material_state.c src/render/engine_material_resolve.c
  src/render/engine_material_scene.c src/render/engine_material_initial.c
  src/render/engine_material_mode.c src/render/engine_live_material.c src/render/engine_registration_owner.c
  src/render/engine_texture_registration.c src/render/engine_texture_slot.c
  src/render/engine_ui_material.c src/render/engine_scaled_material.c
  src/render/engine_textured_material.c src/render/engine_textured_variants.c
  src/render/hud_text.c src/render/map_text.c src/render/frontend_art.c
  src/render/frontend_background.c src/render/movie_frame.c src/render/fps_overlay.c src/render/bitmap_text.c src/render/engine_rect.c)
target_include_directories(native-render PUBLIC src/render)
target_link_libraries(native-render PUBLIC hle)
target_link_libraries(gpolice-native PRIVATE native-render hle)
target_sources(gpolice-native PRIVATE src/cockpit_extension.c src/loadout_spin.c src/debug_tools.c src/debug_tools_draw.c src/demo_tools.c src/demo_bar.c)
target_sources(gpolice-native PRIVATE src/resource_overrides.c src/resource_overrides_runtime.c)
target_compile_definitions(gpolice-native PRIVATE _GNU_SOURCE)
target_compile_options(gpolice-native PRIVATE -include ${CMAKE_CURRENT_SOURCE_DIR}/generated/recomp_funcs.h -Wno-overflow -Wno-unused-label)
add_executable(hle-host-test "${PCRECOMP}/runtime/win32hle/host_selftest.c")
target_link_libraries(hle-host-test PRIVATE hle)
enable_testing()
add_executable(crt-presentation-test tests/crt_presentation.c)
target_include_directories(crt-presentation-test PRIVATE src/render)
target_link_libraries(crt-presentation-test PRIVATE m)
target_compile_options(crt-presentation-test PRIVATE -UNDEBUG)
add_test(NAME crt-presentation-timing-geometry COMMAND crt-presentation-test)
add_executable(crt-pixels-test tests/crt_pixels.c)
target_link_libraries(crt-pixels-test PRIVATE native-render)
target_compile_options(crt-pixels-test PRIVATE -UNDEBUG)
add_test(NAME crt-shader-embed COMMAND python3 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/build_crt_shaders.py" --check)
add_test(NAME crt-monitor-assets COMMAND python3 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/build_monitor_pack.py" --check)
add_test(NAME optional-resource-overrides COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/.venv/bin/python" "${CMAKE_CURRENT_SOURCE_DIR}/tests/resource_overrides.py")
add_test(NAME hle-host COMMAND hle-host-test)
set_tests_properties(hle-host PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_executable(registry-test tests/registry.c)
target_link_libraries(registry-test PRIVATE hle)
target_compile_options(registry-test PRIVATE -UNDEBUG)
add_test(NAME registry-enumeration COMMAND registry-test)
add_executable(input-test tests/input.c src/dinput.c src/bindings.c src/config.c)
target_link_libraries(input-test PRIVATE hle)
target_compile_options(input-test PRIVATE -UNDEBUG)
add_test(NAME input-events COMMAND input-test)
set_tests_properties(input-events PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_executable(dialog-test tests/dialog.c)
target_link_libraries(dialog-test PRIVATE hle)
target_compile_options(dialog-test PRIVATE -UNDEBUG)
add_test(NAME dialog-paint-input COMMAND dialog-test)
set_tests_properties(dialog-paint-input PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_executable(path-test "${PCRECOMP}/runtime/win32hle/hle_path_selftest.c")
target_link_libraries(path-test PRIVATE hle)
add_test(NAME private-path-overlay COMMAND path-test)
add_executable(save-overlay-test tests/save_overlay.c)
target_link_libraries(save-overlay-test PRIVATE hle)
target_compile_options(save-overlay-test PRIVATE -UNDEBUG)
add_test(NAME original-file-preservation COMMAND save-overlay-test)
add_executable(strict-dispatch-test tests/strict_dispatch.c)
target_include_directories(strict-dispatch-test PRIVATE "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(strict-dispatch-test PRIVATE RECOMP_STRICT_DISPATCH=1)
target_compile_options(strict-dispatch-test PRIVATE -UNDEBUG)
add_test(NAME strict-missing-target COMMAND strict-dispatch-test)
add_executable(x87-environment-test tests/x87_host_environment.c)
target_include_directories(x87-environment-test PRIVATE "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(x87-environment-test PRIVATE RECOMP_X87_EXTENDED=1)
target_compile_options(x87-environment-test PRIVATE -UNDEBUG)
target_link_libraries(x87-environment-test PRIVATE m)
add_test(NAME x87-host-environment COMMAND x87-environment-test)
add_executable(music-test tests/music.c)
target_link_libraries(music-test PRIVATE hle)
target_compile_options(music-test PRIVATE -UNDEBUG)
add_test(NAME local-cd-audio COMMAND music-test)
set_tests_properties(local-cd-audio PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy" TIMEOUT 10)
add_executable(host-events-test tests/host_events.c)
target_link_libraries(host-events-test PRIVATE hle)
target_compile_options(host-events-test PRIVATE -UNDEBUG)
add_test(NAME threaded-host-events COMMAND host-events-test)
add_executable(movie-kernel-test tests/movie_kernel.c src/movie_kernel.c)
target_include_directories(movie-kernel-test PRIVATE "${PCRECOMP}/runtime/recomp32")
target_compile_options(movie-kernel-test PRIVATE -UNDEBUG)
add_test(NAME native-movie-transform COMMAND movie-kernel-test)
add_executable(dsound-notify-test tests/dsound_notify.c)
target_link_libraries(dsound-notify-test PRIVATE hle)
target_compile_options(dsound-notify-test PRIVATE -UNDEBUG)
add_test(NAME sound-playback-notifications COMMAND dsound-notify-test)
set_tests_properties(sound-playback-notifications PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")

add_executable(controls-test tests/controls.c tests/demo_controls_stubs.c src/camera_tools.c src/config.c src/controls.c src/controller_weapons.c src/controls_strafe.c)
target_link_libraries(controls-test PRIVATE hle)
target_compile_options(controls-test PRIVATE -UNDEBUG)
add_test(NAME imported-mod-controls COMMAND controls-test)
set_tests_properties(imported-mod-controls PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_executable(strafe-adapter-test tests/controls_strafe.c src/controls_strafe.c)
target_include_directories(strafe-adapter-test PRIVATE src "${PCRECOMP}/runtime/win32hle" "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(strafe-adapter-test PRIVATE RECOMP_X87_EXTENDED=1)
target_compile_options(strafe-adapter-test PRIVATE -UNDEBUG)
target_link_libraries(strafe-adapter-test PRIVATE m)
add_test(NAME native-strafe-adapter COMMAND strafe-adapter-test)
foreach(kind motion visual speed)
  add_executable(strafe-${kind}-test tests/controls_strafe_${kind}.c)
  target_include_directories(strafe-${kind}-test PRIVATE src)
  target_compile_options(strafe-${kind}-test PRIVATE -UNDEBUG)
  target_link_libraries(strafe-${kind}-test PRIVATE m)
  add_test(NAME strafe-${kind} COMMAND strafe-${kind}-test)
endforeach()
target_sources(strafe-visual-test PRIVATE tests/controls_strafe_visual_reference.c)

add_executable(crash-report-harness tests/crash_harness.c src/crash.c src/crash_context.c)
target_include_directories(crash-report-harness PRIVATE src "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(crash-report-harness PRIVATE RECOMP_STRICT_DISPATCH=1)
target_link_libraries(crash-report-harness PRIVATE pthread)
find_package(Python3 REQUIRED COMPONENTS Interpreter)
add_test(NAME crash-reporting COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/crash_reporting.py" --harness $<TARGET_FILE:crash-report-harness> --temporary-output)

add_executable(config-test tests/config.c src/config.c)
target_include_directories(config-test PRIVATE src)
target_compile_options(config-test PRIVATE -UNDEBUG)
add_test(NAME native-configuration COMMAND config-test "${CMAKE_CURRENT_SOURCE_DIR}/config/GPoliceNative.ini")
add_test(NAME campaign-resource-boundaries COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/audit_campaign.py")

add_executable(camera-tools-state-test tests/camera_tools_state.c)
target_include_directories(camera-tools-state-test PRIVATE src)
target_compile_options(camera-tools-state-test PRIVATE -UNDEBUG)
target_link_libraries(camera-tools-state-test PRIVATE m)
add_test(NAME native-camera-state COMMAND camera-tools-state-test)
add_executable(camera-tools-adapter-test tests/camera_tools.c src/camera_tools.c)
target_include_directories(camera-tools-adapter-test PRIVATE src)
target_compile_options(camera-tools-adapter-test PRIVATE -UNDEBUG)
target_link_libraries(camera-tools-adapter-test PRIVATE hle)
add_test(NAME native-camera-adapter COMMAND camera-tools-adapter-test)
set_tests_properties(native-camera-adapter PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_test(NAME native-camera-source-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_camera_tools_integration.py")

add_executable(keyboard-config-test tests/keyboard_config.c src/keyboard_config.c src/config.c)
target_include_directories(keyboard-config-test PRIVATE src)
target_compile_options(keyboard-config-test PRIVATE -UNDEBUG)
target_link_libraries(keyboard-config-test PRIVATE hle)
add_test(NAME native-keyboard-settings COMMAND keyboard-config-test)
set_tests_properties(native-keyboard-settings PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_test(NAME native-keyboard-source-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/keyboard_config_integration.py")

add_executable(world-options-test tests/world_options.c src/world_options.c)
target_include_directories(world-options-test PRIVATE src "${PCRECOMP}/runtime/win32hle" "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(world-options-test PRIVATE RECOMP_X87_EXTENDED=1)
target_compile_options(world-options-test PRIVATE -UNDEBUG)
target_link_libraries(world-options-test PRIVATE m)
add_test(NAME native-world-options COMMAND world-options-test)
add_test(NAME native-settings-migration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/import_mod_settings.py")
add_executable(checked-memory-test tests/checked_memory.c)
target_compile_options(checked-memory-test PRIVATE -UNDEBUG)
target_link_libraries(checked-memory-test PRIVATE hle)
add_test(NAME checked-native-resource-reads COMMAND checked-memory-test)

add_executable(config-store-test tests/config_store.c src/config.c src/config_store.c)
target_include_directories(config-store-test PRIVATE src)
target_compile_options(config-store-test PRIVATE -UNDEBUG)
add_test(NAME native-settings-persistence COMMAND config-store-test)
add_executable(mouse-menu-test tests/mouse_menu.c src/mouse_menu.c src/config.c src/config_store.c)
target_include_directories(mouse-menu-test PRIVATE src)
target_compile_options(mouse-menu-test PRIVATE -UNDEBUG)
target_link_libraries(mouse-menu-test PRIVATE hle)
add_test(NAME native-mouse-menu COMMAND mouse-menu-test)
set_tests_properties(native-mouse-menu PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_test(NAME native-mouse-menu-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/mouse_menu_integration.py")
add_test(NAME native-mouse-original-hit-testing COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/mouse_menu_hit_original.py")
add_test(NAME native-mouse-original-activity COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/mouse_activity_original.py")

add_executable(projection-test tests/projection.c src/projection.c)
target_include_directories(projection-test PRIVATE src "${PCRECOMP}/runtime/win32hle" "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(projection-test PRIVATE RECOMP_X87_EXTENDED=1)
target_compile_options(projection-test PRIVATE -UNDEBUG)
target_link_libraries(projection-test PRIVATE m)
add_test(NAME native-projection COMMAND projection-test)

foreach(kind geometry texture oem)
  add_executable(native-render-${kind}-test tests/native_render_${kind}.c)
  target_link_libraries(native-render-${kind}-test PRIVATE native-render)
  target_compile_options(native-render-${kind}-test PRIVATE -UNDEBUG)
  add_test(NAME native-render-${kind} COMMAND native-render-${kind}-test)
endforeach()
add_executable(native-render-line-variants-test tests/native_render_line_variants.c src/render/engine_line_variants.c)
target_include_directories(native-render-line-variants-test PRIVATE src/render)
target_link_libraries(native-render-line-variants-test PRIVATE m)
target_compile_options(native-render-line-variants-test PRIVATE -UNDEBUG)
add_test(NAME native-render-line-variants COMMAND native-render-line-variants-test)
# These pixel fixtures need an owned display; tests/native_render_driver.py
# creates and cleans one explicitly, so ordinary CTest never uses the desktop.
add_executable(native-render-pixels-test tests/native_render.c tests/native_guest_stubs.c)
target_link_libraries(native-render-pixels-test PRIVATE native-render)
target_compile_options(native-render-pixels-test PRIVATE -UNDEBUG)
add_executable(native-render-line-pixels-test tests/native_render_line_pixels.c src/render/engine_line_variants.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-render-line-pixels-test PRIVATE src/render)
target_link_libraries(native-render-line-pixels-test PRIVATE hle)
target_compile_options(native-render-line-pixels-test PRIVATE -UNDEBUG)
add_executable(native-render-session-test tests/native_render_session.c tests/native_guest_stubs.c)
target_link_libraries(native-render-session-test PRIVATE native-render)
target_compile_options(native-render-session-test PRIVATE -UNDEBUG)

add_executable(frontend-art-test tests/frontend_art.c src/render/frontend_art.c)
target_include_directories(frontend-art-test PRIVATE src)
target_link_libraries(frontend-art-test PRIVATE m)
target_compile_options(frontend-art-test PRIVATE -UNDEBUG)
add_test(NAME native-frontend-master-art COMMAND frontend-art-test "${CMAKE_CURRENT_SOURCE_DIR}/assets/menus/GPoliceMenus.bin")
add_test(NAME preserved-frontend-assets COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/frontend_assets.py")
add_executable(frontend-background-test tests/frontend_background.c src/render/frontend_background.c src/render/frontend_art.c src/render/engine_sprite.c)
target_include_directories(frontend-background-test PRIVATE src)
target_link_libraries(frontend-background-test PRIVATE m)
target_compile_options(frontend-background-test PRIVATE -UNDEBUG)
add_test(NAME native-frontend-image-resources COMMAND frontend-background-test "${CMAKE_CURRENT_SOURCE_DIR}/assets/menus/GPoliceMenus.bin")
add_executable(hud-map-text-test tests/hud_map_text.c src/render/hud_text.c src/render/map_text.c)
target_include_directories(hud-map-text-test PRIVATE src)
target_compile_options(hud-map-text-test PRIVATE -UNDEBUG)
target_link_libraries(hud-map-text-test PRIVATE m)
add_test(NAME native-hud-map-text COMMAND hud-map-text-test)
add_executable(hud-coverage-test tests/hud_coverage.c)
target_include_directories(hud-coverage-test PRIVATE src)
target_compile_options(hud-coverage-test PRIVATE -UNDEBUG)
add_test(NAME native-hud-glyph-coverage COMMAND hud-coverage-test)
add_test(NAME native-presentation-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/presentation_integration.py")

add_executable(fps-overlay-test tests/fps_overlay.c src/render/fps_overlay.c)
target_include_directories(fps-overlay-test PRIVATE src/render)
target_link_libraries(fps-overlay-test PRIVATE m)
target_compile_options(fps-overlay-test PRIVATE -UNDEBUG)
add_test(NAME native-fps-overlay COMMAND fps-overlay-test)
add_executable(fps-overlay-pixels-test tests/fps_overlay_pixels.c src/render/fps_overlay.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(fps-overlay-pixels-test PRIVATE src/render)
target_link_libraries(fps-overlay-pixels-test PRIVATE hle)
target_compile_options(fps-overlay-pixels-test PRIVATE -UNDEBUG)
add_executable(native-movie-pixels-test tests/native_movie_pixels.c src/render/movie_frame.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-movie-pixels-test PRIVATE src/render)
target_link_libraries(native-movie-pixels-test PRIVATE hle)
target_compile_options(native-movie-pixels-test PRIVATE -UNDEBUG)
add_executable(native-render-rect-test tests/native_render_rect.c src/render/engine_rect.c)
target_include_directories(native-render-rect-test PRIVATE src/render)
target_link_libraries(native-render-rect-test PRIVATE m)
target_compile_options(native-render-rect-test PRIVATE -UNDEBUG)
add_test(NAME native-render-rectangle COMMAND native-render-rect-test)
add_executable(native-render-rect-pixels-test tests/native_render_rect_pixels.c src/render/engine_rect.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-render-rect-pixels-test PRIVATE src/render)
target_link_libraries(native-render-rect-pixels-test PRIVATE hle)
target_compile_options(native-render-rect-pixels-test PRIVATE -UNDEBUG)
add_executable(native-sprite-storage-test tests/native_sprite_storage.c src/render/engine_sprite.c)
target_include_directories(native-sprite-storage-test PRIVATE src/render)
target_link_libraries(native-sprite-storage-test PRIVATE m)
target_compile_options(native-sprite-storage-test PRIVATE -UNDEBUG)
add_test(NAME native-sprite-storage COMMAND native-sprite-storage-test)
add_executable(native-sprite-storage-pixels-test tests/native_sprite_storage_pixels.c src/render/engine_sprite.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-sprite-storage-pixels-test PRIVATE src/render)
target_link_libraries(native-sprite-storage-pixels-test PRIVATE hle)
target_compile_options(native-sprite-storage-pixels-test PRIVATE -UNDEBUG)
add_executable(native-tinted-sprite-test tests/native_tinted_sprite.c src/render/engine_tinted_sprite.c src/render/engine_quad_family.c src/render/engine_bridge.c)
target_include_directories(native-tinted-sprite-test PRIVATE src/render)
target_link_libraries(native-tinted-sprite-test PRIVATE m)
target_compile_options(native-tinted-sprite-test PRIVATE -UNDEBUG)
add_test(NAME native-tinted-sprite COMMAND native-tinted-sprite-test)
add_executable(native-tinted-sprite-pixels-test tests/native_tinted_sprite_pixels.c src/render/engine_tinted_sprite.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-tinted-sprite-pixels-test PRIVATE src/render)
target_link_libraries(native-tinted-sprite-pixels-test PRIVATE hle)
target_compile_options(native-tinted-sprite-pixels-test PRIVATE -UNDEBUG)
add_executable(native-polygon-variants-test tests/native_polygon_variants.c src/render/engine_polygon_variants.c)
target_include_directories(native-polygon-variants-test PRIVATE src/render tests)
target_link_libraries(native-polygon-variants-test PRIVATE m)
target_compile_options(native-polygon-variants-test PRIVATE -UNDEBUG)
add_test(NAME native-polygon-variants COMMAND native-polygon-variants-test)
add_executable(native-engine-view-test tests/native_engine_view.c src/render/engine_bridge.c
  src/render/engine_geometry.c src/render/engine_sprite.c src/render/engine_tinted_sprite.c src/render/engine_quad_family.c)
target_include_directories(native-engine-view-test PRIVATE src/render)
target_link_libraries(native-engine-view-test PRIVATE m)
target_compile_options(native-engine-view-test PRIVATE -UNDEBUG)
add_test(NAME native-engine-view COMMAND native-engine-view-test)
add_executable(native-render-aux-test tests/native_render_aux.c src/render/engine_aux_primitives.c)
target_include_directories(native-render-aux-test PRIVATE src/render)
target_link_libraries(native-render-aux-test PRIVATE m)
target_compile_options(native-render-aux-test PRIVATE -UNDEBUG)
add_test(NAME native-render-aux COMMAND native-render-aux-test)
add_executable(native-quad-family-test tests/native_quad_family.c src/render/engine_quad_family.c)
target_include_directories(native-quad-family-test PRIVATE src/render)
target_link_libraries(native-quad-family-test PRIVATE m)
target_compile_options(native-quad-family-test PRIVATE -UNDEBUG)
add_test(NAME native-quad-family COMMAND native-quad-family-test)
add_executable(native-quad-family-adapter-test tests/native_quad_family_adapter.c src/render/engine_quad_family.c src/render/engine_bridge.c)
target_include_directories(native-quad-family-adapter-test PRIVATE src/render)
target_link_libraries(native-quad-family-adapter-test PRIVATE m)
target_compile_options(native-quad-family-adapter-test PRIVATE -UNDEBUG)
add_test(NAME native-quad-family-adapter COMMAND native-quad-family-adapter-test)
add_executable(native-textured-variants-test tests/native_textured_variants.c src/render/engine_textured_variants.c)
target_include_directories(native-textured-variants-test PRIVATE src/render)
target_link_libraries(native-textured-variants-test PRIVATE m)
target_compile_options(native-textured-variants-test PRIVATE -UNDEBUG)
add_test(NAME native-textured-variants COMMAND native-textured-variants-test)
add_executable(native-textured-clip-pixels-test tests/native_textured_clip_pixels.c
  src/render/engine_textured_variants.c src/render/engine_geometry.c src/render/engine_material_resolve.c src/render/engine_live_material.c src/render/native_render.c
  src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-textured-clip-pixels-test PRIVATE src/render)
target_link_libraries(native-textured-clip-pixels-test PRIVATE hle)
target_compile_options(native-textured-clip-pixels-test PRIVATE -UNDEBUG)
add_test(NAME native-textured-clip-pixels COMMAND native-textured-clip-pixels-test)
add_executable(native-material-state-test tests/native_material_state.c src/render/engine_material_state.c)
target_include_directories(native-material-state-test PRIVATE src/render)
target_compile_options(native-material-state-test PRIVATE -UNDEBUG)
add_test(NAME native-material-state COMMAND native-material-state-test)
add_executable(native-material-state-ui-test tests/native_material_state_ui.c
  src/render/engine_material_state.c src/render/engine_ui_material.c)
target_include_directories(native-material-state-ui-test PRIVATE src/render)
target_compile_options(native-material-state-ui-test PRIVATE -UNDEBUG)
add_test(NAME native-material-state-ui COMMAND native-material-state-ui-test)
add_executable(native-material-scene-test tests/native_material_scene.c src/render/engine_material_scene.c)
target_include_directories(native-material-scene-test PRIVATE src/render)
target_compile_options(native-material-scene-test PRIVATE -UNDEBUG)
add_test(NAME native-material-scene COMMAND native-material-scene-test)
add_executable(native-material-initial-test tests/native_material_initial.c src/render/engine_material_initial.c)
target_include_directories(native-material-initial-test PRIVATE src/render)
target_compile_options(native-material-initial-test PRIVATE -UNDEBUG)
add_test(NAME native-material-initial COMMAND native-material-initial-test)
add_executable(native-material-mode-test tests/native_material_mode.c src/render/engine_material_mode.c)
target_include_directories(native-material-mode-test PRIVATE src/render)
target_compile_options(native-material-mode-test PRIVATE -UNDEBUG)
add_test(NAME native-material-mode COMMAND native-material-mode-test)
add_executable(native-texture-registration-test tests/native_texture_registration.c src/render/engine_texture_registration.c)
target_include_directories(native-texture-registration-test PRIVATE src/render)
target_compile_options(native-texture-registration-test PRIVATE -UNDEBUG)
add_test(NAME native-texture-registration COMMAND native-texture-registration-test)
add_executable(native-texture-slot-test tests/native_texture_slot.c src/render/engine_texture_slot.c)
target_include_directories(native-texture-slot-test PRIVATE src/render)
target_compile_options(native-texture-slot-test PRIVATE -UNDEBUG)
add_test(NAME native-texture-slot COMMAND native-texture-slot-test)
add_executable(native-textured-material-test tests/native_textured_material.c src/render/engine_textured_material.c)
target_include_directories(native-textured-material-test PRIVATE src/render)
target_compile_options(native-textured-material-test PRIVATE -UNDEBUG)
add_test(NAME native-textured-material COMMAND native-textured-material-test)
add_executable(native-ui-material-test tests/native_ui_material.c src/render/engine_ui_material.c)
target_include_directories(native-ui-material-test PRIVATE src/render)
target_compile_options(native-ui-material-test PRIVATE -UNDEBUG)
add_test(NAME native-ui-material COMMAND native-ui-material-test)
add_executable(native-material-resolve-test tests/native_material_resolve.c src/render/engine_material_resolve.c)
target_include_directories(native-material-resolve-test PRIVATE src/render)
target_compile_options(native-material-resolve-test PRIVATE -UNDEBUG)
add_test(NAME native-material-resolve COMMAND native-material-resolve-test)
add_executable(native-scaled-material-test tests/native_scaled_material.c src/render/engine_scaled_material.c)
target_include_directories(native-scaled-material-test PRIVATE src/render)
target_compile_options(native-scaled-material-test PRIVATE -UNDEBUG)
add_test(NAME native-scaled-material COMMAND native-scaled-material-test)
add_executable(native-quad-family-pixels-test tests/native_quad_family_pixels.c src/render/engine_quad_family.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-quad-family-pixels-test PRIVATE src/render)
target_link_libraries(native-quad-family-pixels-test PRIVATE hle)
target_compile_options(native-quad-family-pixels-test PRIVATE -UNDEBUG)
add_executable(native-render-aux-pixels-test tests/native_render_aux_pixels.c src/render/engine_aux_primitives.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-render-aux-pixels-test PRIVATE src/render)
target_link_libraries(native-render-aux-pixels-test PRIVATE hle)
target_compile_options(native-render-aux-pixels-test PRIVATE -UNDEBUG)
add_executable(native-render-material-pixels-test tests/native_render_material_pixels.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-render-material-pixels-test PRIVATE src/render)
target_link_libraries(native-render-material-pixels-test PRIVATE hle)
target_compile_options(native-render-material-pixels-test PRIVATE -UNDEBUG)
add_executable(native-effect-key-pixels-test tests/native_effect_key_pixels.c src/render/engine_texture.c src/render/engine_material_resolve.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-effect-key-pixels-test PRIVATE src/render)
target_link_libraries(native-effect-key-pixels-test PRIVATE hle)
target_compile_options(native-effect-key-pixels-test PRIVATE -UNDEBUG)
add_test(NAME native-effect-key-pixels COMMAND native-effect-key-pixels-test)
add_executable(native-batch-pixels-test tests/native_batch_pixels.c
  src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-batch-pixels-test PRIVATE src/render)
target_link_libraries(native-batch-pixels-test PRIVATE hle)
target_compile_options(native-batch-pixels-test PRIVATE -UNDEBUG)
add_test(NAME native-batch-pixels COMMAND native-batch-pixels-test)
add_executable(native-polygon-pixels-test tests/native_polygon_pixels.c src/render/engine_polygon_variants.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(native-polygon-pixels-test PRIVATE src/render tests)
target_link_libraries(native-polygon-pixels-test PRIVATE hle)
target_compile_options(native-polygon-pixels-test PRIVATE -UNDEBUG)
add_test(NAME native-polygon-pixels COMMAND native-polygon-pixels-test)
# Geometry-only adapters explicitly leave session material ownership unbound.
foreach(t native-render-line-variants-test native-render-line-pixels-test
    native-render-rect-test native-render-rect-pixels-test native-polygon-variants-test
    native-render-aux-test native-render-aux-pixels-test native-polygon-pixels-test)
  target_sources(${t} PRIVATE tests/native_live_material_stubs.c src/render/engine_material_state.c)
endforeach()
foreach(t native-tinted-sprite-test native-engine-view-test native-quad-family-adapter-test)
  target_sources(${t} PRIVATE tests/native_live_material_stubs.c tests/native_session_stubs.c
    src/render/engine_material_state.c src/render/engine_ui_material.c
    src/render/engine_textured_material.c src/render/engine_textured_variants.c)
endforeach()
add_executable(native-material-owner-test tests/native_material_owner.c src/render/engine_material_state.c src/render/engine_material_initial.c src/render/engine_material_scene.c)
target_include_directories(native-material-owner-test PRIVATE src/render)
target_compile_options(native-material-owner-test PRIVATE -UNDEBUG)
add_test(NAME native-material-owner COMMAND native-material-owner-test)
add_executable(native-material-commit-test tests/native_material_commit.c src/render/engine_live_material.c)
target_include_directories(native-material-commit-test PRIVATE src/render)
target_compile_options(native-material-commit-test PRIVATE -UNDEBUG)
add_test(NAME native-material-commit COMMAND native-material-commit-test)
add_executable(native-registration-owner-test tests/native_registration_owner.c src/render/engine_registration_owner.c src/render/engine_texture_registration.c src/render/engine_texture_slot.c)
target_include_directories(native-registration-owner-test PRIVATE src/render)
target_compile_options(native-registration-owner-test PRIVATE -UNDEBUG)
add_test(NAME native-registration-owner COMMAND native-registration-owner-test)

add_executable(native-scaled-entry-test tests/native_scaled_entry.c src/render/engine_scaled_entry.c src/render/engine_quad_family.c src/render/engine_scaled_material.c)
target_include_directories(native-scaled-entry-test PRIVATE src/render)
target_link_libraries(native-scaled-entry-test PRIVATE m)
target_compile_options(native-scaled-entry-test PRIVATE -UNDEBUG)
add_test(NAME native-scaled-entry COMMAND native-scaled-entry-test)
add_executable(loadout-spin-test tests/loadout_spin.c src/loadout_spin.c)
target_include_directories(loadout-spin-test PRIVATE src)
target_compile_options(loadout-spin-test PRIVATE -UNDEBUG)
add_test(NAME loadout-spin COMMAND loadout-spin-test)
add_executable(native-smaa-test tests/native_smaa.c src/render/native_smaa.c)
target_link_libraries(native-smaa-test PRIVATE hle GL)
target_compile_options(native-smaa-test PRIVATE -UNDEBUG)
add_test(NAME native-smaa-pixels COMMAND native-smaa-test)
set_tests_properties(native-smaa-pixels PROPERTIES SKIP_RETURN_CODE 77)
add_executable(native-smaa-renderer-test tests/native_smaa_renderer.c)
target_link_libraries(native-smaa-renderer-test PRIVATE native-render)
target_compile_options(native-smaa-renderer-test PRIVATE -UNDEBUG)
add_test(NAME native-smaa-renderer COMMAND native-smaa-renderer-test)
set_tests_properties(native-smaa-renderer PROPERTIES SKIP_RETURN_CODE 77)
add_executable(native-aspect-test tests/native_aspect.c)
target_link_libraries(native-aspect-test PRIVATE native-render)
target_compile_options(native-aspect-test PRIVATE -UNDEBUG)
add_test(NAME native-aspect-viewport COMMAND native-aspect-test)
add_executable(native-aspect-pixels-test tests/native_aspect_pixels.c)
target_link_libraries(native-aspect-pixels-test PRIVATE native-render)
target_compile_options(native-aspect-pixels-test PRIVATE -UNDEBUG)
add_test(NAME native-aspect-pixels COMMAND native-aspect-pixels-test)
set_tests_properties(native-aspect-pixels PROPERTIES SKIP_RETURN_CODE 77)

add_executable(native-aux-triangle-test tests/native_aux_triangle.c src/render/engine_aux_triangle.c src/render/engine_material_state.c)
target_include_directories(native-aux-triangle-test PRIVATE src/render)
target_compile_options(native-aux-triangle-test PRIVATE -UNDEBUG)
add_test(NAME native-aux-triangle COMMAND native-aux-triangle-test)
add_executable(native-texture-stage-test tests/native_texture_stage.c src/render/engine_texture.c)
target_include_directories(native-texture-stage-test PRIVATE src/render)
target_compile_options(native-texture-stage-test PRIVATE -UNDEBUG)
add_test(NAME native-texture-stage COMMAND native-texture-stage-test)
add_executable(native-texture-capacity-test tests/native_texture_capacity.c src/render/engine_texture.c)
target_include_directories(native-texture-capacity-test PRIVATE src/render)
target_compile_options(native-texture-capacity-test PRIVATE -UNDEBUG)
add_test(NAME native-texture-capacity COMMAND native-texture-capacity-test)
add_executable(native-general-polygon-test tests/native_general_polygon.c
  src/render/engine_general_polygon.c src/render/engine_general_polygon_entry.c
  src/render/engine_material_state.c)
target_include_directories(native-general-polygon-test PRIVATE src/render)
target_compile_options(native-general-polygon-test PRIVATE -UNDEBUG)
target_link_libraries(native-general-polygon-test PRIVATE m)
add_test(NAME native-general-polygon COMMAND native-general-polygon-test)
add_executable(native-shadow-mesh-test tests/native_shadow_mesh.c
  src/render/shadows/project.c src/render/shadows/mask.c
  src/render/shadows/receiver-mesh.c src/render/shadows/native_shadow_mesh.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c)
target_include_directories(native-shadow-mesh-test PRIVATE src/render src/render/shadows)
target_link_libraries(native-shadow-mesh-test PRIVATE m)
target_compile_options(native-shadow-mesh-test PRIVATE -UNDEBUG)
add_test(NAME native-shadow-mesh COMMAND native-shadow-mesh-test)
add_executable(native-shadow-project-test tests/native_shadow_project.c
  src/render/shadows/project.c src/render/shadows/mask.c
  src/render/shadows/receiver-mesh.c src/render/shadows/native_shadow_mesh.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c src/render/shadows/native_shadow_project.c)
target_include_directories(native-shadow-project-test PRIVATE src/render src/render/shadows)
target_link_libraries(native-shadow-project-test PRIVATE m)
target_compile_options(native-shadow-project-test PRIVATE -UNDEBUG)
add_test(NAME native-shadow-project COMMAND native-shadow-project-test)
add_executable(native-shadow-pixels-test tests/native_shadow_pixels.c
  src/render/shadows/project.c src/render/shadows/mask.c
  src/render/shadows/receiver-mesh.c src/render/shadows/native_shadow_mesh.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c src/render/shadows/native_shadow_project.c src/render/native_render.c
  src/render/frontend_cache.c src/render/native_smaa.c
  src/render/engine_live_material.c src/render/engine_material_state.c src/render/engine_material_resolve.c)
target_include_directories(native-shadow-pixels-test PRIVATE src/render src/render/shadows)
target_link_libraries(native-shadow-pixels-test PRIVATE hle)
target_compile_options(native-shadow-pixels-test PRIVATE -UNDEBUG)
add_executable(native-shadow-collision-test tests/native_shadow_collision.c
  src/render/shadows/native_shadow_collision.c)
target_include_directories(native-shadow-collision-test PRIVATE src/render src/render/shadows)
target_link_libraries(native-shadow-collision-test PRIVATE hle)
target_compile_options(native-shadow-collision-test PRIVATE -UNDEBUG)
add_test(NAME native-shadow-collision COMMAND native-shadow-collision-test)
add_executable(native-shadow-live-test tests/native_shadow_live.c
  src/render/shadows/native_shadow_live.c src/render/shadows/native_shadow_casters.c src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c
  src/render/shadows/vehicle_shadows.c src/render/shadows/vehicle_sources.c)
target_include_directories(native-shadow-live-test PRIVATE src/render src/render/shadows)
target_link_libraries(native-shadow-live-test PRIVATE hle)
target_compile_options(native-shadow-live-test PRIVATE -UNDEBUG)
add_test(NAME native-shadow-live COMMAND native-shadow-live-test)
add_test(NAME native-shadow-source-integration COMMAND "${Python3_EXECUTABLE}"
  "${CMAKE_CURRENT_SOURCE_DIR}/tests/native_shadow_integration.py")
add_test(NAME verified-oem-callback-integration COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/.venv/bin/python"
  "${CMAKE_CURRENT_SOURCE_DIR}/tests/callback_integration.py")

add_executable(native-frontend-cache-test tests/native_frontend_cache.c src/render/frontend_cache.c)
target_include_directories(native-frontend-cache-test PRIVATE src/render)
target_compile_options(native-frontend-cache-test PRIVATE -UNDEBUG)
add_test(NAME native-frontend-cache COMMAND native-frontend-cache-test)
add_executable(native-frontend-cache-pixels-test tests/native_frontend_cache_pixels.c)
target_link_libraries(native-frontend-cache-pixels-test PRIVATE native-render)
target_compile_options(native-frontend-cache-pixels-test PRIVATE -UNDEBUG)

add_executable(native-depth-layers-test tests/native_depth_layers.c
  src/render/engine_polygon_variants.c
  src/render/engine_live_material.c src/render/engine_material_state.c
  src/render/engine_material_resolve.c)
target_include_directories(native-depth-layers-test PRIVATE src/render)
target_link_libraries(native-depth-layers-test PRIVATE hle)
target_compile_options(native-depth-layers-test PRIVATE -UNDEBUG)
add_test(NAME native-depth-layers COMMAND native-depth-layers-test)

add_executable(native-shadow-surfaces-test tests/native_shadow_surfaces.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c)
target_include_directories(native-shadow-surfaces-test PRIVATE src/render)
target_link_libraries(native-shadow-surfaces-test PRIVATE m)
target_compile_options(native-shadow-surfaces-test PRIVATE -UNDEBUG)
add_test(NAME native-shadow-surfaces COMMAND native-shadow-surfaces-test)

add_executable(native-shadow-silhouette-test tests/native_shadow_silhouette.c src/render/shadows/silhouette.c)
target_include_directories(native-shadow-silhouette-test PRIVATE src/render)
target_link_libraries(native-shadow-silhouette-test PRIVATE m)
target_compile_options(native-shadow-silhouette-test PRIVATE -UNDEBUG)
add_test(NAME native-shadow-silhouette COMMAND native-shadow-silhouette-test)
add_executable(vehicle-shadows-test tests/vehicle_shadows.c
  src/render/shadows/vehicle_shadows.c src/render/shadows/native_shadow_mesh.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c
  src/render/shadows/mask.c src/render/shadows/project.c src/render/shadows/receiver-mesh.c)
target_include_directories(vehicle-shadows-test PRIVATE src/render)
target_link_libraries(vehicle-shadows-test PRIVATE m)
target_compile_options(vehicle-shadows-test PRIVATE -UNDEBUG)
add_test(NAME vehicle-shadows COMMAND vehicle-shadows-test)
add_executable(shadow-optimization-test tests/shadow_optimization.c
  tests/shadow_frame_replay.c tests/reference/vehicle_before_opt.c src/render/shadows/vehicle_shadows.c
  tests/reference/shadow_surfaces_before_opt.c tests/reference/shadow_silhouette_before_opt.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c)
target_include_directories(shadow-optimization-test PRIVATE src/render src/render/shadows)
target_link_libraries(shadow-optimization-test PRIVATE m)
target_compile_options(shadow-optimization-test PRIVATE -UNDEBUG)
add_test(NAME shadow-optimization COMMAND shadow-optimization-test)

add_executable(shadow-casters-test tests/shadow_casters.c
  src/render/shadows/native_shadow_casters.c src/render/shadows/vehicle_sources.c)
target_include_directories(shadow-casters-test PRIVATE src/render)
target_compile_options(shadow-casters-test PRIVATE -UNDEBUG)
add_test(NAME shadow-casters COMMAND shadow-casters-test)

add_executable(shadow-receivers-test tests/shadow_receivers.c
  src/render/shadows/native_shadow_surfaces.c src/render/shadows/silhouette.c)
target_include_directories(shadow-receivers-test PRIVATE src/render)
target_link_libraries(shadow-receivers-test PRIVATE m)
target_compile_options(shadow-receivers-test PRIVATE -UNDEBUG)
add_test(NAME shadow-receivers COMMAND shadow-receivers-test)

add_executable(native-shadow-stencil-test tests/native_shadow_stencil.c)
target_include_directories(native-shadow-stencil-test PRIVATE src/render)
target_link_libraries(native-shadow-stencil-test PRIVATE native-render)
target_compile_options(native-shadow-stencil-test PRIVATE -UNDEBUG)
add_executable(shadow-gpu-benchmark tests/shadow_gpu_benchmark.c)
target_include_directories(shadow-gpu-benchmark PRIVATE src/render)
target_link_libraries(shadow-gpu-benchmark PRIVATE native-render)
target_compile_options(shadow-gpu-benchmark PRIVATE -UNDEBUG)

# Owned-display smoke compositing and GPU timing fixture; no desktop launch.
add_executable(native-smoke-pixels-test tests/native_smoke_pixels.c)
target_include_directories(native-smoke-pixels-test PRIVATE src/render)
target_link_libraries(native-smoke-pixels-test PRIVATE native-render)
target_compile_options(native-smoke-pixels-test PRIVATE -UNDEBUG)

add_executable(debug-tools-test tests/debug_tools.c tests/demo_ui_stubs.c src/debug_tools.c)
target_include_directories(debug-tools-test PRIVATE src)
target_link_libraries(debug-tools-test PRIVATE hle)
target_compile_options(debug-tools-test PRIVATE -UNDEBUG -Wall -Wextra -Werror)
add_test(NAME native-debug-tools COMMAND debug-tools-test)
set_tests_properties(native-debug-tools PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_test(NAME native-debug-tools-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/debug_tools_integration.py")

add_test(NAME native-campaign-selection-original COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/campaign_selection_original.py")

add_executable(demo-tools-test tests/demo_tools.c src/demo_tools.c)
target_include_directories(demo-tools-test PRIVATE src)
target_link_libraries(demo-tools-test PRIVATE hle)
target_compile_options(demo-tools-test PRIVATE -UNDEBUG -Wall -Wextra -Werror)
add_test(NAME native-demo-tools COMMAND demo-tools-test)
set_tests_properties(native-demo-tools PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy")
add_test(NAME native-demo-tools-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/demo_tools_integration.py")

add_test(NAME native-timestop-source-integration COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_timestop_integration.py")

add_executable(demo-bar-test tests/demo_bar.c src/demo_bar.c)
target_include_directories(demo-bar-test PRIVATE src)
target_link_libraries(demo-bar-test PRIVATE m)
target_compile_options(demo-bar-test PRIVATE -UNDEBUG -Wall -Wextra -Werror)
add_test(NAME native-demo-bar COMMAND demo-bar-test)

# Marked cockpit completions and ordinary/pause rendering consistency.
add_executable(cockpit-extension-test tests/cockpit_extension.c src/cockpit_extension.c)
target_include_directories(cockpit-extension-test PRIVATE src "${PCRECOMP}/runtime/win32hle" "${PCRECOMP}/runtime/recomp32")
target_compile_options(cockpit-extension-test PRIVATE -UNDEBUG)
target_link_libraries(cockpit-extension-test PRIVATE m)
add_test(NAME cockpit-extension-geometry COMMAND cockpit-extension-test)
add_test(NAME cockpit-extension-data COMMAND python3 "${CMAKE_CURRENT_SOURCE_DIR}/scripts/build_cockpit_data.py" --check)

add_executable(ship-collisions-test tests/ship_collisions.c src/ship_collisions.c)
target_include_directories(ship-collisions-test PRIVATE src "${PCRECOMP}/runtime/win32hle" "${PCRECOMP}/runtime/recomp32")
target_compile_definitions(ship-collisions-test PRIVATE RECOMP_X87_EXTENDED=1)
target_compile_options(ship-collisions-test PRIVATE -UNDEBUG)
add_test(NAME civilian-ship-collisions COMMAND ship-collisions-test "${CMAKE_CURRENT_SOURCE_DIR}/local/original-v2.gpn")
add_test(NAME civilian-ship-original-branches COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/ship_collisions_original.py")

add_executable(billboard-texture-test tests/billboard_texture.c src/render/engine_texture.c)
target_link_libraries(billboard-texture-test PRIVATE m)
target_include_directories(billboard-texture-test PRIVATE src/render)
target_compile_options(billboard-texture-test PRIVATE -UNDEBUG)
add_test(NAME billboard-texture COMMAND billboard-texture-test)


add_executable(menu-fonts-test tests/menu_fonts.c)
target_include_directories(menu-fonts-test PRIVATE src/render)
target_compile_options(menu-fonts-test PRIVATE -UNDEBUG)
add_test(NAME menu-fonts-pack COMMAND menu-fonts-test ../assets/fonts/GPoliceMenuFonts.bin)

add_executable(hud-art-test tests/hud_art.c)
target_include_directories(hud-art-test PRIVATE src/render)
target_compile_options(hud-art-test PRIVATE -UNDEBUG)
target_link_libraries(hud-art-test PRIVATE m)
add_test(NAME hud-phosphor-art COMMAND hud-art-test ../assets/hud/GPoliceHUD.bin)
add_executable(hud-pixels-test tests/hud_pixels.c)
target_link_libraries(hud-pixels-test PRIVATE native-render)
target_include_directories(hud-pixels-test PRIVATE src/render)
target_compile_options(hud-pixels-test PRIVATE -UNDEBUG)

# Private GPU fixture; run through check_bloom_gpu.py on an owned display.
add_executable(bloom-pixels-test tests/bloom_pixels.c)
target_link_libraries(bloom-pixels-test PRIVATE native-render)
target_include_directories(bloom-pixels-test PRIVATE src/render)
target_compile_options(bloom-pixels-test PRIVATE -UNDEBUG)

add_executable(bloom-catalog-test tests/bloom_catalog.c)
target_link_libraries(bloom-catalog-test PRIVATE m)
target_include_directories(bloom-catalog-test PRIVATE src/render)
target_compile_options(bloom-catalog-test PRIVATE -UNDEBUG)
add_test(NAME selective-bloom-catalog COMMAND bloom-catalog-test)
add_test(NAME native-bloom-gamma-catalog-integrity COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/bloom_gamma_integrity.py")

add_executable(native-haze-test tests/native_haze.c src/render/native_haze.c)
target_include_directories(native-haze-test PRIVATE src/render)
target_link_libraries(native-haze-test PRIVATE m)
target_compile_options(native-haze-test PRIVATE -UNDEBUG)
add_test(NAME native-haze-model-scene COMMAND native-haze-test)
add_executable(haze-pixels-test tests/haze_pixels.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(haze-pixels-test PRIVATE src/render)
target_link_libraries(haze-pixels-test PRIVATE hle)
target_compile_options(haze-pixels-test PRIVATE -UNDEBUG)
add_test(NAME native-haze-pixels COMMAND haze-pixels-test)

add_test(NAME native-haze-source-integration COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/native_haze_integration.py)
add_test(NAME native-graphics-capabilities-original COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/.venv/bin/python" "${CMAKE_CURRENT_SOURCE_DIR}/tests/graphics_capabilities_original.py")

add_executable(haze-benchmark tests/haze_benchmark.c src/render/native_render.c src/render/frontend_cache.c src/render/native_smaa.c)
target_include_directories(haze-benchmark PRIVATE src/render)
target_link_libraries(haze-benchmark PRIVATE hle)
target_compile_options(haze-benchmark PRIVATE -UNDEBUG)

add_executable(graphics-settings-test tests/graphics_settings.c src/graphics_settings.c src/config.c src/config_store.c)
target_include_directories(graphics-settings-test PRIVATE src)
target_compile_options(graphics-settings-test PRIVATE -UNDEBUG)
add_test(NAME native-graphics-settings COMMAND graphics-settings-test)
add_executable(graphics-renderer-update-test tests/graphics_renderer_update.c)
target_link_libraries(graphics-renderer-update-test PRIVATE native-render)
target_compile_options(graphics-renderer-update-test PRIVATE -UNDEBUG)
add_test(NAME native-graphics-menu-integration COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/graphics_menu_integration.py)

add_executable(graphics-menu-input-test tests/graphics_menu_input.c src/graphics_settings.c src/config.c src/config_store.c)
target_include_directories(graphics-menu-input-test PRIVATE src third_party/pcrecomp/runtime/win32hle third_party/pcrecomp/runtime/recomp32 /usr/include/SDL2)
target_compile_options(graphics-menu-input-test PRIVATE -UNDEBUG -ffunction-sections -fdata-sections)
target_link_options(graphics-menu-input-test PRIVATE -Wl,--gc-sections)
target_link_libraries(graphics-menu-input-test PRIVATE -l:libSDL2-2.0.so.0 m)
add_test(NAME native-graphics-menu-input COMMAND graphics-menu-input-test)

add_executable(control-menu-input-test tests/control_menu_input.c src/bindings.c src/config.c src/config_store.c src/keyboard_config.c)
target_link_libraries(control-menu-input-test PRIVATE hle)
target_compile_options(control-menu-input-test PRIVATE -UNDEBUG -ffunction-sections -fdata-sections)
target_link_options(control-menu-input-test PRIVATE -Wl,--gc-sections)
add_test(NAME native-control-menu-input COMMAND control-menu-input-test)

# The public checkout uses original disc graphics. Enable these checks when
# their optional presentation pack or source masters are present at configure time.
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/assets/menus/GPoliceMenus.bin")
  set_tests_properties(native-frontend-master-art native-frontend-image-resources PROPERTIES DISABLED TRUE)
endif()
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/assets/menus/replacements/loading-artwork-1536x1024.png")
  set_tests_properties(preserved-frontend-assets PROPERTIES DISABLED TRUE)
endif()
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/assets/monitor/g-police-hq-blind-artifacts-repaired-2773x1191.png")
  set_tests_properties(crt-monitor-assets PROPERTIES DISABLED TRUE)
endif()
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/assets/fonts/GPoliceMenuFonts.bin")
  set_tests_properties(menu-fonts-pack PROPERTIES DISABLED TRUE)
endif()
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/assets/hud/GPoliceHUD.bin")
  set_tests_properties(hud-phosphor-art PROPERTIES DISABLED TRUE)
endif()
