公众授权版:normal · 1000 次 · 有效期至 2026-12-31

副本编号 LY-20261007-AC63(水印指纹已嵌入)
含 README、.gitignore;排除 .DS_Store / __pycache__ / .pytest_cache
This commit is contained in:
2026-10-07 17:29:52 +08:00
commit d9da4301cd
772 changed files with 48534 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
"""端到端:subprocess 调 scripts/cast_chart.py(设计文档 §4.10 / §5)。
退出码约定:0 成功;2 输入不可用(地点/格式);3 库内部错误。
"""
import os
import subprocess
import sys
import unittest
from pathlib import Path
SKILL_ROOT = Path(__file__).resolve().parents[1]
SCRIPTS_DIR = SKILL_ROOT / "scripts"
CAST_CHART = SCRIPTS_DIR / "cast_chart.py"
def run_cast(*args):
env = dict(os.environ)
env["PYTHONPATH"] = str(SCRIPTS_DIR) + os.pathsep + env.get("PYTHONPATH", "")
return subprocess.run(
[sys.executable, str(CAST_CHART), *args],
cwd=str(SCRIPTS_DIR),
env=env,
capture_output=True,
text=True,
timeout=120,
)
class CastChartE2ETest(unittest.TestCase):
def test_chengdu_morning_chart(self):
"""张三 男 1990-05-14 08:30 四川省成都市 → 正常出盘(巳月辛巳)。"""
r = run_cast(
"--name", "张三", "--gender", "男",
"--birth", "1990-05-14 08:30", "--place", "四川省成都市",
)
self.assertEqual(r.returncode, 0, f"stderr:\n{r.stderr}")
for marker in ("## 四柱", "## 大运", "## 排盘审计", "辛巳"):
self.assertIn(marker, r.stdout)
def test_beijing_late_zi_hint(self):
"""李四 女 1990-01-15 23:30 北京市 → 真太阳时约 23:06,须含晚子时提示。
取 1 月而非 6 月:1990 年北京处于夏令时,6 月的钟表 23:30 会被拉回 22 点。
"""
r = run_cast(
"--name", "李四", "--gender", "女",
"--birth", "1990-01-15 23:30", "--place", "北京市",
)
self.assertEqual(r.returncode, 0, f"stderr:\n{r.stderr}")
self.assertIn("晚子时", r.stdout)
def test_unresolvable_place_exit_2(self):
"""王五 男 1990-01-01 12:00 火星 → LocationError,退出码 2。"""
r = run_cast(
"--name", "王五", "--gender", "男",
"--birth", "1990-01-01 12:00", "--place", "火星",
)
self.assertEqual(r.returncode, 2,
f"stdout:\n{r.stdout}\nstderr:\n{r.stderr}")
self.assertIn("ERROR", r.stderr)
if __name__ == "__main__":
unittest.main()