cmake_minimum_required(VERSION 3.24)
project(roadwars LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Match the static release CRT used by official godot-cpp Windows builds.
if(MSVC)
  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
endif()
option(ROADWARS_BUILD_GODOT "Build the Godot GDExtension" OFF)
include(CTest)
if(BUILD_TESTING)
  add_executable(roadwars_single_catalog_test tests/core/single_catalog_test.cpp)
  target_link_libraries(roadwars_single_catalog_test PRIVATE roadwars_core)
  add_test(NAME single_catalog COMMAND roadwars_single_catalog_test)
  set_tests_properties(single_catalog PROPERTIES SKIP_RETURN_CODE 77)
  add_executable(roadwars_race_replay_test tests/core/race_replay_test.cpp)
  target_link_libraries(roadwars_race_replay_test PRIVATE roadwars_core)
  add_test(NAME race_replay COMMAND roadwars_race_replay_test)
  add_executable(roadwars_garage_session_test tests/core/garage_session_test.cpp)
  target_link_libraries(roadwars_garage_session_test PRIVATE roadwars_core)
  add_test(NAME garage_session COMMAND roadwars_garage_session_test)
endif()
add_subdirectory(game_src)
if(ROADWARS_BUILD_GODOT)
  add_subdirectory(platform/godot)
endif()
if(BUILD_TESTING)
  add_executable(roadwars_graphics_settings_test tests/core/graphics_settings_test.cpp)
  target_link_libraries(roadwars_graphics_settings_test PRIVATE roadwars_core)
  add_test(NAME graphics_settings COMMAND roadwars_graphics_settings_test)
  foreach(frontend_case IN ITEMS cockpit_frontend frontend_video frontend_localization frontend_custom frontend_scene menu_frontend race_route race_ai race_session race_collision race_loadout race_ai_combat vehicle_equipment_effects weapon_runtime turret_runtime race_turrets weapon_projectiles combat_frame rear_weapon_effects guided_weapon_runtime special_weapon_effects contact_weapon_runtime rear_weapon_instances scene_turret_combat weapon_trails race_combat_presentation vehicle_combat skeletal_mesh_runtime race_callback_registry combat_audio scene_electron_traps scene_weather vehicle_damage_particles weapon_muzzle_visuals chimney_particles vehicle_damage_visuals race_session_combat_lifecycle mesh_attachment)
    add_executable(roadwars_${frontend_case}_test tests/core/${frontend_case}_test.cpp)
    target_link_libraries(roadwars_${frontend_case}_test PRIVATE roadwars_core)
    add_test(NAME ${frontend_case} COMMAND roadwars_${frontend_case}_test)
  endforeach()
  add_executable(roadwars_race_music_test tests/core/race_music_test.cpp)
  target_link_libraries(roadwars_race_music_test PRIVATE roadwars_core)
  add_test(NAME race_music COMMAND roadwars_race_music_test)
  add_executable(roadwars_race_frontend_test tests/core/race_frontend_test.cpp)
  target_link_libraries(roadwars_race_frontend_test PRIVATE roadwars_core)
  add_test(NAME race_frontend COMMAND roadwars_race_frontend_test)
  add_executable(roadwars_simulation_clock_test tests/core/simulation_clock_test.cpp)
  target_link_libraries(roadwars_simulation_clock_test PRIVATE roadwars_core)
  add_test(NAME simulation_clock COMMAND roadwars_simulation_clock_test)
  add_executable(roadwars_frame_independence_probe tests/core/frame_independence_probe.cpp)
  target_link_libraries(roadwars_frame_independence_probe PRIVATE roadwars_core)
  foreach(case IN ITEMS chrome_mapping track_animation weapon_mounts skid_marks contact_orientation wall_contact asset_formats vehicle_dynamics wall_response texture_pipeline track_render_settings steering particle_effects coordinate_conversion wheel_pose engine_audio original_camera collision_audio tire_audio)
    if(case STREQUAL "wall_contact" OR case STREQUAL "wall_response")
      set(case_source tests/core/${case}_tests.cpp)
    else()
      set(case_source tests/core/${case}_test.cpp)
    endif()
    add_executable(roadwars_${case}_test ${case_source})
    target_link_libraries(roadwars_${case}_test PRIVATE roadwars_core)
    add_test(NAME ${case} COMMAND roadwars_${case}_test)
  endforeach()
  add_executable(roadwars_track_animation_probe tests/core/track_animation_probe.cpp)
  target_link_libraries(roadwars_track_animation_probe PRIVATE roadwars_core)
  add_executable(roadwars_asset_probe tests/core/asset_probe.cpp)
  add_executable(roadwars_track_render_probe tests/core/track_render_probe.cpp)
  target_link_libraries(roadwars_track_render_probe PRIVATE roadwars_core)
  add_executable(roadwars_vehicle_probe tests/core/vehicle_probe.cpp)
  target_link_libraries(roadwars_vehicle_probe PRIVATE roadwars_core)
  add_executable(roadwars_track_probe tests/core/track_probe.cpp)
  target_link_libraries(roadwars_track_probe PRIVATE roadwars_core)
  target_link_libraries(roadwars_asset_probe PRIVATE roadwars_core)
  add_executable(roadwars_core_test tests/core/runtime_test.cpp)
  target_link_libraries(roadwars_core_test PRIVATE roadwars_core)
  add_test(NAME core COMMAND roadwars_core_test)
  add_executable(roadwars_initialization_test tests/core/game_initialization_test.cpp)
  target_link_libraries(roadwars_initialization_test PRIVATE roadwars_core)
  add_test(NAME shared_initialization COMMAND roadwars_initialization_test)
  add_executable(roadwars_entry_test tests/core/game_entry_test.cpp)
  target_link_libraries(roadwars_entry_test PRIVATE roadwars_core)
  add_test(NAME entry_loop COMMAND roadwars_entry_test)
  find_package(Python3 REQUIRED COMPONENTS Interpreter)
  add_executable(roadwars_not_implemented_test tests/core/not_implemented_test.cpp)
  target_link_libraries(roadwars_not_implemented_test PRIVATE roadwars_core)
  target_compile_definitions(roadwars_not_implemented_test PRIVATE NDEBUG)
  add_test(NAME unimplemented_trace COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/test_not_implemented.py $<TARGET_FILE:roadwars_not_implemented_test>)
  add_test(NAME scripts COMMAND ${Python3_EXECUTABLE} -m unittest discover -s tests/scripts WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
  add_test(NAME boundaries COMMAND ${Python3_EXECUTABLE} scripts/check_boundaries.py WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
  # Research records are local-only and are absent from a public checkout.
  if(EXISTS "${PROJECT_SOURCE_DIR}/docs/functions.csv")
    add_test(NAME progress COMMAND ${Python3_EXECUTABLE} scripts/progress.py check WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
  endif()
  if(EXISTS "${PROJECT_SOURCE_DIR}/docs/functions.csv"
      AND EXISTS "${PROJECT_SOURCE_DIR}/docs/agent/class_layout.json"
      AND EXISTS "${PROJECT_SOURCE_DIR}/docs/agent/class_generation.json"
      AND EXISTS "${PROJECT_SOURCE_DIR}/docs/agent/evidence/roadwars_inventory.json")
    add_test(NAME generated_classes COMMAND ${Python3_EXECUTABLE} scripts/generate_classes.py --check WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
  endif()
endif()
