From e76c53d63a5cebb0e1ad6c4040a07cd271f920eb Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Sun, 9 Aug 2026 19:17:07 -0700 Subject: [PATCH] tests: update Hybrid integration guards --- recompiler/src/config_loader.h | 8 +++----- runtime/tests/test_hybrid_dev_any_input.py | 14 ++++++------- runtime/tests/test_mod_controller_override.py | 20 +++++++++---------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/recompiler/src/config_loader.h b/recompiler/src/config_loader.h index 91611d79..6590f71c 100644 --- a/recompiler/src/config_loader.h +++ b/recompiler/src/config_loader.h @@ -114,10 +114,9 @@ struct WidescreenAspectConeConfig { std::array queue_capacities{}; std::array queue_type_masks{}; }; -// Parse/format a pad mode. pad_mode_from_string accepts "hybrid"/"analog"/ -// "digital" (case-insensitive) and returns `fallback` for anything else. -// Strict: for game.toml. THROWS on "hybrid" — the mode is mod-only and must -// not be declared by a game. +// Parse/format a pad mode. Strict game.toml parsing accepts "analog" or +// "digital" (case-insensitive), returns `fallback` for unknown values, and +// THROWS on "hybrid" — the mode is mod-only and must not be declared by a game. int pad_mode_from_string(const std::string& s, int fallback); // Lenient: for a user's settings.toml, where a stale persisted "hybrid" must // migrate to analog rather than refuse to launch. @@ -486,7 +485,6 @@ struct RuntimeConfig { int default_p1_mode = PAD_MODE_ANALOG; int default_p2_mode = PAD_MODE_ANALOG; - // lock_mode: when true the launcher HIDES the whole pad-mode selector // (Hybrid | Analog | D-Pad) and forces every port to default_p1_mode. For a // game that supports exactly one pad type — e.g. Tomba 2, whose driver only diff --git a/runtime/tests/test_hybrid_dev_any_input.py b/runtime/tests/test_hybrid_dev_any_input.py index d514bd80..26185f60 100644 --- a/runtime/tests/test_hybrid_dev_any_input.py +++ b/runtime/tests/test_hybrid_dev_any_input.py @@ -14,21 +14,21 @@ assert "e && (e[0] == '0'" not in MAIN, ( "PSX_DEV_INPUT must not use the old default-on/explicit-disable predicate" ) -assert "hybrid_stick_active(const PlayerInput& p, bool dev_any)" in MAIN -assert "hybrid_dpad_active(const PlayerInput& p, int player, bool dev_any)" in MAIN -assert "hybrid_stick_active(p, dev_here)" in MAIN -assert "hybrid_dpad_active(p, player, dev_here)" in MAIN +assert "hybrid_stick_active(const PlayerInput& p, const PadSources& src)" in MAIN +assert "hybrid_dpad_active(const PlayerInput& p, int player," in MAIN +assert "hybrid_stick_active(p, src)" in MAIN +assert "hybrid_dpad_active(p, player, src)" in MAIN stick_body = MAIN.split( - "static bool hybrid_stick_active(const PlayerInput& p, bool dev_any)", 1 + "static bool hybrid_stick_active(const PlayerInput& p, const PadSources& src)", 1 )[1].split("static bool hybrid_dpad_active", 1)[0] dpad_body = MAIN.split( - "static bool hybrid_dpad_active(const PlayerInput& p, int player, bool dev_any)", + "static bool hybrid_dpad_active(const PlayerInput& p, int player,", 1, )[1].split("/* Sample each player's live device state", 1)[0] for name, body, detector in ( - ("stick", stick_body, "controller_stick_active(handle)"), + ("stick", stick_body, "controller_stick_active(handle, controller_deadzone)"), ("D-pad", dpad_body, "controller_dpad_active(handle)"), ): assert "SDL_NumJoysticks()" in body, ( diff --git a/runtime/tests/test_mod_controller_override.py b/runtime/tests/test_mod_controller_override.py index 9e71aacd..d525cffc 100644 --- a/runtime/tests/test_mod_controller_override.py +++ b/runtime/tests/test_mod_controller_override.py @@ -18,16 +18,16 @@ for symbol in ( ): assert symbol in HEADER, f"missing trusted-plugin controller API: {symbol}" -reset = """g_mod_controller_mode_override[0] = -1; - g_mod_controller_mode_override[1] = -1; - mod_runtime_activate_plugins();""" -apply = """if (g_mod_controller_mode_override[0] >= 0) - p1_mode = g_mod_controller_mode_override[0]; - if (g_mod_controller_mode_override[1] >= 0) - p2_mode = g_mod_controller_mode_override[1];""" +reset0 = "g_mod_controller_mode_override[0] = -1;" +reset1 = "g_mod_controller_mode_override[1] = -1;" +activate = "mod_runtime_activate_plugins();" +apply0 = "player_mode[0] = g_mod_controller_mode_override[0];" +apply1 = "player_mode[1] = g_mod_controller_mode_override[1];" -assert reset in MAIN, "controller overrides must reset before every activation pass" -assert apply in MAIN, "controller overrides must replace the resolved launch modes" -assert MAIN.index(reset) < MAIN.index(apply), "reset/activate must precede application" +for snippet in (reset0, reset1, activate, apply0, apply1): + assert snippet in MAIN, f"missing controller override lifecycle step: {snippet}" + +assert MAIN.index(reset0) < MAIN.index(activate) < MAIN.index(apply0) +assert MAIN.index(reset1) < MAIN.index(activate) < MAIN.index(apply1) print("mod controller override lifecycle guard passed")