103 lines
2.8 KiB
Python
103 lines
2.8 KiB
Python
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 = """
|
|
<AppiumAUT x="0" y="0" width="10" height="20">
|
|
<XCUIElementTypeButton name="Search" label="Search" x="1" y="2" width="4" height="4" />
|
|
<XCUIElementTypeImage name="Settings" label="Settings" x="6" y="2" width="3" height="3" />
|
|
</AppiumAUT>
|
|
"""
|
|
|
|
|
|
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", ()))
|