# -*- coding: utf-8 -*- """给 Java 客户端测试加一段:直接调用户说"连不上"的那几条命令。 目的:判定问题在**客户端协议层**还是**界面**。 JavaClientTest 用的就是 App 里那个 RemoteClient,所以它的结果直接说明问题。 """ from __future__ import annotations import sys from pathlib import Path TEST = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\_tests\java" r"\JavaClientTest.java") ANCHOR = ' section("13. 屏幕镜像 / 截屏");' BLOCK = ''' // ---------------- 12. 功能页 / 语音页 ---------------- section("12. 功能页 / 语音页(用户报"连不上"的那几个)"); try { long t0 = System.currentTimeMillis(); Map featureReply = session.call(Json.obj("cmd", "feature_list"), 25000); long cost = System.currentTimeMillis() - t0; java.util.List features = Json.list(featureReply, "features"); check("feature_list 返回 ok", Json.bool(featureReply, "ok", false), Json.str(featureReply, "error", "(无 error 字段)") + " 耗时 " + cost + "ms"); check("feature_list 功能数 > 100", features.size() > 100, features.size() + " 个,耗时 " + cost + "ms"); if (!features.isEmpty() && features.get(0) instanceof Map) { @SuppressWarnings("unchecked") Map first = (Map) features.get(0); check("功能项带 name/label/group", Json.str(first, "name", "").length() > 0 && Json.str(first, "label", "").length() > 0 && Json.str(first, "group", "").length() > 0, String.valueOf(first)); } long t1 = System.currentTimeMillis(); Map voiceReply = session.call(Json.obj("cmd", "voice_list"), 25000); java.util.List voices = Json.list(voiceReply, "names"); check("voice_list 返回 ok", Json.bool(voiceReply, "ok", false), Json.str(voiceReply, "error", "") + " 耗时 " + (System.currentTimeMillis() - t1) + "ms"); check("voice_list 有音色", voices.size() > 0, voices.size() + " 个"); long t2 = System.currentTimeMillis(); Map audioReply = session.call(Json.obj("cmd", "audio_list"), 25000); check("audio_list 返回 ok", Json.bool(audioReply, "ok", false), Json.str(audioReply, "error", "") + " 耗时 " + (System.currentTimeMillis() - t2) + "ms"); long t3 = System.currentTimeMillis(); Map sayReply = session.call(Json.obj("cmd", "say", "text", "测试"), 25000); check("say 返回 ok", Json.bool(sayReply, "ok", false), Json.str(sayReply, "error", "") + " 耗时 " + (System.currentTimeMillis() - t3) + "ms"); long t4 = System.currentTimeMillis(); Map runReply = session.call( Json.obj("cmd", "feature_run", "name", "world_clock", "params", Json.obj()), 25000); check("feature_run 返回 ok", Json.bool(runReply, "ok", false), Json.str(runReply, "error", "") + " 耗时 " + (System.currentTimeMillis() - t4) + "ms"); } catch (Exception e) { check("功能页/语音页命令能调用", false, String.valueOf(e)); } ''' + ANCHOR def main() -> int: text = TEST.read_text(encoding="utf-8") if "功能页 / 语音页" in text: print(" 已经加过") return 0 if ANCHOR not in text: print(" [失败] 锚点没找到") return 1 # 注意:Java 字符串里的中文引号要用全角,避免转义问题 block = BLOCK.replace('用户报"连不上"的那几个', '用户报连不上的那几个') text = text.replace(ANCHOR, block, 1) TEST.write_text(text, encoding="utf-8") print(" 已插入「功能页 / 语音页」测试段") return 0 if __name__ == "__main__": sys.exit(main())