add_executable(qol-settings-test settings_test.cpp)
target_link_libraries(qol-settings-test PRIVATE chase_qol)
target_compile_options(qol-settings-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-settings COMMAND qol-settings-test)

add_executable(qol-view-layout-test view_layout_test.cpp)
target_link_libraries(qol-view-layout-test PRIVATE chase_qol)
target_compile_options(qol-view-layout-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-view-layout COMMAND qol-view-layout-test)

add_executable(qol-game-tab-test game_tab_test.cpp)
target_link_libraries(qol-game-tab-test PRIVATE chase_qol)
target_compile_options(qol-game-tab-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-game-tab COMMAND qol-game-tab-test)
add_executable(qol-display-tab-test display_tab_test.cpp)
target_link_libraries(qol-display-tab-test PRIVATE chase_qol)
target_compile_options(qol-display-tab-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-display-tab COMMAND qol-display-tab-test)

add_executable(qol-game-options-test game_options_test.cpp)
target_link_libraries(qol-game-options-test PRIVATE chase_qol chase_runtime)
target_compile_options(qol-game-options-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-game-options COMMAND qol-game-options-test)

add_executable(qol-controls-tab-test controls_tab_test.cpp)
target_link_libraries(qol-controls-tab-test PRIVATE chase_qol)
target_compile_options(qol-controls-tab-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-controls-tab COMMAND qol-controls-tab-test)

add_executable(qol-window-apply-test window_apply_test.cpp)
target_link_libraries(qol-window-apply-test PRIVATE chase_qol chase_input)
target_compile_options(qol-window-apply-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-window-apply COMMAND qol-window-apply-test)

add_executable(qol-controls-file-test controls_file_test.cpp)
target_link_libraries(qol-controls-file-test PRIVATE chase_qol)
target_compile_options(qol-controls-file-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-controls-file COMMAND qol-controls-file-test)

add_executable(qol-controls-bindings-test controls_bindings_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_controls_bindings.cpp)
target_link_libraries(qol-controls-bindings-test PRIVATE chase_qol chase_input PkgConfig::SDL2)
target_compile_options(qol-controls-bindings-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-controls-bindings COMMAND qol-controls-bindings-test)
add_test(NAME qol-controls-default-copy COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_SOURCE_DIR}/config/controls.cfg ${CMAKE_SOURCE_DIR}/config/controls.default.cfg)

add_executable(qol-pc-controls-off-view-test pc_controls_off_view_test.cpp)
target_link_libraries(qol-pc-controls-off-view-test PRIVATE chase_qol)
target_compile_options(qol-pc-controls-off-view-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-pc-controls-off-view COMMAND qol-pc-controls-off-view-test)

add_executable(qol-active-settings-test active_settings_test.cpp)
target_link_libraries(qol-active-settings-test PRIVATE chase_qol)
target_compile_options(qol-active-settings-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-active-settings COMMAND qol-active-settings-test)

if(TARGET chase_qol_view)
  add_executable(qol-view-hook-test view_hook_test.cpp)
  target_link_libraries(qol-view-hook-test PRIVATE chase_qol_view)
  target_compile_options(qol-view-hook-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-view-hook COMMAND qol-view-hook-test)
endif()

if(TARGET chase_qol_view)
  add_executable(qol-hud-hook-test hud_hook_test.cpp)
  target_link_libraries(qol-hud-hook-test PRIVATE chase_qol_view)
  target_compile_options(qol-hud-hook-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-hud-hook COMMAND qol-hud-hook-test)
  add_executable(qol-hud-parts-hook-test hud_parts_hook_test.cpp)
  target_link_libraries(qol-hud-parts-hook-test PRIVATE chase_qol_hud)
  target_compile_options(qol-hud-parts-hook-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-hud-parts-hook COMMAND qol-hud-parts-hook-test)
  add_executable(qol-minimap-test minimap_test.cpp)
  target_link_libraries(qol-minimap-test PRIVATE chase_qol_minimap)
  target_compile_options(qol-minimap-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-minimap COMMAND qol-minimap-test)
  add_executable(qol-minimap-real-test minimap_real_test.cpp)
  target_link_libraries(qol-minimap-real-test PRIVATE chase_qol_minimap)
  target_compile_options(qol-minimap-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-minimap-real-data COMMAND qol-minimap-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-minimap-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS needs-game-data)
