from __future__ import annotations from typing import Any from core.models import ActiveApp from driver.base import Driver PNG_10X20 = ( b"\x89PNG\r\n\x1a\n" b"\x00\x00\x00\r" b"IHDR" b"\x00\x00\x00\x0a" b"\x00\x00\x00\x14" ) TREE_XML = """ """ class FakeDriver(Driver): def __init__( self, *, fail_connect: bool = False, tree: Any = TREE_XML, screenshot: bytes = PNG_10X20, active_app: ActiveApp | None = None, ) -> None: self.fail_connect = fail_connect self.connected = False self.calls: list[tuple[str, tuple[Any, ...]]] = [] self._tree = tree self._screenshot = screenshot self._active_app = active_app def connect(self) -> None: self.calls.append(("connect", ())) if self.fail_connect: raise RuntimeError("connection refused") self.connected = True def disconnect(self) -> None: self.calls.append(("disconnect", ())) self.connected = False def screenshot(self) -> bytes: self.calls.append(("screenshot", ())) return self._screenshot def tap(self, x: float, y: float) -> None: self.calls.append(("tap", (x, y))) def long_press(self, x: float, y: float, duration_ms: int = 1200) -> None: self.calls.append(("long_press", (x, y, duration_ms))) def swipe( self, start_x: float, start_y: float, end_x: float, end_y: float, duration_ms: int = 500, ) -> None: self.calls.append(("swipe", (start_x, start_y, end_x, end_y, duration_ms))) def swipe_path( self, waypoints: list[tuple[float, float]], duration_ms: int ) -> None: self.calls.append(("swipe_path", (tuple(waypoints), duration_ms))) def double_tap(self, x: float, y: float, interval_ms: int = 80) -> None: self.calls.append(("double_tap", (x, y, interval_ms))) def input(self, text: str) -> None: self.calls.append(("input", (text,))) def launch(self, app_id: str) -> None: self.calls.append(("launch", (app_id,))) def terminate(self, app_id: str) -> None: self.calls.append(("terminate", (app_id,))) def tree(self) -> Any: self.calls.append(("tree", ())) return self._tree def active_app(self) -> ActiveApp | None: self.calls.append(("active_app", ())) return self._active_app def home(self) -> None: self.calls.append(("home", ())) def lock(self) -> None: self.calls.append(("lock", ())) def unlock(self) -> None: self.calls.append(("unlock", ()))