# -*- coding: utf-8 -*- """测试辅助:无界面替身,用于在桌面环境验证协议逻辑。""" from __future__ import annotations import sys import threading from pathlib import Path _WINDOWS_DIR = Path(__file__).resolve().parent.parent / "windows" if str(_WINDOWS_DIR) not in sys.path: sys.path.insert(0, str(_WINDOWS_DIR)) from lanremote.actions import Actions # noqa: E402 class StubUI: """只记录调用,不弹窗、不显示图片。""" def __init__(self): self.logs: list[str] = [] self.notifications: list[str] = [] self.images: list[str] = [] self.audio: list[str] = [] self.clipboard = "" self.screen_indicator = False # 屏幕共享可见提示是否显示 self.screen_flashed = False # 截屏时是否闪过提示 def log(self, text): self.logs.append(text) def notify(self, title, text): self.notifications.append(f"{title}|{text}") def on_state_changed(self): pass def screen_size(self): return (1920, 1080) def ui_call(self, fn, timeout=8.0): return fn() def set_screen_sharing(self, active): self.screen_indicator = bool(active) def flash_screen_indicator(self, seconds=2.5): self.screen_flashed = True def make_stub_actions(ui: StubUI, store) -> Actions: """构造 Actions,把依赖界面/多媒体的部分替换为记录。""" acts = Actions.__new__(Actions) acts.ui = ui acts.store = store acts._audio_alias = None acts._image_window = None acts._lock = threading.RLock() # 签名要和真实 Actions.show_image(path, title="") 对齐 acts.show_image = lambda path, title="": (ui.images.append(Path(path).name), f"已显示 {Path(path).name}")[1] acts.play_audio = lambda path: (ui.audio.append(Path(path).name), f"正在播放 {Path(path).name}")[1] def clip_set(text): ui.clipboard = text return f"剪贴板已更新({len(text)} 字符)" acts.clip_set = clip_set acts.clip_get = lambda: ui.clipboard acts.stop_audio = lambda: "已停止" return acts