Source code for simvx.core.testing.input_sim

"""InputSimulator -- simulate keyboard/mouse/touch input for headless testing."""

from __future__ import annotations

from ..input import Input

__all__ = ["InputSimulator"]


[docs] class InputSimulator: """Simulate input events for headless testing. Works by directly manipulating the Input singleton state, the same mechanism that platform adapters (GLFW, SDL3) use. Usage: from simvx.core.input import Key sim = InputSimulator() sim.press_key(Key.SPACE) runner.advance_frames(1) sim.release_key(Key.SPACE) """
[docs] def press_key(self, key) -> None: """Simulate a key press. Accepts Key enum or int.""" Input._on_key(int(key), True)
[docs] def release_key(self, key) -> None: """Simulate a key release.""" Input._on_key(int(key), False)
[docs] def tap_key(self, key) -> None: """Press and release a key in one call (instant).""" self.press_key(key) self.release_key(key)
[docs] def press_mouse(self, button: int = 1, position: tuple[float, float] | None = None) -> None: """Simulate mouse button press, optionally at a position.""" if position is not None: self.move_mouse(position[0], position[1]) Input._on_mouse_button(button, True)
[docs] def release_mouse(self, button: int = 1) -> None: """Simulate mouse button release.""" Input._on_mouse_button(button, False)
[docs] def click(self, position: tuple[float, float], button: int = 1) -> None: """Click at a screen position (press + release).""" self.press_mouse(button, position) self.release_mouse(button)
[docs] def move_mouse(self, x: float, y: float) -> None: """Move the mouse cursor to (x, y).""" Input._on_mouse_move(x, y)
[docs] def scroll(self, dx: float = 0.0, dy: float = -1.0) -> None: """Simulate scroll wheel. dy < 0 = scroll down, dy > 0 = scroll up.""" Input._scroll_delta = (dx, dy)
[docs] def touch_down(self, finger_id: int = 0, position: tuple[float, float] = (0, 0), pressure: float = 1.0) -> None: """Simulate a touch press (finger down).""" Input._update_touch(finger_id, 0, position[0], position[1], pressure)
[docs] def touch_move(self, finger_id: int = 0, position: tuple[float, float] = (0, 0), pressure: float = 1.0) -> None: """Simulate a touch move (finger drag).""" Input._update_touch(finger_id, 2, position[0], position[1], pressure)
[docs] def touch_up(self, finger_id: int = 0, position: tuple[float, float] = (0, 0)) -> None: """Simulate a touch release (finger up).""" Input._update_touch(finger_id, 1, position[0], position[1], 0.0)
[docs] def reset(self) -> None: """Reset all input state to defaults.""" Input._reset()