endif()
if(TARGET chase_qol_view)
  add_executable(qol-bottom-hook-test bottom_hook_test.cpp)
  target_link_libraries(qol-bottom-hook-test PRIVATE chase_qol_view PkgConfig::SDL2)
  target_compile_options(qol-bottom-hook-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-bottom-hook COMMAND qol-bottom-hook-test)
endif()

if(TARGET chase_qol_window)
  add_executable(qol-front-menu-real-test front_menu_real_test.cpp)
  target_link_libraries(qol-front-menu-real-test PRIVATE chase_qol_window)
  target_compile_options(qol-front-menu-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-front-menu-real-data COMMAND qol-front-menu-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-front-menu-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS needs-game-data)
endif()

if(TARGET chase_qol_paint)
  add_executable(qol-window-minimum-test window_minimum_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_window.cpp
    ${CMAKE_SOURCE_DIR}/src/runtime/qol_pc_controls.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_controls_bindings.cpp)
  target_link_libraries(qol-window-minimum-test PRIVATE chase_qol_paint chase_input PkgConfig::SDL2)
  target_compile_options(qol-window-minimum-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-window-minimum COMMAND qol-window-minimum-test)
  set_tests_properties(qol-window-minimum PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy")
  add_executable(qol-menu-stores-test menu_stores_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_controls_bindings.cpp)
  target_link_libraries(qol-menu-stores-test PRIVATE chase_qol_paint chase_input PkgConfig::SDL2)
  target_compile_options(qol-menu-stores-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-menu-stores COMMAND qol-menu-stores-test)
endif()

if(TARGET chase_qol_paint)
  add_executable(qol-pc-controls-test pc_controls_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_controls_bindings.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_pc_controls.cpp)
  target_link_libraries(qol-pc-controls-test PRIVATE chase_qol_paint chase_input PkgConfig::SDL2)
  target_compile_options(qol-pc-controls-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-pc-controls COMMAND qol-pc-controls-test)
  add_executable(qol-pc-vehicle-controls-test pc_vehicle_controls_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_controls_bindings.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_pc_controls.cpp)
  target_link_libraries(qol-pc-vehicle-controls-test PRIVATE chase_qol_paint chase_input PkgConfig::SDL2)
  target_compile_options(qol-pc-vehicle-controls-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-pc-vehicle-controls COMMAND qol-pc-vehicle-controls-test)
  add_executable(qol-controls-set-switch-test controls_set_switch_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_controls_bindings.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_pc_controls.cpp)
  target_link_libraries(qol-controls-set-switch-test PRIVATE chase_qol_paint chase_input PkgConfig::SDL2)
  target_compile_options(qol-controls-set-switch-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-controls-set-switch COMMAND qol-controls-set-switch-test)
endif()

if(TARGET chase_qol_paint)
  add_executable(qol-game-wiring-test game_wiring_test.cpp ${CMAKE_SOURCE_DIR}/src/runtime/qol_game_wiring.cpp)
  target_link_libraries(qol-game-wiring-test PRIVATE chase_qol_paint chase_runtime chase_save_progress)
  target_compile_options(qol-game-wiring-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-game-wiring COMMAND qol-game-wiring-test)
endif()
if(TARGET chase_qol_window)
  add_executable(qol-pause-entry-test pause_entry_test.cpp)
  target_link_libraries(qol-pause-entry-test PRIVATE chase_qol_window)
  target_compile_options(qol-pause-entry-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-pause-entry COMMAND qol-pause-entry-test)

  add_executable(qol-pause-entry-real-test pause_entry_real_test.cpp)
  target_link_libraries(qol-pause-entry-real-test PRIVATE chase_qol_window)
  target_compile_options(qol-pause-entry-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-pause-entry-real-data COMMAND qol-pause-entry-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-pause-entry-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS needs-game-data)
endif()

add_executable(qol-front-panel-test front_panel_test.cpp)
target_link_libraries(qol-front-panel-test PRIVATE chase_qol)
target_compile_options(qol-front-panel-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-front-panel COMMAND qol-front-panel-test)

add_executable(qol-front-page-rules-test front_page_rules_test.cpp)
target_link_libraries(qol-front-page-rules-test PRIVATE chase_qol)
target_compile_options(qol-front-page-rules-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-front-page-rules COMMAND qol-front-page-rules-test)

if(TARGET chase_qol_hud)
  add_executable(qol-movie-subtitle-overlay-test movie_subtitle_overlay_test.cpp)
  target_link_libraries(qol-movie-subtitle-overlay-test PRIVATE chase_qol_hud)
  target_compile_options(qol-movie-subtitle-overlay-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-movie-subtitle-overlay COMMAND qol-movie-subtitle-overlay-test)
  add_executable(qol-movie-subtitle-overlay-real-test movie_subtitle_overlay_real_test.cpp)
  target_link_libraries(qol-movie-subtitle-overlay-real-test PRIVATE chase_qol_hud)
  target_compile_options(qol-movie-subtitle-overlay-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-movie-subtitle-overlay-real-data COMMAND qol-movie-subtitle-overlay-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-movie-subtitle-overlay-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS needs-game-data)
endif()

add_executable(qol-front-panel-clicks-test front_panel_clicks_test.cpp)
target_link_libraries(qol-front-panel-clicks-test PRIVATE chase_qol)
target_compile_options(qol-front-panel-clicks-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-front-panel-clicks COMMAND qol-front-panel-clicks-test)

if(TARGET chase_qol_window)
  add_executable(qol-front-panel-clicks-real-test front_panel_clicks_real_test.cpp)
  target_link_libraries(qol-front-panel-clicks-real-test PRIVATE chase_qol_window)
  target_compile_options(qol-front-panel-clicks-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-front-panel-clicks-real-data COMMAND qol-front-panel-clicks-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-front-panel-clicks-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS needs-game-data)
endif()

if(TARGET chase_qol_window)
  add_executable(qol-front-panel-point-test front_panel_point_test.cpp)
  target_link_libraries(qol-front-panel-point-test PRIVATE chase_qol_window)
  target_compile_options(qol-front-panel-point-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-front-panel-point COMMAND qol-front-panel-point-test)
endif()

add_executable(qol-ui-layout-test ui_layout_test.cpp)
target_link_libraries(qol-ui-layout-test PRIVATE chase_qol)
target_compile_options(qol-ui-layout-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-ui-layout COMMAND qol-ui-layout-test)

add_executable(qol-ui-nav-test ui_nav_test.cpp)
target_link_libraries(qol-ui-nav-test PRIVATE chase_qol)
target_compile_options(qol-ui-nav-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-ui-nav COMMAND qol-ui-nav-test)

add_executable(qol-controls-swap-test controls_swap_test.cpp)
target_link_libraries(qol-controls-swap-test PRIVATE chase_qol)
target_compile_options(qol-controls-swap-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-controls-swap COMMAND qol-controls-swap-test)

add_executable(qol-keep-settings-test keep_settings_test.cpp)
target_link_libraries(qol-keep-settings-test PRIVATE chase_qol)
target_compile_options(qol-keep-settings-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-keep-settings COMMAND qol-keep-settings-test)

add_executable(qol-ui-page-game-test ui_page_game_test.cpp)
target_link_libraries(qol-ui-page-game-test PRIVATE chase_qol)
target_compile_options(qol-ui-page-game-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-ui-page-game COMMAND qol-ui-page-game-test)

add_executable(qol-ui-page-display-test ui_page_display_test.cpp)
target_link_libraries(qol-ui-page-display-test PRIVATE chase_qol)
target_compile_options(qol-ui-page-display-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-ui-page-display COMMAND qol-ui-page-display-test)

add_executable(qol-ui-page-controls-test ui_page_controls_test.cpp)
target_link_libraries(qol-ui-page-controls-test PRIVATE chase_qol)
target_compile_options(qol-ui-page-controls-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-ui-page-controls COMMAND qol-ui-page-controls-test)

add_executable(qol-mouse-sensitivity-test mouse_sensitivity_test.cpp)
target_link_libraries(qol-mouse-sensitivity-test PRIVATE chase_qol)
target_compile_options(qol-mouse-sensitivity-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-mouse-sensitivity COMMAND qol-mouse-sensitivity-test)

add_executable(qol-ui-page-qol-test ui_page_qol_test.cpp)
target_link_libraries(qol-ui-page-qol-test PRIVATE chase_qol)
target_compile_options(qol-ui-page-qol-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-ui-page-qol COMMAND qol-ui-page-qol-test)

if(TARGET chase_qol_paint)
  add_executable(qol-ui-backdrop-test ui_backdrop_test.cpp)
  target_link_libraries(qol-ui-backdrop-test PRIVATE chase_qol_paint)
  target_compile_options(qol-ui-backdrop-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-ui-backdrop COMMAND qol-ui-backdrop-test)
endif()

if(TARGET chase_qol_paint)
  add_executable(qol-ui-paint-test ui_paint_test.cpp)
  target_link_libraries(qol-ui-paint-test PRIVATE chase_qol_paint)
  target_compile_options(qol-ui-paint-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-ui-paint COMMAND qol-ui-paint-test)
endif()

if(TARGET chase_qol_paint)
  add_executable(qol-ui-menu-test ui_menu_test.cpp)
  target_link_libraries(qol-ui-menu-test PRIVATE chase_qol_paint)
  target_compile_options(qol-ui-menu-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-ui-menu COMMAND qol-ui-menu-test)
endif()

add_executable(qol-held-keys-switch-test held_keys_switch_test.cpp)
target_link_libraries(qol-held-keys-switch-test PRIVATE chase_qol)
target_compile_options(qol-held-keys-switch-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-held-keys-switch COMMAND qol-held-keys-switch-test)

if(TARGET chase_qol_window)
  add_executable(qol-escape-pc-controls-test escape_pc_controls_test.cpp)
  target_link_libraries(qol-escape-pc-controls-test PRIVATE chase_qol)
  target_compile_options(qol-escape-pc-controls-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-escape-pc-controls COMMAND qol-escape-pc-controls-test)
  add_executable(qol-pc-mouse-camera-test pc_mouse_camera_test.cpp)
  target_link_libraries(qol-pc-mouse-camera-test PRIVATE chase_qol_window chase_runtime)
  target_compile_options(qol-pc-mouse-camera-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-pc-mouse-camera COMMAND qol-pc-mouse-camera-test)
  add_executable(qol-quit-event-test quit_event_test.cpp)
  target_link_libraries(qol-quit-event-test PRIVATE chase_qol_window)
  target_compile_options(qol-quit-event-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-quit-event COMMAND qol-quit-event-test)
  set_tests_properties(qol-quit-event PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=dummy")
  add_executable(qol-ui-menu-window-real-test ui_menu_window_real_test.cpp)
  target_link_libraries(qol-ui-menu-window-real-test PRIVATE chase_qol_window)
  target_compile_options(qol-ui-menu-window-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-ui-menu-window-real-data COMMAND qol-ui-menu-window-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-ui-menu-window-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS "needs-game-data;needs-display"
    ENVIRONMENT "SDL_VIDEODRIVER=offscreen")
endif()

if(TARGET chase-game)
  set(PC_VEHICLE_CONFIG_DIR "${CMAKE_BINARY_DIR}/config-pc-vehicle")
  configure_file(${CMAKE_SOURCE_DIR}/config/controls.cfg ${PC_VEHICLE_CONFIG_DIR}/controls.cfg COPYONLY)
  configure_file(${CMAKE_SOURCE_DIR}/config/controls.default.cfg ${PC_VEHICLE_CONFIG_DIR}/controls.default.cfg COPYONLY)
  file(WRITE ${PC_VEHICLE_CONFIG_DIR}/qol.cfg "window_mode windowed\nresolution 960x600\nmaster Custom\npc_controls on\n")
  add_test(NAME qol-pc-vehicle-controls-game COMMAND chase-game
    --fib "${CHASE_ROMFS_DIR}/lego_city3ds.fib" --names "${CHASE_ROMFS_DIR}/lego_city3ds.csv"
    --config "${PC_VEHICLE_CONFIG_DIR}/controls.cfg"
    --level levels/levels/lvl_01_cherrytreehills/lvl_01_cherrytreehills_main.blvl --no-start-cutscenes
    --call-script 1-1_SO_VanFixed --start "866.0 52.0 691.0"
    --script "0 0 60;0 0 3 X;0 0 140;0 0 60 A;at 820.0 18.5 1047.0;0 0 393;0 0 1 A")
  set_tests_properties(qol-pc-vehicle-controls-game PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=offscreen;SDL_AUDIODRIVER=dummy"
    LABELS "needs-game-data;slow" TIMEOUT 300
    PASS_REGULAR_EXPRESSION "jump in started at update 60.*PC vehicle controls on.*exiting at update 306.*PC vehicle controls off")
  add_test(NAME qol-pc-vehicle-controls-game-original COMMAND chase-game
    --fib "${CHASE_ROMFS_DIR}/lego_city3ds.fib" --names "${CHASE_ROMFS_DIR}/lego_city3ds.csv"
    --config "${CMAKE_BINARY_DIR}/config/controls.cfg"
    --level levels/levels/lvl_01_cherrytreehills/lvl_01_cherrytreehills_main.blvl --no-start-cutscenes
    --call-script 1-1_SO_VanFixed --start "866.0 52.0 691.0"
    --script "0 0 60;0 0 3 X;0 0 140;0 0 60 A;at 820.0 18.5 1047.0;0 0 393;0 0 1 A")
  set_tests_properties(qol-pc-vehicle-controls-game-original PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=offscreen;SDL_AUDIODRIVER=dummy"
    LABELS "needs-game-data;slow" TIMEOUT 300
    PASS_REGULAR_EXPRESSION "jump in started at update 60.*exiting at update 306"
    FAIL_REGULAR_EXPRESSION "PC vehicle controls")
endif()

if(TARGET chase_runtime AND TARGET chase_assets)
  add_executable(qol-view-edges-real-test view_edges_real_test.cpp)
  target_link_libraries(qol-view-edges-real-test PRIVATE chase_runtime chase_assets)
  target_compile_options(qol-view-edges-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-view-edges-real-data COMMAND qol-view-edges-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-view-edges-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS "needs-game-data;slow")
endif()

if(TARGET chase_runtime)
  add_executable(qol-view-distance-test view_distance_test.cpp)
  target_link_libraries(qol-view-distance-test PRIVATE chase_qol chase_runtime)
  target_compile_options(qol-view-distance-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-view-distance COMMAND qol-view-distance-test)
endif()

if(TARGET chase_qol_paint)
  add_executable(qol-view-distance-menu-test view_distance_menu_test.cpp)
  target_link_libraries(qol-view-distance-menu-test PRIVATE chase_qol_paint)
  target_compile_options(qol-view-distance-menu-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-view-distance-menu COMMAND qol-view-distance-menu-test)
endif()

add_executable(qol-slot-page-entry-test slot_page_entry_test.cpp)
target_link_libraries(qol-slot-page-entry-test PRIVATE chase_qol)
target_compile_options(qol-slot-page-entry-test PRIVATE -Wall -Wextra -Wpedantic)
add_test(NAME qol-slot-page-entry COMMAND qol-slot-page-entry-test)

if(TARGET chase_qol_window)
  add_executable(qol-slot-page-entry-real-test slot_page_entry_real_test.cpp)
  target_link_libraries(qol-slot-page-entry-real-test PRIVATE chase_qol_window)
  target_compile_options(qol-slot-page-entry-real-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-slot-page-entry-real-data COMMAND qol-slot-page-entry-real-test
    "${CHASE_ROMFS_DIR}/lego_city3ds.fib" "${CHASE_ROMFS_DIR}/lego_city3ds.csv")
  set_tests_properties(qol-slot-page-entry-real-data PROPERTIES SKIP_RETURN_CODE 77 LABELS needs-game-data)
endif()

if(TARGET chase_runtime)
  add_executable(qol-room-request-hook-test room_request_hook_test.cpp)
  target_link_libraries(qol-room-request-hook-test PRIVATE chase_qol chase_runtime)
  target_compile_options(qol-room-request-hook-test PRIVATE -Wall -Wextra -Wpedantic)
  add_test(NAME qol-room-request-hook COMMAND qol-room-request-hook-test)
endif()

if(TARGET chase-game)
  # Room requests of the widened view and the View distance slider (QOLFS-20, QOLVD-5) in Cherry Tree Hills at the start position of
  # game-room-streaming (the police station entrance after mission 1-1). Original first: the default config (no qol.cfg) loads the
  # original 7 rooms and nothing more. Improved at x1.0, heading 100: the 16:9 strip adds Room20 (nearest box point 164.98 from the
  # camera). Improved at x20.0, heading 11.3: every room of the level (43) is requested at update 0 and finishes loading at update 9
  # (kRoomLoadUpdates). Runs of the port by 20261103-large-E on 2026-11-03.
  set(ROOM_REQUEST_START --fib "${CHASE_ROMFS_DIR}/lego_city3ds.fib" --names "${CHASE_ROMFS_DIR}/lego_city3ds.csv"
    --level levels/levels/lvl_01_cherrytreehills/lvl_01_cherrytreehills_main.blvl --no-start-cutscenes
    --start "903.71875 16.573267 1113.328247" --window 960x540 --script "0 0 12")
  foreach(variant strip x20)
    set(ROOM_REQUEST_CONFIG_DIR "${CMAKE_BINARY_DIR}/config-room-request-${variant}")
    configure_file(${CMAKE_SOURCE_DIR}/config/controls.cfg ${ROOM_REQUEST_CONFIG_DIR}/controls.cfg COPYONLY)
    configure_file(${CMAKE_SOURCE_DIR}/config/controls.default.cfg ${ROOM_REQUEST_CONFIG_DIR}/controls.default.cfg COPYONLY)
  endforeach()
  file(WRITE ${CMAKE_BINARY_DIR}/config-room-request-strip/qol.cfg "window_mode windowed\nresolution 960x540\nmaster Improved\n")
  file(WRITE ${CMAKE_BINARY_DIR}/config-room-request-x20/qol.cfg "window_mode windowed\nresolution 960x540\nmaster Improved\nview_distance 20.0\n")
  add_test(NAME qol-room-request-game-original COMMAND chase-game ${ROOM_REQUEST_START} --facing 100
    --config "${CMAKE_BINARY_DIR}/config/controls.cfg" --save-out "${CMAKE_BINARY_DIR}/qol-room-request-original.dat")
  set_tests_properties(qol-room-request-game-original PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=offscreen;SDL_AUDIODRIVER=dummy"
    LABELS needs-game-data PASS_REGULAR_EXPRESSION "room streaming: 43 rooms, start Room7, 7 loaded" FAIL_REGULAR_EXPRESSION "rooms loaded:")
  add_test(NAME qol-room-request-game-strip COMMAND chase-game ${ROOM_REQUEST_START} --facing 100
    --config "${CMAKE_BINARY_DIR}/config-room-request-strip/controls.cfg" --save-out "${CMAKE_BINARY_DIR}/qol-room-request-strip.dat")
  set_tests_properties(qol-room-request-game-strip PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=offscreen;SDL_AUDIODRIVER=dummy"
    LABELS needs-game-data
    PASS_REGULAR_EXPRESSION "room streaming: 43 rooms, start Room7, 7 loaded.*rooms loaded: 8 at update 9\nroom 20 loaded at update 9: nearest box point 164\\.9")
  add_test(NAME qol-room-request-game-x20 COMMAND chase-game ${ROOM_REQUEST_START} --facing 11.3
    --config "${CMAKE_BINARY_DIR}/config-room-request-x20/controls.cfg" --save-out "${CMAKE_BINARY_DIR}/qol-room-request-x20.dat")
  set_tests_properties(qol-room-request-game-x20 PROPERTIES ENVIRONMENT "SDL_VIDEODRIVER=offscreen;SDL_AUDIODRIVER=dummy"
    LABELS needs-game-data PASS_REGULAR_EXPRESSION "room streaming: 43 rooms, start Room7, 9 loaded.*rooms loaded: 43 at update 9")
endif()
