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)