feat: complete heaven readings and screener publication

This commit is contained in:
leefer
2026-08-05 23:44:17 +08:00
parent 6a058c2929
commit b3a21d05b7
34 changed files with 3538 additions and 225 deletions
+84
View File
@@ -0,0 +1,84 @@
from __future__ import annotations
import unittest
from backend.features.heaven.six_yao import (
_palace_map,
build_six_yao_chart,
)
class SixYaoEngineTests(unittest.TestCase):
def test_eight_palaces_cover_every_hexagram_once(self):
palaces = _palace_map()
self.assertEqual(len(palaces), 64)
self.assertEqual(
{item["trigram"] for item in palaces.values()},
{"", "", "", "", "", "", "", ""},
)
self.assertEqual(
{item["stage"] for item in palaces.values()},
{"本宫", "一世", "二世", "三世", "四世", "五世", "游魂", "归魂"},
)
def test_pure_qian_uses_standard_najia_and_self_response(self):
chart = build_six_yao_chart(
[7, 7, 7, 7, 7, 7],
"2026-08-04T10:30:00+08:00",
)
self.assertEqual(chart["palace"]["name"], "乾宫")
self.assertEqual(chart["palace"]["stage"], "本宫")
self.assertEqual(chart["palace"]["self_position"], 6)
self.assertEqual(chart["palace"]["response_position"], 3)
self.assertEqual(
[(line["stem"], line["branch"]) for line in chart["lines"]],
[("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", "")],
)
self.assertEqual(
[line["relative"] for line in chart["lines"]],
["子孙", "妻财", "父母", "官鬼", "兄弟", "父母"],
)
self.assertEqual(chart["branch_pattern"], "六冲")
def test_pure_kun_uses_standard_najia(self):
chart = build_six_yao_chart(
[8, 8, 8, 8, 8, 8],
"2026-08-04T10:30:00+08:00",
)
self.assertEqual(chart["palace"]["name"], "坤宫")
self.assertEqual(
[(line["stem"], line["branch"]) for line in chart["lines"]],
[("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", "")],
)
def test_cast_time_drives_day_void_and_six_spirits(self):
chart = build_six_yao_chart(
[7, 7, 7, 7, 7, 7],
"2026-08-04T02:30:00Z",
)
self.assertEqual(chart["cast_at"], "2026-08-04T10:30:00+08:00")
self.assertEqual(chart["calendar"]["day"], "庚戌")
self.assertEqual(chart["calendar"]["day_void"], "寅卯")
self.assertEqual(
[line["spirit"] for line in chart["lines"]],
["白虎", "玄武", "青龙", "朱雀", "勾陈", "螣蛇"],
)
def test_moving_line_has_deterministic_transformation(self):
chart = build_six_yao_chart(
[6, 7, 8, 9, 7, 8],
"2026-08-04T10:30:00+08:00",
)
moving = [line for line in chart["lines"] if line["moving"]]
self.assertEqual([line["position"] for line in moving], [1, 4])
self.assertTrue(all(line.get("transformation") for line in moving))
self.assertFalse(any(line.get("transformation") for line in chart["lines"] if not line["moving"]))
if __name__ == "__main__":
unittest.main()