tools/tdc_collectgen.py: 静态导出槽位序 -> 按 #36 规则算「项->槽」-> 重排 -> 该构建密钥加密。 同一构建实测: 37 项 -> 38 槽, 明文 686B / collect 920 字符, 解密回环逐字节一致。 规则修正(重要): * kind=1 的串只按**括号外**逗号切槽 —— '[]'/'[360,360]'/'["zh-CN","zh"]' 内逗号不构成新槽 * kind=2 的项**仍产出 1 槽**(r3 清空转存 r4, r4 在收尾 @4905 拼回) 新增 tcaptcha/tests/test_collectgen.py (已并入 selftest) 与 fixture: outer_commas / 槽数推算 == 真机槽数 / 重排是置换 / 加解密回环 / 不匹配必须报错。 账本新增已知 #37(工具链跑通) 与 #38(纯离线生成尚未打通, 诚实标注)。
43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
一键复验入口 (AGENTS.md §1.4 / §5.9)
|
|
|
|
.venv/bin/python -m tcaptcha.selftest
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SUITES = [
|
|
"tcaptcha.tests.test_crypto_core",
|
|
"tcaptcha.tests.test_glyph_solver",
|
|
"tcaptcha.tests.test_icon_click_solver",
|
|
"tcaptcha.tests.test_slider_solver",
|
|
"tcaptcha.tests.test_collectgen",
|
|
"tcaptcha.tests.test_xtea_key",
|
|
"tcaptcha.tests.test_tdc_key",
|
|
]
|
|
|
|
|
|
def main() -> int:
|
|
failed = []
|
|
for mod in SUITES:
|
|
print(f"\n{'=' * 62}\n>>> {mod}\n{'=' * 62}")
|
|
rc = subprocess.run([sys.executable, "-m", mod], cwd=str(ROOT),
|
|
env={**__import__("os").environ, "PYTHONPATH": str(ROOT)}).returncode
|
|
if rc != 0:
|
|
failed.append(mod)
|
|
print(f"\n{'=' * 62}")
|
|
if failed:
|
|
print(f"❌ selftest 失败: {failed}")
|
|
return 1
|
|
print("✅ selftest 全部通过")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|